编译器开发的汇编语言
Assembly Language for Compiler Development
我尝试构建一个小型编译器,并完成了 Lexer 和 Parser。现在我需要创建 Assembly Code Generator 的一部分。所以我有一些问题!
实际上我可以 C 并且我为了这个任务学习了 NASM 汇编。现在我可以使用 NASM 制作一些程序。但是我不明白如何为编译器实现汇编,我的意思是汇编生成部分。
- 我需要精通汇编语言吗?
- 或者有这方面的教程吗? (编译器开发 <-> 实现汇编)
谢谢^-^
下一步取决于设计目标、正在编译的程序的当前格式以及原始语言。
解析后,正在编译的程序的格式可能是某种抽象语法树,除此之外别无其他。如果是这种情况,那么您将需要为各种目的生成 tables - 例如也许是一个类型 table 来跟踪名称和任何用户定义类型的定义(以及结构和 类?);和一个符号 table 来跟踪 functions/methods 和变量的名称、限定符(“const”、“final”、“volatile”等)和类型。
请注意,这可能会因一些语言特性而变得复杂 - 名称空间(您希望符号 table 中的“完全限定名称”而不仅仅是短名称)和任何重载(例如函数重载,其中符号 table 中的条目需要用信息修饰,例如输入和输出参数类型,需要区分具有相同名称的不同条目)。
一旦你有相关的 table;您可能可以直接从“抽象语法树 + tables”生成汇编语言(或更好的原始机器代码)。更多时候,你会优化和简化抽象语法树的内容,然后将抽象语法树转换成另一种中间形式(例如静态单一赋值),这样它就可以得到更多优化,然后转换成另一种较低级别的中间形式,即更接近目标机器的指令,然后做更多优化(寄存器分配、窥孔、指令调度),然后将其转换为最终的汇编语言(或原始机器代码)。
Do I need to be an Assembly Language proficient for that?
您需要对汇编语言有基本的了解(即使只是目视检查编译器的输出是否正确翻译了原始源代码)。根据您想要优化的程度和您计划优化的方式,您可能需要也可能不需要非常精通汇编语言。
Or are there tutorials for that?
总有一个教程(例如,由一个无知的人拼凑的狡猾的废话 and/or 基本介绍信息)。
我不知道是否有好的教程,但我怀疑是否可行。涵盖所有内容(所有不同的源语言和语言特性、所有不同的目标语言、所有可能的不同技术等)需要太多的信息;所以任何“好的教程”都会变得非常庞大 book/s(而不是教程)。
我尝试构建一个小型编译器,并完成了 Lexer 和 Parser。现在我需要创建 Assembly Code Generator 的一部分。所以我有一些问题!
实际上我可以 C 并且我为了这个任务学习了 NASM 汇编。现在我可以使用 NASM 制作一些程序。但是我不明白如何为编译器实现汇编,我的意思是汇编生成部分。
- 我需要精通汇编语言吗?
- 或者有这方面的教程吗? (编译器开发 <-> 实现汇编)
谢谢^-^
下一步取决于设计目标、正在编译的程序的当前格式以及原始语言。
解析后,正在编译的程序的格式可能是某种抽象语法树,除此之外别无其他。如果是这种情况,那么您将需要为各种目的生成 tables - 例如也许是一个类型 table 来跟踪名称和任何用户定义类型的定义(以及结构和 类?);和一个符号 table 来跟踪 functions/methods 和变量的名称、限定符(“const”、“final”、“volatile”等)和类型。
请注意,这可能会因一些语言特性而变得复杂 - 名称空间(您希望符号 table 中的“完全限定名称”而不仅仅是短名称)和任何重载(例如函数重载,其中符号 table 中的条目需要用信息修饰,例如输入和输出参数类型,需要区分具有相同名称的不同条目)。
一旦你有相关的 table;您可能可以直接从“抽象语法树 + tables”生成汇编语言(或更好的原始机器代码)。更多时候,你会优化和简化抽象语法树的内容,然后将抽象语法树转换成另一种中间形式(例如静态单一赋值),这样它就可以得到更多优化,然后转换成另一种较低级别的中间形式,即更接近目标机器的指令,然后做更多优化(寄存器分配、窥孔、指令调度),然后将其转换为最终的汇编语言(或原始机器代码)。
Do I need to be an Assembly Language proficient for that?
您需要对汇编语言有基本的了解(即使只是目视检查编译器的输出是否正确翻译了原始源代码)。根据您想要优化的程度和您计划优化的方式,您可能需要也可能不需要非常精通汇编语言。
Or are there tutorials for that?
总有一个教程(例如,由一个无知的人拼凑的狡猾的废话 and/or 基本介绍信息)。
我不知道是否有好的教程,但我怀疑是否可行。涵盖所有内容(所有不同的源语言和语言特性、所有不同的目标语言、所有可能的不同技术等)需要太多的信息;所以任何“好的教程”都会变得非常庞大 book/s(而不是教程)。