《编译原理与技术》课件-第11章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《编译原理与技术》课件-第11章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理与技术 编译 原理 技术 课件 11
- 资源描述:
-
1、编译原理与技术编译原理与技术第第11章章 代码优化代码优化 编译原理与技术编译原理与技术2主要内容主要内容u优化的概念优化的概念 u代码优化的基本技术代码优化的基本技术 u局部优化局部优化u机器代码优化窥孔技术机器代码优化窥孔技术 编译原理与技术编译原理与技术311.1 代码优化的概念代码优化的概念u代码优化在整个编译过程的位置代码优化在整个编译过程的位置编译前端中间代码优化目标代码生成中间代码生成源程序目标程序中间代码中间代码目标代码优化中间代码编译前端编译器可以改进过程调用、循环和地址计算目标代码生成中间代码源程序目标程序程序员可以改进算法,改变循环编译器可以利用寄存器,选择指令和窥孔优转
2、换程序员和编译器可能改上程序的位置程序员和编译器可能改上程序的位置 编译原理与技术编译原理与技术411.1 代码优化的概念代码优化的概念u设计和实现编译程序代码优化的原则:设计和实现编译程序代码优化的原则:(1)等价原则:经过优化后的代码应该保持程)等价原则:经过优化后的代码应该保持程序的输入输出,不应改变程序运行的结果。序的输入输出,不应改变程序运行的结果。(2)有效原则:优化后的代码应该在占用空间、)有效原则:优化后的代码应该在占用空间、运行速度这两个方面,或者其中的一个方面运行速度这两个方面,或者其中的一个方面得到改善。得到改善。(3)经济原则:代码优化需要占用计算机和编)经济原则:代码
3、优化需要占用计算机和编译程序的资源,代码优化取得的效果应该超译程序的资源,代码优化取得的效果应该超出优化工作所付出的代价。否则,代码优化出优化工作所付出的代价。否则,代码优化就失去了意义。就失去了意义。编译原理与技术编译原理与技术511.1 代码优化的概念代码优化的概念u代码优化依据机器相关性、优化范围和优化语代码优化依据机器相关性、优化范围和优化语言级别的分类言级别的分类按照与机器相关的程度,可以分为与机器相关的代码按照与机器相关的程度,可以分为与机器相关的代码优化和与机器无关的代码优化。优化和与机器无关的代码优化。l与机器相关的优化一般有寄存器的优化、多处理器的优化、与机器相关的优化一般有
4、寄存器的优化、多处理器的优化、特殊指令的优化以及无用指令的消除等技术。显然,特殊指令的优化以及无用指令的消除等技术。显然,这几这几类优化与具体机器的特性密切相关,例如寄存器的总数,寄类优化与具体机器的特性密切相关,例如寄存器的总数,寄存器的具体使用规定,等等。这类优化通常的在目标代码生存器的具体使用规定,等等。这类优化通常的在目标代码生成之后进行。成之后进行。l与机器无关的优化是在目标代码生成以前进行,主要是根据与机器无关的优化是在目标代码生成以前进行,主要是根据程序的控制信息和数据信息,对程序进行优化,与机器无关。程序的控制信息和数据信息,对程序进行优化,与机器无关。编译原理与技术编译原理与
5、技术611.1 代码优化的概念代码优化的概念根据优化的范围,可以划分为局部优化和全局优化两类。根据优化的范围,可以划分为局部优化和全局优化两类。l考察一个基本块的三地址中间代码序列就可以完成的优化,称为局部优化。考察一个基本块的三地址中间代码序列就可以完成的优化,称为局部优化。而全局优化则必须在考察基本块之间的相互联系与作用的基础上才能完成。而全局优化则必须在考察基本块之间的相互联系与作用的基础上才能完成。l代码优化总是在内部的中间代码和目标代码上进行的。在通常的编译程序代码优化总是在内部的中间代码和目标代码上进行的。在通常的编译程序中,代码优化往往是在中间代码这一级执行,例如对源程序的三地址
6、代码中,代码优化往往是在中间代码这一级执行,例如对源程序的三地址代码或抽象语法树上采取优化措施。相对于在目标代码级别的优化,在中间代或抽象语法树上采取优化措施。相对于在目标代码级别的优化,在中间代码优化的好处是:码优化的好处是:(1)容易从中间代码中识别处进行优化的情况,对目标语言代码的信息识别要困)容易从中间代码中识别处进行优化的情况,对目标语言代码的信息识别要困难,成本较高;难,成本较高;(2)中间代码于机器无关,因此,一个代码优化的程序可以适用于多种型号的机)中间代码于机器无关,因此,一个代码优化的程序可以适用于多种型号的机器。器。l有时也在目标代码语言级上进行代码优化,如寄存器优化等。
7、在目标代码有时也在目标代码语言级上进行代码优化,如寄存器优化等。在目标代码级别上进行全局优化的代价昂贵,本书仅仅讨论局部范围的目标代码优化级别上进行全局优化的代价昂贵,本书仅仅讨论局部范围的目标代码优化技术,即所谓的窥孔优化。技术,即所谓的窥孔优化。编译原理与技术编译原理与技术711.2 代码优化的基本技术代码优化的基本技术 u分类:分类:与机器无关的、在中间代码语言级的代码优与机器无关的、在中间代码语言级的代码优化主要包括:化主要包括:删除公共子表达式删除公共子表达式复写传播复写传播删除无用代码删除无用代码代码外提代码外提强度消弱强度消弱删除归纳变量删除归纳变量其中最后三种是专门针对循环语句
8、的优化。其中最后三种是专门针对循环语句的优化。编译原理与技术编译原理与技术811.2 代码优化的基本技术代码优化的基本技术void quicksort(m,n)int m,n;int i,j,v,x;if(n=m)return;/*程序段开始*/i=m 1;j=n;v=an;while(1)do i=i1;while(ai v);if(i=j)break;x=ai;ai=aj;aj=x;x=ai;ai=an;an=x/*程序段结束*/quicksort(m,j);quicksort(i+1,n);图图11.3 11.3 快速排序的快速排序的C C代码代码(1)i:=m 1(2)j:=n(3)t
9、1:=4n(4)v:=at1(5)i:=i 1(6)t2:=4i(7)t3:=at2(8)if t3 v goto(5)(9)j:=j 1(10)t4:=4j(11)t5:=at4(12)if t5 v goto(9)(13)if i=j goto(23)(14)t6:=4i(15)x:=at6(16)t7:=4i(17)t8:=4j(18)t9:=at8(19)at7:=t9(20)t10:=4j(21)at10:=x(22)goto(5)(23)t11:=ai(24)x:=at11(25)t12:=4i(26)t13:=4n(27)t14:=at12(28)at12:=t14(29)t15
10、:=4n(30)at15:=x 图图11.4 11.4 快速排序部分程序的三地址代码快速排序部分程序的三地址代码编译原理与技术编译原理与技术911.2 代码优化的基本技术代码优化的基本技术u删除公共子表达式删除公共子表达式i:=m 1j:=nt1:=4nv:=at1t11:=4ix:=at11t12:=4it13:=4nt14:=at12at12:=t14t15:=4nat15:=xi:=i 1t2:=4it3:=at2if t3 v goto B1i f i =j goto B6B1B2B4j:=j 1t4:=4jt5:=at4if t5 v goto B3t6:=4ix:=at6t7:=4
11、it8:=4jt9:=at8at7:=t9t10:=4jat10:=xgoto B2B3B5B6如果表达式如果表达式E已经计算过,已经计算过,并且在这之后并且在这之后E中变量的值中变量的值没有改变,那么,没有改变,那么,E的这个的这个再次出现称为公共子表达再次出现称为公共子表达式。如果可以利用先前的式。如果可以利用先前的计算结果,就可以避免表计算结果,就可以避免表达式的重复计算,这种优达式的重复计算,这种优化称为删除公共子表达式。化称为删除公共子表达式。编译原理与技术编译原理与技术1011.2 代码优化的基本技术代码优化的基本技术这是仅限于基本块的局部优化,B5仍然需要计算4*i和4*j。若在
12、整个图11.3的程序来看,它们依然是公共子表达式,4*i在B2中计算并且赋给了t2,4*j在B2中计算并且赋给了t4。继续删除这些公共子表达,在B5中就可以把t6:=4*i 替换为 t6:=t2t8:=4*j 替换为 t8:=t4这是因为在B2中计算的4*i传到B5时,没有改变i的值。同样,在B3中计算的4*j传到B5时,没有改变j的值。对于B6也可以作同样的处理。例如,在图例如,在图11.5的的B5中分别把公中分别把公共子表达式共子表达式4*i和和4*j的值赋给的值赋给t7和和t10,这些重复计算的公共子表达,这些重复计算的公共子表达式可以删除,用式可以删除,用t6代替代替t7,用,用t8代
13、替代替t10,这样就把,这样就把B5变换为如变换为如下的代码:下的代码:B5:t6:=4 ix:=at6t7:=t6t8:=4 jt9:=at8at7:=t9t10:=t8at10:=xgoto B2 编译原理与技术编译原理与技术1111.2 代码优化的基本技术代码优化的基本技术删除公共子表达式后的B5和B6 分别是分别是t6:=t2x:=at6t7:=t6t8:=t4t9:=at8at7:=t9t10:=t8at10:=xgoto B2B5B6t11:=t2x:=at11t12:=t11t13:=t1t14:=at12at12:=t14t15:=t1at15:=x编译原理与技术编译原理与技术
14、1211.2 代码优化的基本技术代码优化的基本技术复写传播复写传播 B5:t6:=t2x:=t3t7:=t2t8:=t4t9:=t5at2:=t5t10:=t4at4:=t3goto B2观察上面观察上面B5中的语句:中的语句:t6:=t2和和x:=at6,t6在赋值完成之后就被引用,而期间没有改在赋值完成之后就被引用,而期间没有改变变t6的值。因此,可以把的值。因此,可以把x:=at6变换为变换为x:=at2。这种变换叫做复写传播,它是对形式。这种变换叫做复写传播,它是对形式为为f:=g的赋值语句(复写)的变换。的赋值语句(复写)的变换。完成上述的复写传播之后,进一步考察可以完成上述的复写传
15、播之后,进一步考察可以发现,在发现,在B2中计算了中计算了t3:=at2,因此,在,因此,在B5中可以删除公共子表达式,把中可以删除公共子表达式,把x:=at2 替换为替换为 x:=t3进而,通过复写传播把进而,通过复写传播把B5中中at4:=x 替换为替换为 at4:=t3同样,同样,B5中的中的t9:=at4 和和at2:=t9可以分可以分别替换为别替换为t9:=t5和和at2:=t5。这样,。这样,B5就就变为变为编译原理与技术编译原理与技术1311.2 代码优化的基本技术代码优化的基本技术i:=m 1j:=nt1:=4nv:=at1i:=i 1t2:=4it3:=at2if t3 v
16、goto B1if i=j goto B6B1B2B4j:=j 1t4:=4jt5:=at4if t5 v goto B3at2:=t5at4:=t3goto B2at2:=vat1:=t3B3B5B6图图11.7 复写传播和删除无用代复写传播和删除无用代码之后码之后删除无用语句删除无用语句 观察经过复写变换之后的B5,可以发现,变量x、t7、t8、t9、t10的值在整个程序汇总不再使用,因此,这些变量的赋值对程序的运算结果没有任何作用,可以把他们删除掉。我们称之为删除无用代码。删除无用赋值语句之后的B5变为:B5:at2:=t5at4:=t3goto B2对B6可以进行同样的处理,结果如图1
17、1.7所示 编译原理与技术编译原理与技术1411.2 代码优化的基本技术代码优化的基本技术u代码外提代码外提 循环是多次重复执行的代码段,在编译程序的优循环是多次重复执行的代码段,在编译程序的优化工作中,循环优化占有十分重要的地位。这是化工作中,循环优化占有十分重要的地位。这是因为,因为,l对于循环次数为对于循环次数为n的一个循环,每节省循环体内一条目标的一个循环,每节省循环体内一条目标指令,运行时间就可以少执行指令,运行时间就可以少执行n条指令;特别地,对于条指令;特别地,对于m重循环的最内循环,每节省一条指令就可以减少执行重循环的最内循环,每节省一条指令就可以减少执行n1*n2*nm条指令
18、。条指令。l此外,现代的高级编程语言中都支持数组、集合、树、此外,现代的高级编程语言中都支持数组、集合、树、图等数据结构,它们广泛地应用在程序中。因此,按照图等数据结构,它们广泛地应用在程序中。因此,按照经济原则,循环优化的效果最为显著。经济原则,循环优化的效果最为显著。编译原理与技术编译原理与技术1511.2 代码优化的基本技术代码优化的基本技术如果它产生的结果在循环中保持不变,就可如果它产生的结果在循环中保持不变,就可以把它提到循环的外边,以避免每次循环都以把它提到循环的外边,以避免每次循环都执行这条代码。例如,对于下面的执行这条代码。例如,对于下面的while语句语句while(i=li
19、mit-2)如果在循环体内如果在循环体内limit的值不变,就可以把它的值不变,就可以把它变换为变换为t:=limit-2;while(i=j goto B6之外,不再被引用。因此,可以删除这些归纳变量i和j,把这个语句变换为if t2=t4 goto B6。经过强度消弱和删除归纳变量,图11.7以及图11.5最后就变换为图11.8。优化的效果:1.B2和B3的代码数从4条减到3条,其中一条从乘法变为加法;2.B5从9条变为3条,B6从8条变为2条。3.尽管B1从4条增加到6条,但是,B1这段代码在程序中仅仅执行一次,所以程序总的运行时间几乎不受B1大小的影响。i:=m 1j:=nt1:=4n
20、v:=at1t2:=4it4:=4jt2:=t2 4t3:=at2if t3 v goto B1if i=j goto B6B1B2B4t4:=t4-4t5:=at4if t5 v goto B3at2:=t5at4:=t3goto B2at2:=vat1:=t3B3B5B6图图11.8 B5和和B6删除公共子表达式以后删除公共子表达式以后编译原理与技术编译原理与技术1811.3 局部优化局部优化 u基本块的变换基本块的变换 除了上面介绍的删除公共子表达式和删除无用代码这除了上面介绍的删除公共子表达式和删除无用代码这两种优化以外,在基本块内可以进行多种等价变换,两种优化以外,在基本块内可以进行
21、多种等价变换,改进代码的质量。改进代码的质量。合并已知量合并已知量l假设在一个基本块内有两条语句:假设在一个基本块内有两条语句:t1:=2t2:=3 t1l如果对如果对t1赋值后,赋值后,t1的值没有改变过,那么,赋值语句的值没有改变过,那么,赋值语句t2:=3 t1右边的两个运算数在编译时刻都是已知量,就可以在编右边的两个运算数在编译时刻都是已知量,就可以在编译时计算出这条赋值语句的右边,而不必等到程序运行时再译时计算出这条赋值语句的右边,而不必等到程序运行时再计算。即,可以把这条语句改为计算。即,可以把这条语句改为t2:=6。这种变换称为合并。这种变换称为合并已知量。已知量。编译原理与技术
22、编译原理与技术1911.3 局部优化局部优化临时变量更名临时变量更名l在一个基本块内有两条语句在一个基本块内有两条语句u:=a+b和和v:=a+b,其中,其中u和和v都是基本快内的临时变量,如果用都是基本快内的临时变量,如果用u替换基本块内的所有替换基本块内的所有v的引用,那么,不改变基本块内的值。事实上,总可以通过的引用,那么,不改变基本块内的值。事实上,总可以通过改变基本块内临时变量的名字而得到一个等价的基本块。改变基本块内临时变量的名字而得到一个等价的基本块。交换语句的次序交换语句的次序l一个基本块内的两条邻近的语句:一个基本块内的两条邻近的语句:u:=a+bz:=x+yl当且仅当当且仅
23、当x和和y都不是都不是u,并且,并且a和和b都不是都不是z时可以改变这两时可以改变这两条语句的位置而不影响基本块。在代码生成的算法中可以发条语句的位置而不影响基本块。在代码生成的算法中可以发现,有时通过改变语句的执行次序,可以产生更高效的目标现,有时通过改变语句的执行次序,可以产生更高效的目标代码。代码。编译原理与技术编译原理与技术2011.3 局部优化局部优化u代数变换代数变换许多代数变换可以简化表达式的运算或加快计算速度,同时保持表达式的值不变。例如,x:=x+0,x:=x0 或x:=x1执行的运算构没有改变x的值,没有任何意义,可以从基本块中删除。又如,x:=y2的指数运算通常要调用一个
展开阅读全文