3

我有一个用 LLVM 和 C++ 实现的玩具解释器(通过步行 AST 生成 LLVM IR 并使用 JIT 运行,基于 Perl 的语言,内置数据结构和函数)。现在我想将它扩展为可编译的,生成程序集使用gas和ld编写代码并获得可执行文件。

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

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

4

1 回答 1

5

您可以通过遍历 AST 并生成完成被访问的 AST 节点所暗示的工作的机器指令来为许多过程语言构建汇编代码。通常人们会为此任务采用表达式评估的下推堆栈模型,因为以这种方式完成的代码生成器不够智能,无法有效地分配寄存器。但是,您可以通过这种方式获得有效的汇编代码。

不要指望这会给你带来好的代码。但是您可能会非常快速地构建一个。(预计必须生成一些令人作呕的汇编程序,例如“push X, push Y, pop EAX, pop EDX, add EAX,EDX, push EAX”)

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

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

于 2014-01-15T17:40:58.783 回答