我正在为自己的自定义语言编写编译器。当我正在阅读一篇关于代码优化的文章时,我注意到它假设代码的中间表示已经形成。虽然我还没有开始编写编译器的优化部分,但我一直在脑海中经历它,并且在转换为中间表示之前让优化器对语法树进行操作似乎更可取。

有没有理由更喜欢一种方法而不是另一种方法,或者主要是个人品味的问题?

例如,假设我有一个 if 像块一样

if ( some_expression ) {
    do_stuff
}

如果它可以被编译器识别, some_expression 将始终评估为true并且没有副作用,然后我可以通过修剪树来删除它的计算。

但是,如果我已经将树转换为中间表示,例如简单指令的汇编列表,那么识别和解决方案的过程将(在我的想象中,因为我还没有尝试实现这个)更加复杂。

有帮助吗?

解决方案

如今,趋势是使用中间表示进行优化。退房 LLVM 例如:

LLVM核心库提供了一个现代的独立于源和目标的优化器,以及对许多流行的Cpu(以及一些不太常见的Cpu)的代码生成支持!)这些库是围绕一个被称为LLVM中间表示("LLVM IR")的明确指定的代码表示构建的。LLVM核心库有很好的文档记录,并且特别容易发明自己的语言(或移植现有的编译器)以使用LLVM作为优化器和代码生成器。

LLVM可以提供一个与源无关的优化器,因为它只有在LLVM IR中表示后才会执行其优化传递代码。

为什么这样做会复杂得多?这取决于你的中间表示。中间表示的设计目标之一是促进各种优化,而不是使它们不必要地复杂。查看LLVM可以在LLVM IR上实现的所有优化,例如,在以下内容中 分析和变换传递列表。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top