0

我尝试构建一个小型编译器,并完成了 Lexer 和 Parser。现在我需要创建汇编代码生成器的一部分。所以我有一些问题!

实际上我可以很好地C并且我为这个任务学习了 NASM 汇编。现在我可以使用 NASM 制作一些程序。但我不明白如何为编译器实现汇编,我的意思是汇编生成部分。

  • 我需要精通汇编语言吗?
  • 或者有这方面的教程吗?(编译器开发<->实现汇编)

谢谢你^-^

4

1 回答 1

2

下一步取决于设计目标、​​正在编译的程序的当前格式以及原始语言。

解析之后,正在编译的程序的格式可能是某种抽象语法树,仅此而已。如果是这种情况,那么您将需要为各种目的生成表 - 例如,可能是一个类型表来跟踪任何用户定义类型(以及结构和类?)的名称和定义;和一个符号表来跟踪函数/方法和变量的名称、限定符(“const”、“final”、“volatile”等)和类型。

请注意,这可能会因一些语言功能而变得复杂 - 名称空间(您希望符号表中的“完全限定名称”不仅仅是短名称)和任何重载(例如,函数重载,符号表中的条目需要装饰有信息,如输入和输出参数类型,需要区分具有相同名称的不同条目)。

一旦你有了相关的表格;您可能可以直接从“抽象语法树+表”生成汇编语言(或更好的原始机器代码)。更多时候你会优化和简化抽象语法树的内容,然后将抽象语法树转换成另一种中间形式(例如静态单一赋值),这样它可以被优化很多,然后转换成另一种较低级别的中间形式,即更接近目标机器的指令,然后进行更多优化(寄存器分配,窥视孔,指令调度),然后将其转换为最终的汇编语言(或原始机器代码)。

我需要精通汇编语言吗?

您需要对汇编语言有基本的了解(甚至只是为了直观地检查编译器的输出是否是对原始源代码的正确翻译)。根据您想要优化的程度以及您计划如何优化,您可能需要也可能不需要非常精通汇编语言。

或者有这方面的教程吗?

总有一个教程(例如,由一个无知的人和/或基本介绍信息一起拍打的狡猾的废话)。

我不知道是否有一个好的教程,但我怀疑它是否可能。涵盖所有内容(所有不同的源语言和语言特征、所有不同的目标语言、所有可能的不同技术等)需要太多的信息;所以任何“好的教程”都会很大,以至于它会变成完整的书(而不是教程)。

于 2020-11-18T08:52:33.657 回答