Compiler construction 通缉:术语“的良好定义”;降低;在编译器的上下文中

Compiler construction 通缉:术语“的良好定义”;降低;在编译器的上下文中,compiler-construction,terminology,Compiler Construction,Terminology,有谁能给我指出编译器中“降低”一词的一个好定义吗 据我所知,这是将一个更高级别的操作转换为一个相当于低级别操作的组合,但我不是很确定,在谷歌上搜索几分钟后,我找不到一个。(有一些“降低”的用法,例如在或中,但没有提及定义。)我找不到与定义相关的好链接,但我想我可以给出一个好的例子。在LLVM中,LLVM IR支持多种大小的整数。大多数C/C++编译器,包括clang,都支持long-long和64位数据类型。许多32位处理器,如mips(32位),没有可以执行的指令,例如64位加法或比较。LLV

有谁能给我指出编译器中“降低”一词的一个好定义吗


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

我找不到与定义相关的好链接,但我想我可以给出一个好的例子。在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
有些人可能会很花哨。例如,在不支持乘法指令的处理器上,简单的乘法运算可能会变成移位和加法运算,而更复杂的乘法运算可能会变成对运行时支持库的调用。

Dobbs博士刚刚发表(著名的dlang)在文中提到:

降低 事后看来,一种明显的语义技巧(但安德烈·亚历山德雷斯库向我指出)被称为“降低”。它在内部包括用更简单的语义结构重写更复杂的语义结构。例如,
while
循环和
foreach
循环可以根据
For
循环重写。然后,代码的其余部分只需处理
for
循环。这最终发现了在D中如何实现while循环的几个潜在错误,这也是一个不错的胜利。它还用于根据
try finally
语句等重写
scope guard
语句。在语义处理中发现的每种情况都将为实现赢得胜利

如果事实证明语言中有一些特殊的大小写规则阻止了这种“降低”重写,那么返回并重新审视语言设计可能是一个好主意

任何时候,只要您能在处理语义构造时发现共性,就有机会减少实现工作和bug

《龙之书》没有使用这个术语。Kennedy+Allen的针对现代体系结构的优化编译器基于依赖的方法不使用该术语。Steve Muchnick的高级编译器设计和实现没有使用这个术语

工程编译器使用术语,但不定义它。鲍勃·摩根(Bob Morgan)的《构建优化编译器》(Building a Optimization Compiler,1998)大量使用了这个术语并对其进行了定义

降低:降低指令,以便在 流图表示目标机器中的一条指令


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

这不是称为
降低
?也许这就是它在语法定义中的含义,我不记得了。相当模糊。这就是整个编译器所做的。我会将具体示例称为“强度降低”,例如
*2
=>