Assembly 用于编译器开发的汇编语言

Assembly 用于编译器开发的汇编语言,assembly,compiler-construction,nasm,compiler-development,Assembly,Compiler Construction,Nasm,Compiler Development,我尝试构建一个小型编译器,完成了Lexer和Parser。现在我需要创建汇编代码生成器。所以我有一些问题 事实上,我能很好地理解C,并且我为这项任务学习了NASM组装。现在我可以用NASM制作一些程序了。但我不明白如何为编译器实现汇编,我指的是汇编生成部分 我需要精通汇编语言吗 或者有关于这方面的教程吗?(编译器开发实现程序集) 谢谢^-^下一步取决于设计目标、正在编译的程序的当前格式以及原始语言 解析之后,正在编译的程序的格式可能是某种抽象语法树,而不是其他什么。如果是这种情况,那么您将需

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

事实上,我能很好地理解C,并且我为这项任务学习了NASM组装。现在我可以用NASM制作一些程序了。但我不明白如何为编译器实现汇编,我指的是汇编生成部分

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

谢谢^-^

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

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

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

一旦你有了相关的表,你就可以直接从“抽象语法树+表”生成汇编语言(或者更好的是,原始机器代码)。通常你会优化和简化抽象语法树的内容,然后将抽象语法树转换成另一种中间形式(例如静态单赋值)因此,可以对其进行更多优化,然后将其转换为另一种更接近目标机器指令的低级中间形式,然后进行更多优化(寄存器分配、窥视孔、指令调度),然后将其转换为最终汇编语言(或原始机码)

我需要精通汇编语言吗

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

或者有关于这方面的教程吗

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


我不知道是否有一个好的教程,但我怀疑这是可能的。有太多的信息需要涵盖一切(所有不同的源语言和语言功能,所有不同的目标语言,所有可能的不同技术,等等);所以任何“好的教程”将是如此之大,以至于它已经成为一本成熟的书(而不是教程)。

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

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

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

一旦你有了相关的表,你就可以直接从“抽象语法树+表”生成汇编语言(或者更好的是,原始机器代码)。通常你会优化和简化抽象语法树的内容,然后将抽象语法树转换成另一种中间形式(例如静态单赋值)因此,可以对其进行更多优化,然后将其转换为另一种更接近目标机器指令的低级中间形式,然后进行更多优化(寄存器分配、窥视孔、指令调度),然后将其转换为最终汇编语言(或原始机码)

我需要精通汇编语言吗

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

或者有关于这方面的教程吗

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

我不知道是否有一个好的教程,但我怀疑这是可能的。有太多的信息需要涵盖一切(所有不同的源语言和语言功能,所有不同的目标语言,所有可能的不同技术,等等);所以任何“好的教程”太大了,它已经成为一本成熟的书(而不是教程)。

搜索“让我们构建一个编译器”搜索“让我们构建一个编译器”