您最喜欢的抽象语法树优化

时间:2009-12-01 10:26:22

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

如果你正在构建一个编译器,那么AST级别的优化是最好的吗?

3 个答案:

答案 0 :(得分:8)

大多数情况下,您无法在AST级别进行有趣的优化,因为您需要了解数据如何从程序的一个部分流向另一个部分。虽然数据流隐含在AST的含义中,但通过仅检查AST并不容易确定,这就是人们构建编译器和优化器构建其他程序表示的原因(包括符号表,控制流图,到达定义,数据流)和SSA表格等。)。

拥有语言解析器是分析/操作该语言的简单部分。 你需要所有其他东西来做好工作。

如果你拥有所有其他表示,你可以考虑在AST级别进行优化。大多数建立编译器的人都不打扰;它们转换为数据流表示并简单地优化它。但是,如果您想要通过更改重现源代码,则需要AST。您还需要一个prettyprinter来重新生成源代码。如果你走到这一步,你最终会得到一个源到源 程序转换系统。

DMS Software Reengineering Toolkit是一个转换AST的系统,使用所有这些其他表示来启用转换所需的分析。

答案 1 :(得分:5)

对AST(而不是CFG)最容易进行的优化是尾部调用优化:如果您看到表单的子树:

RETURN
    CALL f
        ARGS x, y, ...

您可以将其替换为f。如果f(a, b)是尾调用的函数,则替换就像:

一样简单
a = x; b = y
JUMP to root of tree

我发现将跳转表示为特殊的“重启”语句是最简单的,AST-> CFG转换将其视为返回第一个节点的边缘。跳转到其他函数有点棘手,因为您不能只设置局部变量,您需要实际考虑如何将参数传递给它们并准备在较低级别转换它。例如,AST可能需要一个特殊的节点,它可以指示稍后的传递用参数覆盖当前的堆栈帧并相应地跳转。

答案 2 :(得分:1)

在AST中应用优化的一个优点是它可以减少某些后端优化传递的执行时间。但是,我认为这些优化需要使用简约性来完成,因为您可能会妨碍代码中的进一步优化。

话虽如此,IMO在AST级或IR生成期间应用的一个简单但有趣的优化是形式(1 || 2)或(2 <3 || A)的布尔表达式的简化,等等他们净结果。我相信一些简单的窥视孔优化也可能是值得的。