编译器优化--1--概述简介

编译器优化–1--概述简介

编译优化的度量有很多种,包括运行时间减少,代码长度变短,执行期间处理器能耗更低等等。优化编译器除了生成高效的代码,还应该具备使输入的小改动不应该导致性能出现较大变动。

多遍迭代可能会生成更好的代码,因为编译器实际上可以在一个阶段中研究代码并记录相关细节,那么在后续阶段中,编译器可以利用这些记下来的知识来提高转换的质量。这种策略要求在第一个Pass获得知识并将之记录保存,后续各个Pass可以查找并利用这些知识。LLVM框架的优化就是这么做的。

​ 第一个Pass往往称之为分析Pass,后面的若干Pass都称为转换Pass。分析Pass可以判断代码在何处安全地应用优化技术且有利可图。编译器的常见优化分析技术:

1. 数据流分析,在编译时推断运行时值的流动。数据流分析器通常需要解一个联立方程组,该方程组是根据被转换代码的结构得出的。
2. 相关性分析(dependence analysis)使用数论中的测试方法来推断下标表达式的可能值。它用于消除引用数组元素时的歧义。

优化器的设计中,转换趟的选择和顺序的确定,对于优化器的整体有效性具有非常关键的作用。变换的选择决定了优化器能够发现IR程序中的哪些低效性,已经优化器如何重写代码以消除这些低效性。编译器应用变换的顺序则决定了各"趟处理(Pass)"之间的交互方式。

分析Pass和转换Pass的关系如下图所示:

每个趟(Pass)以IR形式的代码作为输入,都生成IR代码的一个重写版本作为输出。这样的结构将实现划分为若干个小片段,允许独立地构建并测试各个处理趟,简化开发、测试和维护。在实际编译器应用中,某些趟只会运行一次,而其它趟可能需要在优化过程中的不同时机多次运行。

优化器设计与实现中的若干难题

优化器设计和构造方面的第一个障碍是概念上的。优化文献描述了数百种用于改进IR程序的不同算法。编译器编写者必须从这些变换算法中选择一个子集来实现并应用到代码上。虽然阅读原始论文有助于实现,但这无法为决策过程提供什么洞察力,因为大多数论文都主张采用他们所说的转换。

其次,编译器编写者需要领会编译器转换的应用程序中会出现哪些低效性,以及这些低效性对应用程序有何影响。给定一组需要解决的具体缺陷,编译器编写者接下来为其选择处理这些缺陷的具体变换。实际上,许多变换都能够解决多种低效性,因此缜密的选择可以减少所需的趟数。因为大多数优化器都是建立在有限资源上的,编译器编写者可以根据变换对最终代码的影响,按优先次序列出各个变换。

此外,相比与编译器前端,优化阶段和代码生成包含了几个需要更多时间的问题。对于程序分析和优化来说,我们考察的许多算法,其复杂度都超过O(n)。因而,与编译器前端相比,优化器和代码生成器中算法的选择对编译实践有更大的影响。编译器编写者可能需要进行一些折中,以分析准确性和优化有效性的下降来阻止编译时间的上升。进行此类决策时,需要进行明智且审慎的考虑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值