主要是作为学习练习,我从头开始编写虚拟机,汇编器和编译器,这取决于没有任何外部工具。
我相信我对虚拟机和汇编器以及编译器的某些部分有很好的概念性了解。
这是我想知道的:
在编译器中,假设我已将源代码转换为语法树。我要经过什么过程才能将该语法树转换为程序集?
(让我们假设一些简单的语言结构,如if和while。我在这里寻求一个简单的解释。)
我对复杂的解决方案或基于现有工具的解决方案并不特别感兴趣。相反,我想要大约1页的内容,对从语法树到汇编的背后思想进行广泛的全面描述。
有人知道这样的资源吗?
谢谢 :)
最佳答案
对编译器问题的强制性响应是阅读《 Dragon》一书(《编译器:原理,技巧和工具》)。当您说您已将源代码转换成语法树时,您的意思到底是什么?通常,解析的第一步是创建抽象语法树(AST)。下一步通常是待办事项归因。属性是AST中节点的属性,这些属性不一定与源语言有关,但对于代码生成必不可少。通常,这里会执行某种形式的类型检查来确定内存大小要求,并以面向对象的语言确定要调用的函数。例如,如果源是obj1 = obj2 + obj3,则直到确定obj2的类型,您才真正知道加号的含义。
因此,试着回答您的问题。 1)将源代码解析为AST。 2)对AST进行归因。 3)生成中间代码(假设您将其称为汇编)。
《龙族》一书的第5章和第6章对此进行了详细介绍。真正棘手的部分是弄清楚代码生成所需的属性。此外,if语句还存在一些棘手的问题。例如,如果if条件失败,您就知道您需要跳过一些代码,但是至少在最初,您不知道要走多远。反向修补是解决此问题的一种方法。