编译器代码优化:AST vs. IR

gno*_*ule 6 compiler-construction optimization abstract-syntax-tree

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

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

(a) 对吗?

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

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

use*_*421 4

(一)是的。

(b) 常量折叠是一个例子;CSE 是另一个;事实上几乎所有事情都与表达式求值有关。IR 相优化更多的是关于流量分析的结果。

  • 在表达式树级别上进行适当的常量折叠非常困难。SSA 更适合它。通过 SSA,您仍然可以免费获得所有表达式,以及适当的流程信息。你必须与 DCE 结合进行不断的折叠,否则它不会完整,并且 DCE 在 SSA 之上更容易完成。 (2认同)