第八章 代码优化(1)

       为了使编译程序能产生高质量的目标代码,常常需要对源程序的中间代码进行等价变换; 或者制定某种策略,使得所产生的目标代码能够较合理地利用目标计算机的资源。通常,我们把编译程序所完成的这一部分工作称为代码优化。不过,需要注意的是,这里所说的“优化” ,并非通常含义下的“最佳化” ,而仅仅是指某种相对的合理性

       一个编译程序可以进行范围很广的优化工作:有在中间代码生成过程中的优化,有在小范围内对中间代码中相邻指令所进行的线性窥孔优化,有在基本块内的局部优化,有在全局范围内基于控制流程和数据流程分析的全局优化,等等。优化所完成的工作,既有对中间代码序列中一些代码的挪动或删改,又有寄存器分配和对某些机器指令的使用和选择。可从不同的角度出发对优化进行分类。例如:局部优化和全局优化; 在中间语一级的优化和在目标语目一级的优化等。本章主要讨论中间语言一级的优化,即对语义分析阶段所生成的中间代码进行优化。同时,本章也对语法分析阶段所进行的优化进行扼要介绍。

       还可以将优化分为针对空间的优化和针对时间的优化。前者要求生成的目标代码占用尽量少的内存空间,这在机器只有较少内存的情况下是很重要的;后者要求生成的目标代码的执行时间尽量短,这在实时系统中往往非常重要。大多数情况下,优化策略的选择要考虑两者的平衡。

       将代码优化分为语法制导翻译阶段的优化、线性窥孔(peep -hole)优化和基于结构信息的优化三种类型。在叙述中将视方便,假定中间代码既可以是四元式,也可以是四元式的三地址码表示形式。

1、语法制导翻译阶段的优化

       在进行语法制导翻译和产生中间代码的过程中,可以进行一些优化工作。例如常见的内部数学函数的调用可以采用直接插入函数代码的方式进行优化,从而避免在代码调用过程中所需的现场保护等附加动作。还有就是像运算强度削弱这样的优化也可以在语法制导翻译阶段完成。例如,可以为两个数的乘法运算生成一段进行位移的代码,而不是只直接生成乘法运算。

2、线性线性窥孔(peep -hole)优化

       语法制导翻译阶段的优化只局限于单个产生式,难以结合其前后文环境进行优化。由于在中间代码生成阶段没有考虑前后文环境,所以可能产生一些重复出现的赋值语句。显然,这些赋值语句中的其中几条是可以删除。这样的优化由于要分析相邻的多条指令,所以不能在语法制导翻译阶段进行,但可以由窥孔优化完成。

       线性窥孔优化的基本思想是,考察编译器所生成的中间代码或目标代码中的一段相邻指令,将其中的某些组合替换为效率更高的指令组。线性窥孔优化有如下三个特点:

( 1 )、优化的对象既可以是中间代码,也可以是最终目标代码;

( 2 )、每次处理的是一组相邻指令,相当于将一组相邻指令暴露在一个观察窗口中(这就是“窥孔” 的含义);

( 3 )、对优化对象进行线性扫描。

       窥孔优化程序通常很小,执行速度很快,只需要很少的内存去运行。窥孔优化的项目很多,包括强度削弱、常数合并、无用代码删除、寄存器分配等。下面将分别进行讨论:

2.1、强度削弱

       所谓强度削弱,就是用一种(或一串)执行时间较短的操作去等价地代替一个操作。例如,乘以2 的n 次方运算可以用左移来替换(例如,X * 8 可替换为X << 3 ) ,因为在多数机器上,左移运算的速度比乘法运算的速度快。同样,除以2 的n 次方运算可以用右移来替换( 在X大于0 时,X / 8 可替换为X > > 3 ) 。类似的还有: 以2 的n 次方为除数的取模运算可用按位与来替换(例如,X % 8 可替换为X &7 ,推而广之,X % N 可替换为X&(N— l ) ) 。

2.2、常数合并和常数传播

       所谓常数合并,是指在编译时,就将源程序中常数表达式之值先行算出,而不必生成用于计算该常数表达式的代码。例如,可将表达式a + 2 * 3 翻译成a + 6。这种常数合并在语法制导翻译时就可以完成。

2.3、无用变量与无用代码的删除

       变量的最后一次引用到对该变量再置初值期间,可视为无用变量。显然,变量是否无用依赖所处的环境,是一个相对的概念。在变量的无用期内,对该变量的所有定值( 如对它的赋值)指令均可被删去。下面的例子中就含有无用变量。

t0 = a;

t0 += 5;

x = t0;

…                 /* 此后的一个时间间隔,t0成为无用变量 */

t0 += 1;        /* 在t0无用期内对t0的定值,可以取消 */

t0 = b;           /* t0被再次置初值,无用期结束 */


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值