Dr. Dobbs刚刚发布了dlang名人沃尔特·布赖特的一篇文章,其中提到了这个术语:
一种在事后看来很显然的语义技巧(但需要Andrei Alexandrescu指出)被称为“降低”。它包括,内部地,用更简单的构造重新编写更复杂的语义构造。例如,while
循环和foreach
循环可以重写成for
循环。然后,剩下的代码只需处理for
循环。这个技巧发现了D语言中while循环实现中潜在的几个bug,所以是一个不错的胜利。它也被用于将scope guard
语句用try-finally
语句重写等。每次在语义处理中发现此类情况都会对实现带来好处。
如果发现语言中有一些特殊规则阻止了这种"降低"重写,回头重新审视语言设计可能是个好主意。
任何时候,如果能够找到语义构造的共性,就是减少实现工作量和bug的机会。
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。
compare the upper 32 bits with a signed comparison
if they are equal, compare the lower 32 bits with an unsigned comparison
降低复杂度的方法有很多种。例如,在不支持乘法指令的处理器上,简单的乘法可能会转化为移位和加法,而更复杂的乘法可能会变成对运行时支持库的调用。
*2
=><< 1
。 - user207421