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

Jas*_*n S 18 compiler-construction terminology

任何人都能指出我在编译器环境中对"降低"这个术语的一个很好的定义吗?

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

Jas*_*n S 20

Dobbs博士刚刚发表了Walter Bright(dlang fame)的一篇文章,在那里他提到了这个术语:

降低

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

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

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


Ols*_*ist 7

龙之书没有使用这个词。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) 大量使用了该术语并对其进行了定义。

降低:指令被降低,以便流程图中的每个操作代表目标机器中的单个指令。

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


Ric*_*ton 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
Run Code Online (Sandbox Code Playgroud)

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