当前位置: 首页 > 知识库问答 >
问题:

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

滕夜洛
2023-03-14

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

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

共有3个答案

东方河
2023-03-14

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

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

张啸
2023-03-14

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

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

降低:指令被降低,因此流图中的每个操作都代表目标机器中的一条指令。

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

严宇
2023-03-14

多布斯博士刚刚发表了沃尔特·布莱特(Walter Bright)的一篇文章,他在文章中提到:

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

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

任何时候,只要你能在语义结构的处理中找到共性,就有机会减少实现工作和bug。

 类似资料:
  • 条款34: 将文件间的编译依赖性降至最低 假设某一天你打开自己的C++程序代码,然后对某个类的实现做了小小的改动。提醒你,改动的不是接口,而是类的实现,也就是说,只是细节部分。然后你准备重新生成程序,心想,编译和链接应该只会花几秒种。毕竟,只是改动了一个类嘛!于是你点击了一下"Rebuild",或输入make(或其它类似命令)。然而,等待你的是惊愕,接着是痛苦。因为你发现,整个世界都在被重新编译、

  • 问题内容: Python代码对象具有属性。PyPy字节码解释器的文档通常使用术语 Cell 。 在其他语言中,Rust提供了Cell数据类型。谷歌搜索表明它们以某种方式与闭包相关。 在编程语言实现的上下文中,什么是 单元 ?细胞能解决什么问题? 问题答案: 在Python中,对象是用于存储自由变量一个的关闭。 假设您想要一个始终返回其参数的特定部分的函数。您可以使用闭包来实现此目的: 这是如何使用

  • 我正在努力理解我的AWS成本报告。我正在开发一个使用AWS进行数据库和存储的社交媒体软件。这个月的成本是250美元,我是该应用程序的唯一用户。这正常吗?我的计划是发布该应用程序并让更多用户加入,但我现在非常害怕。 我正在使用的服务: AppSync/DynamoDB S3 AWSCloudFront 科尼托 我在DynamoDB(AppSync)上有2个表。我将它们转换为全局表,以便其他国家的人也

  • 问题内容: 我遇到以下字符编码问题,以某种方式设法将具有不同字符编码的数据保存到数据库(UTF8)中,下面的代码和输出显示2个示例字符串以及它们的输出方式。其中之一需要更改为UTF8,而另一个已经更改为。 如何/应该去检查是否应该对字符串进行编码? 例如,我需要正确输出每个字符串,那么如何检查它是否已经是utf8或是否需要转换? 我正在使用PHP 5.2,mysql myisam表: 输出1: 输

  • 问题内容: 我只想编译源目录中的选定文件或目录(包括子目录)。我非常确定可以使用of 的配置来完成此操作,但是由于它仍将所有类都编译为,因此它似乎并没有达到我的预期。真正奇怪的是,Maven的输出表明该设置实际上已完成其工作,原因是: 我有: 但没有编译器的配置,我有: 但是在这两种情况下,所有14个类都被编译为我提到的那样。您能解释一下还是建议另一种仅编译选定文件的解决方案? 问题答案: 3类简

  • 考虑以下示例: 我知道下界通配符接受通配符中给定类的所有超类(这里是IOException)。 为什么在上述情况下编译器会显示编译错误?