c语言 - 为什么大多数编译器使用 AST,而是直接生成 IR?



我听说大多数编译器都使用AST,然后将其转换为IR(中间表示)。

但我认为编译器可以直接生成IR,例如 C4 项目。

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

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

你能给我一些建议吗?谢谢你的时间。

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

一个恰当的例子 -if陈述。您有两种形式 - 一种只有true分支,另一种同时具有truefalse分支。前者是后者的特例,因此对 AST 进行传递是有意义的,将所有单臂if语句替换为带有虚拟false分支的 2 臂语句。然后,您的IR生成过程将只需要处理一种if

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

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

最新更新