是否可以直接从格式良好的AST生成汇编代码,而无需转换为IR



我有一个用LLVM&C++(通过遍历AST生成LLVM IR并使用JIT运行,JIT是基于Perl的语言,具有内置的数据结构和函数)。现在我想将其扩展为可编译的,生成汇编代码并使用gas和ld获得可执行文件。

如果我想要的只是一个可运行的编译器,它可以在没有复杂优化的情况下创建"just CORRECT"elf可执行文件,那么我必须像RTL或类似的东西一样将AST转换为IR吗?或者在句法分析阶段有其他选择而不是构建AST?

顺便说一句,我想知道在像lcc或tcc这样的小型编译器中,它的"IR"one_answers"目标代码"是什么?

通过遍历AST并生成机器指令来完成所访问的AST节点所隐含的工作,可以为许多过程语言构建汇编代码。通常,对于这项任务,我们采用表达式求值的下推堆栈模型,因为这样做的代码生成器不够聪明,无法有效地分配寄存器。但是,您可以通过这种方式获得可工作的汇编代码。

不要指望这会给你带来好的代码。但你很可能很快就能造出来。(预计必须生成一些恶心的汇编程序,例如,"推X,推Y,弹出EAX,弹出EDX,添加EAX,EDX,推EAX")

您可能需要建立符号表,其中至少包含有关声明变量类型的信息。在将"push I"生成为机器指令之前,您确实需要知道整数中的"I"。(浮点值和字符串需要生成不同的代码)。

如果您以前没有构建过编译器,那么以这种方式进行编译是一种很好的体验。你很快就能得到一个有效的编译器,并且你学到了很多关于为什么真正的编译器使用IRs来实现代码优化的知识。

最新更新