首页 理论教育 编译原理:程序代数恒等变换成果

编译原理:程序代数恒等变换成果

时间:2023-11-17 理论教育 版权反馈
【摘要】:程序进行代数恒等变换的常见技术有合并已知量、代数化简、强度削弱以及变量的重新结合等。按照这一思路,可得如下的L3代码序列:T0:=3.14 B:=AT1:=6.28 T6:=R-rT2:=R+r B:=A*T6A:=6.28*T22.代数化简这种优化是利用运算符或者运算符与操作数的组合特性,对基本块中的表达式进行代数等价变换以简化运算的过程。类似的还有:2.0*x=x+xx/2=x*0.54.变量的重新结合这种优化在化简表达式时涉及交换律、结合律、分配率等规则的使用。

编译原理:程序代数恒等变换成果

程序进行代数恒等变换的常见技术有合并已知量、代数化简、强度削弱以及变量的重新结合等。

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈