【问题标题】:Why most compilers use AST, instead generate IR directly?为什么大多数编译器使用 AST,而不是直接生成 IR?
【发布时间】:2020-03-26 15:25:54
【问题描述】:

听说大部分编译器使用AST,然后翻译成IR(中间表示)。

但我认为编译器可以直接生成IR,比如C4 project

如果我使用 AST,当我完成语法分析和语义分析时,我必须从头扫描 AST 以生成 IR。这是一个额外的步骤,所以我认为它很慢。

使用 AST 有什么好处?更好的可读性还是更好的可移植性?

你能给我一些建议吗?感谢您的宝贵时间。

【问题讨论】:

  • 至少它是编译过程各个阶段的解耦,允许多个团队一起工作并降低复杂性。它还可以帮助在多个平台上使用编译器,使用各种后端阶段的多个版本。

标签: c compiler-construction compiler-optimization abstract-syntax-tree


【解决方案1】:

您可能需要多个 AST。您的第一个 AST,由解析器生成的,可能充满了多余的东西,包括使您的源语言易于使用的所有语法糖。在开始生成 IR 之前,您需要删除这种冗余,否则您的代码生成步骤将成为重复的样板。

一个恰当的例子 - if 声明。它有两种形式——一种只有true 分支,另一种同时具有truefalse 分支。前者是后者的一个特例,所以对你的 AST 做一个传递是有意义的,用一个虚拟的 false 分支替换所有单臂的 if 语句。那么您的 IR 生成过程将只需要处理一种if

另一个重要的考虑因素是打字。对于绝大多数类型系统来说,在树上做比在一些平面 IR 上更容易。

另外,将您的平面 IR 视为 AST 的另一种形式,并以同样的方式对待它。以小步骤将复杂的 AST 转换为一些低级和简单的后端 AST(或 IR,随便你怎么称呼)比在一个巨大的样板通道中完成所有事情要容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多