编译器是否会随着时间的推移在优化代码方面做得更好,如果是这样的话,会以什

时间:2015-06-23 23:10:35

标签: compiler-optimization

例如,我们知道Moores法律规定芯片上的晶体管数量每1.8到2年翻一番(因此计算能力大致以此速率增加)。这让我想到了编译器优化。随着时间的推移,编译器是否会越来越好,制作代码运行得更快?如果它们是否存在关于这种性能增长如何扩展的理论?如果我要使用1970年编写的一段代码,使用1970编译器优化编译,那么相同的代码在同一台机器上运行得更快,但是使用今天的优化进行编译?我是否可以期待今天编写的代码在100年内运行速度更快,仅仅是因为更好的优化/编译器(显然与硬件和算法改进的改进无关)?

1 个答案:

答案 0 :(得分:3)

这是一个复杂的,多方面的问题,所以让我试着找几个关键点:

  • 编译器优化理论非常复杂,并且通常(首先)比实际的语言设计更困难。该域包含许多其他复杂的数学子域(例如,有向图理论)。已知编译器优化理论中的一些问题是NP完全的甚至是不可判定的(这代表了要解决的最复杂的问题类别)。
  • 虽然有数百种已知技术(例如,参见here),但这些技术的实现在很大程度上取决于计算机语言和目标CPU(例如指令集和管道)。由于计算机语言和CPU不断发展,即使是众所周知的技术的最佳实现也会随着时间的推移而发生变化。新的CPU功能和体系结构也可以打开以前不可用的优化技术。一些最尖端的技术也可能是专有的,因此一般公众无法再使用。例如,几个商业JVM为Java字节码的JIT编译提供了专业优化,这在统计基础上在数量上优于(默认)开源JVM。
  • 有一个明确无误的历史趋势,即更好更好的编译器优化。这就是为什么现在很少有人经常进行任何手动装配编码的原因。但由于已经讨论过的因素(以及其他因素),自动编译器优化所提供的效率和收益的演变在历史上是非常非线性的。这与摩尔定律的相当一致的曲率和与计算机硬件改进相关的其他定律形成对比。编译器优化的跟踪记录可能更好地可视化为具有许多“适合和开始”的线。因为推动编译器优化理论的非线性的因素在不久的将来不会发生变化,所以至少在不久的将来,这种轨迹可能会保持非线性。
  • 当语言本身来来往往时,即使平均改进率也很难说,更不用说具有不同硬件功能的CPU模型来来往往。 CPU已经发展了不同的指令集随着时间的推移,指令集的扩展,所以甚至很难进行“苹果对苹果”的比较。无论您使用哪种指标,都是如此:根据离散指令计划长度,程序执行时间(高度依赖于CPU时钟速度和流水线功能)或其他。
  • 编译器优化理论现在可能处于递减收益的制度中。也就是说,大部分“低悬”果实已得到解决,其余大部分优化要么相当复杂,要么提供相对较小的边际改进。也许破坏性地影响编译器优化理论的最大因素将是弱(或强)AI的出现。因为编译器优化理论中的许多未来收益将需要高度复杂的预测能力,所以最佳优化器实际上将具有某种程度的先天智能(例如,预测最常见的用户输入,预测最常见的执行路径,以及将NP难度优化问题减少为可解决的子问题等。将来很有可能您使用的每一个软件都是专门为您量身定制的,可以根据您的特定用例,兴趣和要求量身定制。想象一下,您的操作系统(操作系统)是根据您作为科学家与视频游戏玩家与企业高管,老年人与年轻人或任何其他人口统计学组合的特定用例而专门为您编制或重新编译的。这可能会影响代码执行。