我有一个LLVM& amp;的玩具翻译工具。 C ++(通过行走AST生成LLVM IR并使用JIT运行,基于Perl的语言,具有内置数据结构和函数)。现在我想将它扩展为可编译的,生成汇编代码并使用gas和ld获取可执行文件。
如果我想要的只是一个可运行的编译器,它可以创建一个“JUST CORRECT”elf可执行文件而无需复杂的优化,那么我是否必须将AST转换为IR,如RTL或类似的东西?或者在句法分析阶段有替代选择而不是建立AST?
顺便说一句,我想知道在像lcc或tcc这样的小编译器中,它的“IR”和“目标代码”是什么?
答案 0 :(得分:5)
您可以通过遍历AST并生成机器指令来构建许多程序语言的汇编代码,这些指令可以完成被访问的AST节点所隐含的工作。通常,对此任务采用表达式评估的下推堆栈模型,因为以这种方式完成的代码生成器不够智能,无法有效地分配寄存器。但是,您可以通过这种方式获得汇编代码。
不要指望这会让你获得好的代码。但是你可以很快地构建一个。 (期望必须生成一些恶心的汇编程序,例如“推X,推Y,弹出EAX,弹出EDX,添加EAX,EDX,推EAX”)
您可能需要构建符号表,至少包含有关所声明变量类型的信息。在生成“push I”作为机器指令之前,你真的需要知道整数中的“I”。 (浮点值和字符串需要生成不同的代码)。
如果您之前没有构建过编译器,那么这样做就是一种很棒的体验。您可以非常快速地获得有效的编译器,并且您可以了解真正的编译器使用IR来实现代码优化的原因。