第10章 优化
- 格式:doc
- 大小:191.00 KB
- 文档页数:22
第2节阿基米德原理知能演练提升一、能力提升1.体积相同的铅球、铜块和木块,浸在液体中的情况如图所示,比较它们受到的浮力大小,正确的是()A.铅球受到的浮力最大B.木块受到的浮力最大C.铜块受到的浮力最大D.它们受到的浮力一样大2.(多选)某实验小组在探究浮力大小跟排开液体所受重力的关系时,做了如图所示的四次测量,弹簧测力计的示数分别为F1、F2、F3和F4,则()A.F浮=F3-F1B.F浮=F4-F1C.F浮=F2-F3D.F浮=F2-F43.如图所示,用量筒和水测量小石头体积时,小石头在水里下沉的过程中,下列判断正确的是()A.水的密度变大B.水对小石头的压强不变C.小石头受到的浮力不变D.量筒对桌面的压力变大4.用图中实验装置验证阿基米德原理,当物块浸入溢水杯时,水会流入空桶中,下列说法正确的是()A.实验前溢水杯未装满水,对实验结果没有影响B.物块浸入水中越深,水对溢水杯底部的压强越大C.物块浸入水中越深,左侧弹簧测力计的示数越大D.通过计算可知实验所用物块的密度为2×103 kg/m35.体积为2×10-3 m3的金属块浸没在水中,受到浮力的大小为N,方向竖直向。
距水面0.1 m深处水的压强为Pa。
(g取10 N/kg)6.如图所示,某物块用细线系在弹簧测力计下,在空气中称时弹簧测力计示数是15 N,浸没在水中称时弹簧测力计示数是5 N,则此时物块受到水的浮力为N,物块的密度为 kg/m3。
(水的密度为1.0×103 kg/m3,g取10 N/kg)7.有质量相同的两个实心球,其密度分别为水的密度的2倍和5倍。
把它们分别挂在两个弹簧测力计的下端,然后将两球浸没在水中,此时两球所受浮力之比为,两弹簧测力计的示数之比为。
二、探究创新★8.在探究浮力大小与哪些因素有关的实验中,某小组同学用如图所示的装置,将同一物体分别逐渐浸入到水和酒精中。
为了便于操作和准确收集数据,用升降台调节溢水杯的高度来控制物体排开液体的体积。
2011年考研,离散数学和编译原理怎么复习2010-06-23 10:37离散数学和编译原理前阵子很多人在议论说2010年如果加考离散数学怎么办。
其实,在本科阶段,这两门课是典型的学起来很难而考试出题比较简单的科目。
就算2010年添了离散数学,也肯定占不了太多的分,认真把定义搞懂搞熟,拿个七八成的分不是多大问题。
离散数学蛮多的内容出题和解题的思路都是死的,不像高数有那么多的定理和公式,遇到难题还要拆来凑去啥的。
尤其要注意的一点是——紧扣定义!!打个易懂的比喻,高等数学是求值,线性代数是求解的个数,那么离散数学的一个核心要素就是求元素以及集合之间的相互关系。
不要抱着一种求具体值的思想来解离散数学题。
离散数学和编译原理是学好了很有用的两门课,要钻进去,而不是逃避,因为你当初义无反顾地选择了计算机科学与技术这个振奋人心的专业。
离散数学中的集合论思想对我们思考问题的方式有着巨大帮助,而编译原理是要写出高效能软件所必须掌握的课程。
中国科学技术大学2009年计算机学院考研复试就以笔试形式考了这两门课,100分,占了复试的半壁江山了,可见它们的重要性。
\计算机基础综合的大纲到8月初左右公布,如果真要考的话,我推荐下参考书:<<离散数学>>——方世昌编著西安电子科技大学出版社配套有本绿色的习题解答,写的很详细。
我本科是西电计算机学院的,做过这2本书,感觉不错。
而它更是被指定为这次中科大复试的参考书目,多少具备了一定的权威性。
方世昌老师是个不折不扣的牛人,国内第一本外文算法书教材就是他翻译过来的,我读过一本<<算法设计技巧与分析>>也是他翻译的。
编译原理有些学校复试可能会考,认真研究一下陈意云老师的<<编译原理>>和配套那本薄薄的习题精选(高等教育出版社),就没啥问题了。
关于政治改革和报辅导班听说2010年政治变动蛮大,也不必惊慌,第一次改革一般出题都不会很难。
第十章代码优化某些编译程序在中间代码或目标代码生成之后要对生成的代码进行优化。
所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加大或占用存储空间少,或两者都有。
优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也不同,在同一范围内,可进行多种优化。
一般,优化工作阶段可在中间代码生成之后和(或)目标代码生成之后进行。
中间代码的优化是对中间代码进行等价变换。
目标代码的优化是在目标代码生成之后进行的,因为生成的目标代码对应于具体的计算机,因此,这一类优化在很大程度上依赖于具体的机器,我们不做详细讨论。
另外依据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化三个不同的级别。
局部优化指的是在只有一个入口、一个出口的基本程序块上进行的优化。
循环优化对循环中的代码进行的优化。
全局优化是在整个程序范围内进行的优化。
本章重点:局部优化基本块的DAG表示第一节优化技术简介为了说明问题,我们来看下面这个例子,源程序是:P :=0For I :=1 to 20 doP :=P+A[I]*B[I];经过编译得到的中间代码如图10-1-1所示,这个程序段由B1和B2两个部分组成,B2是一个循环,假定机器按字节编址。
那么,对于这个中间代码段,可进行如下这些优化。
1、删除多余运算(删除公共子表达式)优化的目的在于使目标代码执行速度较快。
图10-1-1中间代码(3)和(6)中都有4*I的运算,而从(3)到(6)没有对I赋值,显然,两次计算机的值是相等的。
所以,(6)的运算是多余的。
我们可以把(6)变换成:T4 :=T1。
这种优化称为删除多余运算或称为删除公共子表达式。
2、代码外提减少循环中代码总数的一个重要办法是代码外提。
这种变换把循环不变运算,即其结果独立于循环执行次数的表达式,提到循环的前面。
使之只在循环外计算一次,上例中,我们可以把(4)和(7)提到循环外。
经过删除多余运算和代码外提后,代码变成图10-1-2。
第1节浮力知能演练提升一、能力提升1.下列关于浮力的说法正确的是()A.只有浸在液体里的物体才受到浮力,在空气中的物体不受浮力B.乒乓球和玻璃球,浸在水中,乒乓球受到浮力,玻璃球不受浮力C.物体浸在液体中,由于受到浮力,物体的重力要变小D.铁球浸没在水中缓慢下沉时,弹簧测力计示数不变,说明铁球所受浮力不变2.在浅海中潜入海底观光是人们旅游休闲的方式之一。
人从水下2 m继续下潜的过程中受到海水的浮力和压强变化的情况是()A.浮力逐渐变小B.浮力逐渐变大C.压强逐渐变小D.压强逐渐变大3.有一铜块挂在弹簧测力计上,将铜块浸入水中并保持静止时,弹簧测力计的示数表示()A.铜块的体积B.铜块的重力C.铜块受到的浮力D.铜块的重力和浮力之差4.两手分别拿着一小木块和一大石块,把它们都浸没到水中,同时松开手,小木块上浮,大石块下沉,则它们受到的浮力()A.因为木块上浮,所以木块受到的浮力较大B.因为石块下沉,所以石块受到的浮力较小C.因为木块体积较小,所以木块受到的浮力较大D.因为石块体积较大,所以石块受到的浮力较大5.小聪利用如图所示的器材对浮力大小与哪些因素有关进行了以下探究:①选择器材a、c、d、e探究浮力的大小是否与物体浸在液体中的体积有关。
②选择器材a、d、e、f探究浮力的大小是否与液体的密度有关。
③选择器材a、b、d、e探究浮力的大小是否与物体的密度有关。
小聪在上述过程中采用的研究方法主要是()A.比值法B.等效法C.控制变量法D.估算法6.用一弹簧测力计挂着一实心圆柱体,圆柱体的底面刚好与水面接触(圆柱体未浸入水中),如图甲所示,然后将其逐渐浸入水中,图乙所示是弹簧测力计示数随圆柱体逐渐浸入水中深度的变化情况,则圆柱体受到的最大浮力是。
7.如图所示,一个棱长为10 cm的正方体悬浮在水中,上表面受到水的压力F1为5 N,下表面受到水的压力F2为13 N。
则正方体受到的浮力为 N,正方体上表面到水面=1×103 kg/m3)的距离为 cm。
第10章 具有约束方程的最优化 10.1 基本约束优化问题 10.2 一阶必要条件 10.3 二阶充分条件10.4 最优解的比较静态分析 10.5 Lagrange 乘子的数学含义 10.6 目标函数最优值的比较静态分析10.1 基本约束优化问题 一般标准的极大化问题:12max (,,,)n f x x x L 或者:max ()f x 12..(,,,)j n j s t g x x x b ≤L ..()s t g x b ≤12(,,,)i n i h x x x a =L ()h x a =一般标准的极小化问题:12min (,,,)n f x x x L 或者:min ()f x 12..(,,,)j n j s t g x x x b ≥L ..()s t g x b ≥12(,,,)i n i h x x x a =L ()h x a =10.2+10.3:一阶必要条件和二阶充分条件 1、等式约束优化问题(1)两个变量一个等式约束的情形极大化问题: max (,)f x y..(,)s t h x y c = 例:消费者的效用最大化问题 12max (,)U x x1122..s t p x p x I += 构造拉格朗日函数:(,,)(,)[(,)]L x y f x y h x y c λλ=-- (,)[(,)]f x y c h x y λ=+-一阶必要条件:(,)0L c h x y λ=-= 0x x x L f h λ=-= 0y y y L f h λ=-=注:通过将L 视为三个选择变量的自由函数,将约束优化转化为了无约束优化。
拉格朗日乘数的解释:λ*是Z*(最优值)对约束变化敏感性的度量。
特别的,c 增加(预算增加)的影响表明约束条件的放宽如何影响最优解。
设:根据一阶必要条件得到的最优解为λ*,*x ,*y ,则λ*,*x ,*y 满足:(*,*)0L c h x y λ=-=(*,*)*(*,*)0x x x L f x y h x y λ=-= (*,*)*(*,*)0y y y L f x y h x y λ=-= 最优值为:*(*,*)*[(*,*)]L f x y c h x y λ=+-由三个必要条件,可以确定:**()x x c =,**()y y c = 因此,L*对c 的导数:****[(*,*)]***(1)x y x y dL dx dy d f f c h x y dc dc dc dc dx dy h h dc dc λλ=++-+-- **(*)(*)x x y y dx dy f h f h dc dc λλ=-+- *[(*,*)]*d c h x y dcλλ+-+ =λ*结论:拉格朗日乘数的解值是由参数c 引起的约束条件变化对目标函数最优值影响的度量。
第十章 罚函数法罚函数是利用目标函数与约束函数一起构成的具有惩罚性质的函数。
当约束条件被破坏时,施以惩罚,可以想象,当这种惩罚很大时,将迫使迭代点趋于可行点。
§10.1 外罚函数法对一般非线性规划问题:1m in ()()01,,. ()0,,i e i e f x c x i m s t c x i m m+==⎧⎨≥=⎩ (10.1)定义违反约束度函数:()()()1,i i e c x c x i m -== (10.2)()1()m in{0,()} ,m ii e c x c x i m -+== 。
(10.3)罚函数一般表示为: ()()()(())P x f x h c x -=+ (10.4) 其中()(())h c x -是惩罚项,这个函数一般具有(0)0h =,lim ()c h c →+∞=+∞。
较常用的形式为: ()()()()P x f x cx ασ-=+ (0σ>称为罚因子) (10.5)注:1) 在上式中,范数常取为2 ,若取为∞ 或1 会导致()P x 不光滑。
2) 当取2 和1α>时,()P x 的光滑性可由()22(())(m in{0,()})i cx c x -=直接验证。
事实上,在“转折点”处,可证得左、右导数均为0,由此可得()2(())cx -光滑性,从而()P x 光滑。
Courant 函数是最早使用的罚函数,也是最方便最重要的一种罚函数。
其形式为2()2(,)()()p x f x cx σσ-=+1221`()()(m in{0,()})ee m miii m f x cx c x σσ+==++∑∑ (10.6)以下考虑一般的罚函数问题()(,)()()p x f x cx ασσ-=+ (10.7)并且以后总用()x σ表示罚问题()m in nx RP x σ∈ 的解。
引理1 设210σσ>>,则必有21(())(())f x f x σσ≥()()21(())(())cx cx σσ--≤。
题组一连贯1.把下列句子组成语意连贯的语段,排序最恰当的一项是()①使用语言,不仅要用得对,在语法上不出毛病,而且要力求用得好,要有艺术性,有感染力,这就要讲究运用语言的艺术,也就是要讲究一点修辞。
②有意用不符合语法常规的办法取得某种修辞效果是许可的,然而这只是偶一为之,并且要有些特定的条件。
③如果语言不符合语法,说都说不通,就没有什么好的修辞可言。
④语言是用来传递信息、交流思想、表达感情的。
⑤好的修辞,必然是符合语法规律的。
A.④①⑤③②B.④③⑤①②C.⑤②①④③D.⑤③④①②解析:选A。
④句是点明说明对象“语言”,是句段的总起句,放在开头;①紧承第④句,说明语言的运用需要“讲究一点修辞”;⑤句承接前句说明“好的修辞”的条件是“符合语法规律的”;③句从反面说明“语言不符合语法”“就没有什么好的修辞可言”;②句补充说明,针对“有意用不符合语法常规的办法”的特例,指出这种情况是有条件的。
因此,正确的顺序为④①⑤③②。
2.依次填入下面一段文字横线处的语句,衔接最恰当的一组是()我国是食品生产和消费大国,________,________,________,________,________,________。
这样才能有效解决食品安全领域损害群众利益的突出问题,切实增强消费安全感。
①强化执法措施,严惩违法犯罪分子②食品产业涉及环节多,哪一环出现漏洞都会给食品安全带来严重威胁③创新食品安全监管机制④坚决淘汰劣质企业,以震慑所有企业使之不敢越雷池半步⑤保障食品安全需要生产经营者诚信自律,更需要严格的法律制度约束和有效监管⑥因此,必须保持严厉打击违法违规行为的态势,及时消除各环节的隐患A.②⑥①③④⑤B.②⑤⑥①④③C.⑤②⑥③①④D.⑤⑥②④③①解析:选C。
②句说食品产业环节多,容易出问题,⑥句说必须严厉打击违法违规行为,才能消除各环节的隐患,所以②⑥关系最密切,排除B、D。
⑤提出总的观点,说明保障食品安全“需要严格的法律制度约束和有效监管”,其他的几句都是围绕着两个方面展开的,所以⑤在前,排除A。
第十章优化知识结构:概述基本块的划分局部优化基本块的DAG表示DAG的应用优化程序流图循环优化循环优化数据流分析第一节概述一、优化的原则1、等价原则经过优化后不应改变程序运行的结果。
2、有效原则使优化后生成的目标代码运行的时间较短,占用的存储空间较小。
3、合算原则应尽可能以较低的代价取得较好的优化效果。
二、优化的分类1、与计算机无关的优化是在中间代码级上不依赖具体计算机的优化。
只注重于程序的结构,对程序流程进行有效性、等价性的处理。
⑴局部优化对只有一个入口和一个出口,并且程序结构是顺序结构的程序段进行优化(基本块内的优化)。
采用的技术:①合并已知量(编译时对常数直接进行运算);②消除多余运算(公共子表达式);③消除无用赋值(无用代码)。
⑵循环优化对循环语句产生的中间代码进行优化。
采用的技术:①代码外提(循环不变运算的外提);②强度消弱;③删除归纳变量(循环控制条件的改变)。
⑶全局优化非线性程序段上(包含多个基本块)的优化,需要分析程序控制流、数据流。
2、依赖计算机的优化依赖具体计算机的硬件环境,在生成目标代码时进行优化。
三、中间代码优化技术的概述例:求两个数组积的Pascal程序段PROD := 0;For I:=1 to 20 doPROD := PROD+ A[I]*B[I]其中:数组元素按字节编写地址;每个元素占4个字节。
⑴数组元素地址为addr(A)+(I-1)*4=addr(A)-4+4*I四元式中间代码为:⑵删除公共子表达式某些运算在程序段中多次出现,而在相继两次出现之间又没有改变其运算的结果,优化时只是引用结果。
如:⑶ T1:=4*I┆…无对I重新赋值⑹ T4:=4*I优化后为T4=T1。
⑶代码外提对于运算结果在循环重复执行的过程中是不变的,将其运行代码提到循环体外执行一次。
如:⑷ T2:=addr(A)-4⑺ T5:=addr(B)-4把⑷⑺从循环内中。
⑷ 削弱强度把乘法运算用加法运算(加减法运算速度快)。
如:I:=1,T 1:=4*I (初值),⑶T 1:=4*I 改为 T 1:=T 1+4⑸ 删除归纳变量(变换控制条件)控制变量和某些计算随着循环的重复执行保持同步变化,利用计值结果作为控制变量。
如:T1:=4*I(T1与I存在线性关系),用T1作为控制条件。
⑿ if I≤20 goto (5)优化后if T1≤80 goto(5)。
⑹合并已知量编译时已知的运算量在编译时计算出来。
如:⑵I:=1,⑶T1:=4*I(已知量)优化后为T1:=4。
⑺复写传播两个不同的运算对象,在相继出现之间结果相同,采用替换方式,如:⑹T4:=T1,⑻T6:=T5[T4]优化后为⑻T6:=T5[T1]。
⑻删除无用赋值删除在程序运行中没有任何作用的代码。
如:⑵、⑹、⑾均为无用赋值(删除)。
四、诊断编译程序和优化编译程序优化编译程序:着重于提高目标代码效率的编译程序称优化编译程序。
优化需要花费大量编译时间,若一个简单编译程序只需实现基本翻译功能,那么该编译程序可以不需要优化部分。
诊断编译程序:专门用于帮助程序开发和调试的编译程序称诊断编译程序, 该编译程序一般不包含优化部分。
第二节局部优化对一个给定的程序,把它划分为一系列的基本块。
在各个基本块范围内,分别进行优化。
局限于基本块范围内的优化称为基本块内的优化(或称为局部优化)。
一、基本块及其流图1、基本块⑴是指程序中一个顺序执行的语句序列。
⑵其中只有一个入口和一个出口,入口就是其中的第一个语句,出口就是其中的最后一个语句。
⑶对一个基本块来说,执行时只能从其入口进入,从其出口退出。
例一个基本块的三地址语句序列:T1:=a*bT2:=a*bT3:=2*T2T4:=T1+T2T5:=b*bT6:=T4+T52、划分基本块的算法⑴求出四元式程序中各个基本块的入口语句。
①程序的第一个语句;②能由条件转移语句或无条件转移语句转移到的语句;③紧跟在条件转移语句后面的语句。
⑵对每一入口语句,构造其所属的基本块。
它是由该入口语句到另一入口语句(不包括该入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序列组成的。
⑶凡未被纳入某一基本块中的语句,都是程序中控制流程无法到达的语句,从而也是不会被执行到的语句,把它们从程序中删除。
例考察下列三地址代码程序求最大公因子程序:(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程序流图:程序流图是以每个基本块为一个结点,B1到B2构造有向边:①B2紧跟在B1之后,并且B1的最后一条语句不是一条无条件转移语句;②有一个条件转移语句或无条件转移语句从B1的最后一条语句转移到B2的第一条语句。
注意: 程序流图与程序流程图不同,上例程序流程图如下:二、基本块内的优化(利用DAG图优化)1、删除公共子表达式T1:=4*IT4:=4*I优化后为 T4:= T12、删除无用赋值R := X (无用赋值,优化后删除)A :=B+CR := YR:=R (无用赋值,优化后删除)无用赋值的规定:①对变量R赋值后,R的值不在被引用;②对变量R赋值后,R的值在被引用前又被重新赋值;③对变量R进行递归赋值,R的值仅在递归赋值时被引用。
3、变换技术(P280)⑴合并已知量运算对象是已知量的,可以在编译时计算出它的值,而不必等到程序运行时再计算。
如T1:=2和T2:=4*T1,优化后为 T2:=8。
⑵临时变量改名通过改变临时变量名,可以把一个基本块变换成等价的另一个基本块。
⑶交换语句的位置再不影响基本块的值的条件下,有时交换语句的次序,可产生更高效的代码。
⑷代数变换对于表达式求值,用代数上的等价的形式替换,以其使复杂运算变成简单运算。
三、基本块的DAG的应用1、确定基本块内的公共子表达式;2、确定哪些名字在基本块内使用,而在基本块外定值;3、确定在基本块内,哪些运算的值,在基本块外被引用。
四、DAG(有向图)的表示形式1、任一有向边n i n j,有序对(n i,n j)中的n i为n j的前驱结点,n j为n i的后继结点。
2、任一有向边n1 n2,n2 n3,⋯,n k-1 n k对应结点序对(n1,n2,⋯,n k)为从n1到达结点n k的一条通路。
3、如果n1=n k则称该通路为环路,如(n2,n2),(n1,n2,n1)。
4、如果有向图中任一通路都不是环路,则称该有向图为无回路有向图(DAG )。
五、DAG 的标识方法各结点中的n i 是构成有向图(DAG )各结点的编号。
1、叶结点(无后继结点)的标识方法⑴ 访问变量或常数标识为A 3.0⑵ 访问变量地址标识为addr(B)2、内部结点用运算符做标识T 1 :=A+B 1A B内部结点n 3 以“+”作为标记,表示该结点代表其后继结点n 1,n 2所代表的值进行“+”运算的结果。
3、各结点附加符号的标识方法⑴ 表示结果值所引用的变量。
如上例 T 1, T 5具有结点n 3所代表求和的值⑵ 表示该结点为转移语句结点,指示转移目标地址。
(s )4、数组元素的赋值结点的标识B C B C A五、中间代码的DAG 结点表示类型中间语言 DAG 结点0型 A:=B (:=,B,-,A )1型 A:=op B(op,B,-,A)A2型3型 D[C]:=B ([]=,B,-,D[C]) 如上图所示goto (s) 如上图所示 六、构造基本块DAG 算法函数NODE(A)用于查表,如果查到, 函数值为代表A 的最新的结点号。
对A := B ,A := op B ,A := B op C 三种中间代码构造DAG 图。
操作步骤:⑴若NODE(B)=null(无定义),则构造一个标记为B 的叶结点并定义NODE(B)为这个结点。
若当前四元式是0型,则记NODE(B)=n ,转⑷;若当前四元式是1型,则转⑵①;若当前四元式是2型, 则当NODE(C)=null(无定义),则构造标记为C的叶结点并定义NOD(C)为这个结点,转⑵②;⑵①若NODE(B)是标记为常数的叶结点,则转⑵③,否则转⑶①。
②如果NODE(B)和NODE(C)都是标记为常数的叶结点,则转⑵④,否则转⑶②。
③执行OP B(即合并已知量),操作得到新的常数P。
若NODE(B)是处理当前四元式新构造出来的结点,则删除它。
如果NODE(P)无定义,则构造一用P做标记的叶结点n,置NODE(P)=n,转⑷。
④执行B OP C(即合并已知量),令得到的新常数为P。
如果NODE(B)或NODE(C)是处理当前四元式时新构造出来的结点,则删除它。
若NODE(P)无定义,则构造一个用P做标记的叶结点n,置NODE(P)=n,转⑷。
⑶①检查DAG中是否已有一结点,其唯一后继为NODE(B)且标记为OP(即找公共子表达式)。
如没有,就构造该结点为n,否则就把已有的结点就作为它的结点并设该结点为n,转⑷。
②检查DAG图中是否已有结点,其左后继为NODE(B),右后继为NODE(C),且标记为OP(即找公共子表达式)。
如果没有,则构造该结点n,否则就把已有的结点作为它的结点并设该结点为n,转⑷。
⑷如果NODE(A)无定义,则把符号A附加在结点n上,并令NODE(A)=n;若NODE(A)已有定义,则应按下列几种情况,决定是否将A从原来NODE(A)结点上的附加标识符中删除。
①若NODE(A)结点有前驱,分下列情况处理:a、若NODE(A)结点上有其它附加标识符,则把A删除。
b、若NODE(A)结点上无其它附加标识符,则不能删除A。
T := B OP K T := A OP K可删除A 不能删除A②若NODE(A)结点无前驱,分下列情况处理a、若NODE(A)结点是叶结点,且有其它附加标识符,则不能删除A。
b、若NODE(A)结点是叶结点,若无其它附加标识符,则删除A。
c、若NODE(A)结点不是叶结点,则删除AB := A A := 3C D不能删除A 删除A删除A例:试构造以下基本块G的DAG(1)T:=3.14(2)T1:=2*T(3)T2:=R+r(4)A:=T1*T2(5)B:=A(6)T3:=2*T(7)T4:=R+r(8)T5:=T3*T4(9)T6:=R-r(10)B:=T5*T600T T13.14 3.14 6.28 3.14 6.28 R r(a) (b) (c)T03.14 6.28 R r 3.14 6.28 R r(d) (e)T4 0T03.14 6.28 R r 3.14 6.28 R r(f) (g)2T7 0T03.14 6.28 R r 3.14 6.28 R r(h) (i)T63.14 6.28 R r(j)六、由DAG图生成优化的中间代码按原来构造结点的顺序,生成优化后的代码,上例生成的优化后代码序列为:优化前的代码优化后的代码(1)T0:3.14 (1)T:=3.14(2)T1:=2*T(2)T1:=6.28 合并已知量(3)T2:=R+r (3)T3:=6.28(4)A:=T1*T2(4)T2:=R+r(5)B:=A (5)T4:=T2删除公共子表达式(6)T3:=2*T(6)A:=6.28*T2(7)T4:=R+r (7)T5:=A(8)T5:=T3*T4(8)T6:=R-r(9)T6:=R-r (9)B:=A*T6(10)B:=T5*T(11)T6:=R*r假设T0 T1 T2 T3 T4 T5在基本块后都不会被引用,优化后的代码:(4)S1:=R+r(6)A:=6.28*S1(8)S2:=R-r(9)B:=A*S2第三节循环优化编译程序首先需要判断程序中哪些部分构成循环,再进行循环优化。