- 1、本文档共23页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 优化 第十章 优化 第十章 优化 本章讨论如何对程序进行各种等价变幻,使得从变换后的程序出发,能生成更有效的目标代码,我们通常称这种变换为优化。优化可以在编译的各个阶段进行,但最主要的一类优化是在目标代码生成以前,对语法分析后的中间代码进行的。这类优化不依赖于具体的计算机。另一类重要的优化是在目标代码生成时进行的它在很大程度上依赖于具体的计算机。本章讨论前一类优化。 有很多技术和手段可以用于中间代码这一级上的优化。总体上讲在一个编译程序中优化器的地位和结构如下图: 第十章 优化 优 化 编译前端 代码优化器 代码产生 控制流分析 数据流分析 代码变换 代码优化器的地位和结构 第十章 优化 10。1 概述 由于本章讲的方法在计算机的很多领域都很有用,所以应作为学习的重点内容。 优化的目的是为了产生更高效的代码。由优化编译程序提供的对代码的各种变换必须遵循下面的原则: (1)等价原则。 (2)有效原则。 (3)核算原则。 本章我们着重讨论中间代码这一级上的优化,其应掌握优化的一般方法:删除公共子表达式、复写传播、删除无用代码、代码外提、强度消弱、删除归纳变量 10。2 局部优化 10。2。1基本块及流图 第十章 优化 所谓基本块是指程序中一顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第一个语句,出口就是其中的最后一个语句。 这里应掌握划分四元式程序为基本块的算法。 在基本块内,可以以进行删除公共子表达式和删除无用赋值这两种优化外,还可以实现下面几种变换。 1。合并已知量 2。临时变量改名 3。交换语句位置 4。代数变换 10。2。2基本块的DAG表示及其应用 一个基本块的DAG是一种其结点带有下述标记或附加信息的DAG。 第十章 优化 1。图的叶结点(没有后继的结点 )以一标识符(变量明)或常数作为标记,表示该结点代表该变量或常数的值。如果叶结点用来代表某变量A的地址,则用add(A)作为该结点的标记。通常把叶结点上作为标记的标识符加上下标0,以表示它是该变量的初值。 2。图的内部结点(有后继的结点)以一运算符作为标记,表示该结点代表应用该运算符对其后继结点所代表的值进行运算的结果。 3。图中各结点上可能附加一个或多个标识符,表示这些变量具有该结点所代表的值。 用DAG图优化程序应掌握。 10。3 循环优化 循环就是程序中那些可能反复执行的代码序列。 对循环中的代码,可以实行代码外提、强度消弱和删除归纳变量等优化。 第十章 优化 这部分应作为重点,作一部分习题。 10。3。1代码外提 所谓变量A在某点d 的定值到达另一点u(或称变量A的定值点d 到达另一点u ),是指流图中从d有一通路到达u且该通路上没有A的其它定值。 实行代码外提时,我们在循环入口结点前建立一个新的结点(基本块),称循环的前置结点。循环前置结点以循环入口为其为以后继,原来流图中从循环外引到循环入口结点的有向边,改成引到循环前置结点。 [例10。5] 对下面一段Pascal元程序: for I:= 1 to 10 do A[I, 2*J] := A[I, 2*J] + 1 ( 其中A是 10 X10 的二维数组) 第十章 优化 产生中间代码如图10。11。 (1)I := 1 (2) If I 10 goto (15) (3) T1 :=2*J (4) T2 := 10 * I (5) T3 :=T2 + T1 (6) T4 :=add(A) – 11 (7) T5 :=2 * J (8) T6 := 10 * I (9) T7 := T5 + T6 (10) T8 :=add(A) - 11 (11) T9 := T8[T7] (12) T4[T3] := T9 + 1 (13) I ;= I + 1 (14) Goto B2 (15) B1 B2 B2 B3 第十章 优化 代码外提后: (1) I := 1 (3) T1 := 2 * J (6) T4 := add(A) – 11 (7) T5 := 2 * J (8) T8 := add(A) - 11 ( (2) if I 10 goto (15) (4) T2 := 10* I (
文档评论(0)