【问题标题】:Wanted: good definition of the term "lowering" in the context of compilers通缉:在编译器上下文中对术语“降低”的良好定义
【发布时间】:2020-06-27 01:13:25
【问题描述】:

谁能指出我在编译器上下文中对术语“降低”的良好定义?

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

【问题讨论】:

  • 这不是叫reducing吗?或者也许这就是它在语法定义中的说法,我不记得了。
  • 相当模糊。这就是整个编译器所做的。我将特定示例称为“强度降低”,例如*2 => << 1.

标签: compiler-construction terminology


【解决方案1】:

博士。 Dobbs 刚刚发布了an article by Walter Bright(dlang 成名),他在其中提到了这个词:

降低

事后看来很明显的一种语义技术(但让 Andrei Alexandrescu 向我指出)称为“降低”。它在内部包括用更简单的语义结构重写更复杂的语义结构。例如,while 循环和foreach 循环可以重写为for 循环。然后,剩下的代码只需要处理for 循环。事实证明,这发现了在 D 中如何实现 while 循环的几个潜在错误,因此是一个不错的胜利。它还用于将scope guard 语句重写为try-finally 语句等。在语义处理中可以找到的每种情况都将是实现的胜利。

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

只要您能在语义结构的处理中找到共性,这就是减少实施工作和错误的机会。

【讨论】:

    【解决方案2】:

    我找不到一个很好的定义链接,但我想我可以举一个很好的例子。在 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
    

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

    【讨论】:

      【解决方案3】:

      龙之书没有使用这个词。 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 2013-04-06
        • 2011-06-20
        • 2013-08-04
        • 1970-01-01
        相关资源
        最近更新 更多