Optimization 根据Muchnick重新关联
我正在阅读Muchnick的“高级编译器设计与实现”,图12.6列出了20条转换规则,如果按顺序应用,这些规则会进行常量折叠和重新关联,以将常量移动到一起。规则(不包括分布式规则)是(我的语法:Optimization 根据Muchnick重新关联,optimization,compiler-construction,program-transformation,Optimization,Compiler Construction,Program Transformation,我正在阅读Muchnick的“高级编译器设计与实现”,图12.6列出了20条转换规则,如果按顺序应用,这些规则会进行常量折叠和重新关联,以将常量移动到一起。规则(不包括分布式规则)是(我的语法:c是文字,t术语,带空格的运算符在源代码中,而不带空格的运算符表示涉及文字的编译时计算): R1:c1+c2=c1+c2 R3:c1*c2=c1*c2 R5:c1-c2=c1-c2 R2:t+c=c+t R4:t*c=c*t R6:t-c=(-c)+t R7:t1+(t2+t3)=(t1+t2)+t3 R
c
是文字,t
术语,带空格的运算符在源代码中,而不带空格的运算符表示涉及文字的编译时计算):
R1:c1+c2=c1+c2
R3:c1*c2=c1*c2
R5:c1-c2=c1-c2
R2:t+c=c+t
R4:t*c=c*t
R6:t-c=(-c)+t
R7:t1+(t2+t3)=(t1+t2)+t3
R8:t1*(t2*t3)=(t1*t2)*t3
R9:(c1+t)+c2=(c1+c2)+t
R10:(c1*t)*c2=(c1*c2)*t
他写道“按照给定的顺序递归地应用树转换规则[…],但我看不出这是如何实现的。给定((c1+t1)+t2)+c2
,我将如何应用规则来获得(c1+c2+t1)+t2
或类似的结果
(我可以想出一套不同的规则,但我想了解书中的内容,以防我看错了)。我没有这本书,但我会尝试一下。开始表达:
((c1 + t1) + t2) + c2
c2+c1
应用R2:
c2 + ((c1 + t1) + t2)
对右侧的子表达式递归应用规则不会产生任何匹配项。继续对整个表达式应用R7(文字也是术语):
递归。在左边的子表达式上应用R7
(c2 + c1) + t1
递归。在左边的子表达式上应用R1:
((c1 + t1) + t2) + c2
c2+c1
最终结果:
(c2+c1+t1)+t2嗯。现在我看不出我的问题了……谢谢:-)