Assembly 是否可以直接从格式良好的AST生成汇编代码而不转换为IR? 我有一个LLVM+C++的玩具解释器(通过步行AST生成LLVM IR,用JIT运行,基于Perl语言,内置数据结构和功能)。现在我想把它扩展成可编译的一个,生成汇编代码,用GAS和LD执行可执行文件。p>

Assembly 是否可以直接从格式良好的AST生成汇编代码而不转换为IR? 我有一个LLVM+C++的玩具解释器(通过步行AST生成LLVM IR,用JIT运行,基于Perl语言,内置数据结构和功能)。现在我想把它扩展成可编译的一个,生成汇编代码,用GAS和LD执行可执行文件。p>,assembly,compiler-construction,llvm-ir,Assembly,Compiler Construction,Llvm Ir,如果我想要的只是一个可运行的编译器,它在没有复杂优化的情况下创建一个“刚刚正确”的elf可执行文件,那么我必须像RTL那样将AST翻译成IR或类似的东西吗?或者在句法分析阶段有其他选择而不是构建AST 顺便问一下,我想知道在像lcc或tcc这样的小型编译器中,“IR”和“目标代码”是什么“是吗?通过遍历AST并生成完成所访问的AST节点所隐含工作的机器指令,您可以为许多程序语言构建汇编代码。通常,对于此任务,采用表达式求值的下推堆栈模型,因为这样做的代码生成器不够智能,无法分配有效地注册。但是,

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


顺便问一下,我想知道在像lcc或tcc这样的小型编译器中,“IR”和“目标代码”是什么“是吗?

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

不要指望这会让你得到好的代码。但是你可能会很快地构建一个这样的代码。(可能会生成一些讨厌的汇编程序,例如,“push X,push Y,pop-EAX,pop-EDX,add-EAX,EDX,push-EAX”)

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


如果您以前没有构建过编译器,那么这样做是一种很好的体验。您可以很快地获得一个可以工作的编译器,并且您可以了解到很多关于为什么真正的编译器使用IRs来实现代码优化的知识。

您有什么理由不想为此使用LLVM吗?既然您已经生成了LLVM IR,那么让LLVM生成asse是不费吹灰之力的mbly/对象文件,除非您需要一些运行时支持。