【问题标题】:Is it possible to generate assembly code directly from a well-formed AST without translate to IR?是否可以直接从格式良好的 AST 生成汇编代码而不转换为 IR?
【发布时间】:2014-03-28 06:08:44
【问题描述】:

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

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

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

【问题讨论】:

  • 您有什么理由不想为此使用 LLVM?由于您已经生成 LLVM IR,因此让 LLVM 从中生成程序集/目标文件是零努力......除非您需要一些运行时支持。

标签: assembly compiler-construction llvm-ir


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2014-06-06
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多