我试图构建一个小型编译器,并完成了Lexer和Parser。现在我需要创建程序集代码生成器的一部分。所以我有一些问题!
事实上,我可以很好地C,并且我为这项任务学习了NASM汇编。现在我可以使用NASM制作一些程序了。但我不明白如何为编译器实现汇编,我指的是汇编生成部分。
- 我需要精通汇编语言吗
- 或者有教程吗?(编译器开发<->实现程序集(
谢谢^-^
下一步取决于设计目标、正在编译的程序的当前格式以及原始语言。
解析后,正在编译的程序的格式可能是某种抽象语法树,而不是其他格式。如果是这样的话,那么您将需要为各种目的生成表——例如,可能需要一个类型表来跟踪任何用户定义的类型(以及结构和类?(的名称和定义;以及一个符号表,用于跟踪函数/方法和变量的名称、限定符("const"、"final"、"volatile"等(以及类型。
注意,这可能会因为一些语言特性而变得复杂——名称空间(在符号表中需要"完全限定名称",而不仅仅是短名称(和任何重载(例如,函数重载,符号表中的条目需要用信息来装饰,如输入和输出参数类型,以区分具有相同名称的不同条目(。
一旦你有了相关的表格;您可能直接从"汇编语言"生成汇编语言(或更好的原始机器代码(;抽象语法树+表";。通常情况下,你会优化和简化抽象语法树的内容,然后将抽象语法树转换为另一种中间形式(例如静态单个赋值(,这样它就可以得到更多的优化,然后转换为更接近目标机器指令的另一种较低级别的中间形式,然后进行更多的优化(寄存器分配、窥视孔、指令调度(,然后将其转换为最终汇编语言(或原始机器代码(。
我需要精通汇编语言吗?
您需要对汇编语言有基本的了解(甚至只是为了直观地检查编译器的输出是否是原始源代码的正确翻译(。根据您希望优化的程度和计划优化的方式,您可能需要也可能不需要非常精通汇编语言。
或者有教程吗?
总有一个教程(例如,被一个愚蠢的人拼凑在一起的不可靠的废话和/或基本的介绍信息(。
我不知道是否有好的教程,但我怀疑它是否可能。需要太多的信息来涵盖一切(所有不同的源语言和语言功能,所有不同的目的地语言,所有可能的不同技术,等等(;所以任何";好的教程";会很大,以至于它变成了一本完整的书(而不是一本教程(。