编译器代码优化:AST与IR

时间:2014-04-06 13:14:04

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

,我将IR定义为3地址代码类型表示(我意识到它也可以表示AST表示)。

我的理解是,在为命令式语言编写最佳实践编译器时,代码优化既发生在AST上(可能最好使用访问者模式),也发生在从AST。

(a)这是正确的吗?

(b)在生成IR之前,最好在AST上处理哪种类型的优化步骤? (参考文章/在线欢迎列表,只要它处理命令性语言)

我正在研究的编译器是Decaf(有些人可能知道),它有一个相当深的CFG到(单)类继承;我将添加不属于它的功能,例如类型强制。它将完全手工编码(不使用任何工具)。这不是功课;写它是为了好玩。

3 个答案:

答案 0 :(得分:2)

(a)是。

(b)恒定折叠是一个例子; CSE是另一个;事实上几乎与表达评估有关。红外相优化更多的是流量分析的结果。

答案 1 :(得分:2)

IR是AST的一种形式(通常它是“扁平的”,但也有深度树IR),它们可能不容易区分,特别是如果编译器被实现为非常小的序列从原始AST一直重写到适合指令选择的最终IR。

优化可能发生在这个链的任何地方,但是一些表示更适合于广泛的优化,最明显的是SSA形式,大多数现代编译器使用它来进行几乎所有的优化。

答案 2 :(得分:1)

优化(拼写短语)永远不会太早。因此,在AST创建之前和期间,AST本身,IR(如果有的话)以及生成的代码上都会执行优化。在类C语言和编译为机器代码的语言中,努力进入后期阶段。在针对VM的编译器中,我认为在该阶段改进的空间较小。

一些早期的优化显然比其他优化更好。我不太了解Decaf,但有明显的事情,比如常数折叠和常数表达式评估。如果在生成任何代码之前以树形式获得整个程序,则可以找到常见的子表达式,进行代码迁移,消除死代码/死存储,提升不变量,消除尾递归和某种强度降低。

很大程度上取决于你想要的工作有多难以及你的目标是什么。你没有多说这件事。