- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十一章 代码优化
课前索引
【课前思考】 ◇ 回顾第一章介绍编译过程时提到的代码优化, 代码优化阶段的任务是什麽? ◇ 第一章介绍的PL/0编译程序有没有进行代码优化? ◇ 你有没有使用过和比较过同一个编译系统选择其进行优化和不进行优化的编译速度?【学习目标】 通过本章学习 ◇ 理解所谓代码优化是指什麽? ◇ 知道最常用的代码优化技术有哪些? ◇ 知道实现代码优化要进行哪些工作? 【学习指南】 所谓代码优化是指对程序代码进行等价变换。程序代码可以是中间代码(如四元式代码),也可以是目标代码。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码短(而运行速度快),时空效率优化。 编译过程中可进行的优化可按阶段划分:优化可在编译的不同阶段进行,分为中间代码一级和目标代码一级的优化。可按优化涉及的程序范围划分:对同一阶段,分为局部优化,循环优化和全局优化. 进行优化所需要的基础是对代码进行数据流分析和控制流分析。如划分DAG,查找循环,分析变量的定值点和引用点等等。最常用的代码优化技术有删除多余运算,循环不变代码外提,强度削弱,变换循环控制条件,合并已知量与复写传播,以及删除无用赋值等等。 【难重点】 从概念上理解什么是代码优化,编译过程中可进行哪些优化,以及进行优化所需要的基础都没有难点,但在实现上是有相当复杂的工作。 【知识结构】
某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也有所不同,在同一范围内,可进行多种优化。
一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行,如图11.1所示:
图11.1 编译的优化工作阶段
中间代码的优化是对中间代码进行等价变换。目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。 另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。循环优化是对循环中的代码进行的优化。全局优化是在整个程序范围内进行的优化。 编译程序的优化工作旨在生成较好性能的目标代码,为此,编译程序需要对代码(中间代码或目标代码)进行各种方式的变换,变换的宗旨是:等价-经优化工作变换后的代码运行结果应与原来程序运行结果一样。有效-经优化工作变换后的代码应运行时间较短,占用的存储空间较小。合算-获得较好性能的目标代码是优化工作的意图,而优化本身包括大量的代码分析和变换工作,这里有个权衡:应尽可能以较低的代价取得较好的优化效果。
11.1 什么是代码优化常用的优化技术有:删除多余运算,循环不变代码外提,强度削弱,变换循环控制条件,合并已知量,复写传播与。删除无用赋值。
为了说明这些常用的优化技术,我们来看下面这个例子,源程序是: P∶=0 for I∶=1 to 20 do P∶=P+A[I]*B[I]; 经过编译得到的中间代码如图11.2所示,这个程序段由B1和B2两个部分组成,B2是一个循环,假定机器按字节编址。那么,对于这个中间代码段,如何进行上述优化。
图 11.2 中间代码段
删除多余运算(删除公共子表达式) 优化的目的在于使生成的目标代码较少而执行速度较快。图11.2中间代码段四元式(3)和四元式(6)都是4*I的运算,而从四元式(3)到四元式(6)没有对I赋值,显然,两次计算出的值是相等的。所以四元式(6)的运算是多余的。我们可以把四元式(6)变换成:T4∶=T1。这种优化称为删除多余运算或称为删除公共子表达式。 代码外提 减少循环中代码总数的一个重要办法是循环不变代码外提。这种变换把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面,使之只在循环外计算一次。上例中,我们可以把四元式(4)和四元式(7)提到循环外。经过删除多余运算和代码外提后,代码变换成图11.3。
图11.3 删除公共子表达式和代码外提
强度削弱 强度削弱的思想是把强度大的运算换算成强度小的运算。例如把乘法运算换成加法运算等等。在图11.3的循环中,每循环一次,I的值增加1,T1的值与I保持线性关系,每次总是增加4。因此,我们可以把循环中计算T1值的乘法运算变换成在循环前进行一次乘法运算,而在循环中将其变换成加法运算。变换后如图11.4所示。
图11.4强度削弱
变换循环控制条件 图11.4
原创力文档


文档评论(0)