在编译器的上下文中,“lowering”这个术语的良好定义是什么?

35

有人能给我指出编译器上下文中术语“lowering”的好定义吗?

据我所知,它是将高级操作翻译成等效的低级操作组合,但我不太确定,在谷歌上搜索几分钟后也找不到一个定义。(例如在GCCLLVM中有一些“lowering”的用法,但没有定义的参考。)


这不是叫做“缩减”吗?或者在语法定义中可能是这样称呼的,我记不清了。 - slugster
相当模糊。这就是整个编译器的作用。我会称特定的例子为“强度降低”,例如 *2 => << 1 - user207421
3个回答

30

Dr. Dobbs刚刚发布了dlang名人沃尔特·布赖特的一篇文章,其中提到了这个术语:

降低

一种在事后看来很显然的语义技巧(但需要Andrei Alexandrescu指出)被称为“降低”。它包括,内部地,用更简单的构造重新编写更复杂的语义构造。例如,while循环和foreach循环可以重写成for循环。然后,剩下的代码只需处理for循环。这个技巧发现了D语言中while循环实现中潜在的几个bug,所以是一个不错的胜利。它也被用于将scope guard语句用try-finally语句重写等。每次在语义处理中发现此类情况都会对实现带来好处。

如果发现语言中有一些特殊规则阻止了这种"降低"重写,回头重新审视语言设计可能是个好主意。

任何时候,如果能够找到语义构造的共性,就是减少实现工作量和bug的机会。


11

The Dragon Book没有使用这个术语。Kennedy+Allen的Optimizing Compilers for Modern Architectures A Dependence-based Approach也没有使用这个术语。Steve Muchnick的Advanced Compiler Design and Implementation也没有使用这个术语。

Engineering A Compiler使用了这个术语,但没有定义它。Bob Morgan的Building an Optimizing Compiler (1998) 经常使用这个术语并给出了定义。

Lowering:将指令降级,使得流图中的每个操作都表示目标机器中的单个指令。

这是一个更通用的术语,没有一个单一的定义。我个人理解编译器将一个操作从较高的抽象层次降到较低层次,例如,在LLVM中将MachineInstr降到MCInst。


10
我找不到一个好的定义链接,但我认为我可以给出一个很好的例子。在LLVM中,LLVM IR支持多种大小的整数。大多数C/C++编译器,包括clang,支持long long和64位数据类型。许多32位处理器,如mips(32位),没有可以执行例如64位加法或比较的指令。LLVM将“降低”这些64位操作为通常由处理器执行的32位操作。
例如,在int64_t比较的情况下,LLVM将其降低为:
compare the upper 32 bits with a signed comparison
if they are equal, compare the lower 32 bits with an unsigned comparison

降低复杂度的方法有很多种。例如,在不支持乘法指令的处理器上,简单的乘法可能会转化为移位和加法,而更复杂的乘法可能会变成对运行时支持库的调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接