程序进行代数恒等变换的常见技术有合并已知量、代数化简、强度削弱以及变量的重新结合等。
1.合并已知量
这种优化需要首先判断一个表达式的操作数是否都是常数值,若是,则在编译此表达式时可以用计算结果代替该表达式。
在例8.2的基本块L3中,语句(5)对T0赋值后,T0的值一直没有改变,这就意味着T0在编译时是已知量3.14。而在(6)T1:=2*T0中,由于赋值号右侧的表达式中的各项均为已知量,因此,完全可以在编译时计算出赋值号左边的量。即,(6)T1:=2*T0可以改写为(6)T1:=6.28。按照这一思路,可得如下的L3代码序列:
(5)T0:=3.14 (9)B:=A
(6)T1:=6.28 (10)T6:=R-r
(7)T2:=R+r (11)B:=A*T6
(8)A:=6.28*T2
2.代数化简
这种优化是利用运算符或者运算符与操作数的组合特性,对基本块中的表达式进行代数等价变换以简化运算的过程。例如,下面运算总是成立的:
①二元运算
i=i+0=0+i=i-0
i=i*1=1*i=i/1
②一元运算
i=-(-i)
③布尔运算
true=a∨true=true∨a
false=b∧false=false∧b
3.强度削弱(www.xing528.com)
这种优化是用较快的运算来代替较慢的运算。例如,语句
x:=y**2
中的乘方运算通常需要调用一个函数来实现,实际上,可以使用相对简单、计算速度较快的运算
x:=y*y
来替换。类似的还有:
2.0*x=x+x
x/2=x*0.5
4.变量的重新结合
这种优化在化简表达式时涉及交换律、结合律、分配率等规则的使用。例如,假设有赋值语句:
a:=b+c
e:=c+d+b
其中间代码可能是:
a:=b+c
t:=c+d
e:=t+b
如果t在基本块外不再使用,那么利用“+”的交换律和结合律可以把该序列改写为:
a:=b+c
e:=a+d
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。