- 1、本文档共72页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 优化 优化:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。 等价:指不改变程序的运行结果。 有效:指目标代码运行时间短,占用的存储空间小。 10.1 概述 优化的目的是为了产生更高效的代码。由优化编译程序提供的对代码的各种变换必须遵循一定的原则: 等价原则:经过优化后不应改变程序运行的结果; 有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小; 合算原则:应尽可能以较低的代价取得较好的优化效果。 10.1 概述 优化的种类: 删除多余运算(或称删除公用子表达式) 代码外提 强度消弱 变换循环控制条件 合并已知量 复写传播 删除无用赋值 优化的三个不同级别: 局部优化 循环优化 全局优化 void quicksort (m, n); int m, n; { int i, j; int v, x; if (n=m) return; /* fragment begins here*/ i=m-1; j=n; v=a [n]; while (1) { do i=i+1; while (a [i]v); do j=j-1; while (a [j]v); if (i=j) break; x=a [i]; a[i]=a [j]; a[j]=x; } x=a[i]; a[i]=a [n]; a [n]=x; /*fragment ends here*/ quicksort (m, j); quicksort (i+1, n); } 10.2 局部优化 基本块:指程序中一顺序执行语句序列,其中只有一个入口和一个出口。入口就是其中第一个语句,出口就是其中最后一个语句。 10.2 局部优化 局限于基本块范围内的优化称为基本块内的优化,或称局部优化。 在一个基本块内通常可以实行下面的优化: 删除公共子表达式 删除无用赋值 合并已知量 临时变量改名 交换语句的位置 代数变换 划分四元式程序为基本块的算法: 1.求出四元式程序中各个基本块的入口语句: 1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。 划分四元式程序为基本块的算法: 2. 对以上求出的每个入口语句,确定其所属的基本块。它是由该入口语句到下一入口语句(不包括该入口语句)、或到一转移语句(包括该转移语句)、或一停语句(包括该停语句)之间的语句序列组成的。 3. 凡未被纳入某一基本块中的语句,可以从程序中删除。 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 例:划分基本块 (1) read X (2) read Y (3) R:=X mod Y (4) if R=0 goto (8) (5) X:=Y (6) Y:=R (7) goto (3) (8) write Y (9) halt 优化措施 合并已知量 T1:=2 … T2:=4*T1 变换成 T2:=8 临时变量改名 T:=b+c 其中T是一个临时变量名。把这个语句改成: S:=b+c 优化措施 交换语句的位置 T1:=b+c T2:=x+y 代数变换 x:=x+0 或 x:=x*1 x:=y**2 变换成 x:=y*y 流图 每个流图以基本块为结点。如果一个结点的基本块的入口语句是程序的第一条语句,则称此结点为首结点。如果在某个执行顺序中,基本块B2紧接在基本块B1之后执行,则从B1
文档评论(0)