通缉:在编译器的上下文中对“降低”一词的良好定义

时间:2013-11-27 20:52:47

标签: compiler-construction terminology

有人能指出我在编译器环境中对“降低”这个术语的一个很好的定义吗?

据我所知,这是将更高级别的操作转换为等级组合的低级操作,但我不太确定,我在搜索几分钟后找不到一个在谷歌上。 (有一些“降低”的用法,例如GCCLLVM,但没有引用定义。)

3 个答案:

答案 0 :(得分:19)

博士。 Dobbs刚刚发表了an article by Walter Bright(dlang fame),在那里他提到了这个词:

  

降低

     

后见之明显而易见的一种语义技术(但让Andrei Alexandrescu向我指出)被称为“降低”。它包含在内部,用更简单的语义构造重写更复杂的语义结构。例如,while循环和foreach循环可以根据for循环重写。然后,其余代码只需要处理for循环。结果发现了在D中实现while循环的几个潜在错误,所以这是一个不错的胜利。它还用于根据scope guard语句等重写try-finally语句。在语义处理中可以找到的所有情况都将为实现赢得胜利。

     

如果事实证明在语言中存在一些阻止这种“降低”重写的特殊情况规则,那么回过头来重新审视语言设计可能是个好主意。

     

任何时候你都可以找到处理语义结构的共性,这是一个减少实现工作量和错误的机会。

答案 1 :(得分:6)

我找不到与定义的良好联系,但我想我可以举一个很好的例子。在LLVM中,LLVM IR支持多种大小的整数。大多数C / C ++编译器(包括clang)支持long long和64 bit数据类型。许多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

一些降低可能会非常花哨。例如,在不支持乘法指令的处理器上,简单乘法可能会变为移位并添加,而更复杂的乘法可能会变成对运行时支持库的调用。

答案 2 :(得分:2)

龙书不使用该术语。 Kennedy + Allen 优化现代架构编译器基于依赖性的方法不使用该术语。 Steve Muchnick的高级编译器设计和实现并没有使用该术语。

工程编译器使用该术语但不定义它。 Bob Morgan的构建优化编译器(1998)使用了很多术语并对其进行了定义。

  

降低:降低指令,使每个操作都在   流程图表示目标机器中的单个指令。