编译原理(11)
编译原理第十一章解析

26
此处要用到的有向图,是一种其结点带有下述标记或附 加信息的DAG: ① 图的叶结点,即无后继的结点,以一标识符(变 量名)或常数作为标记,表示这个结点代表该变量或常数 的值。如果叶结点用来代表某变量A的地址,则用addr (A)作为这个结点的标记。通常把叶结点上作为标记的 标识符加上下标0,以表示它是该变量的初值。 ② 图的内部结点,即有后继的结点,以一运算符作为 标记,表示这个结点代表应用该运算符对其后继结点所代 表的值进行运算的结果。 ③ 图中各个结点上可能附加一个或多个标识符,表 示这些变量具有该结点所代表的值。
30
下面是仅含0,1,2型四元式的基本块的DAG构造算法。
首先,DAG为空。 对基本块的每一四元式,依次执行: 1. 如果NODE(B)无定义,则构造一标记为B的叶结点并定 义NODE(B)为这个结点; 如果当前四元式是0型,则记NODE(B)的值为n,转4。 如果当前四元式是1型,则转2.(1)。 如果当前四元式是2型,则:(Ⅰ)如果NODE(C)无定义, 则构造一标记为C的叶结点并定义NODE(C)为这个结点,(Ⅱ) 转2.(2)。 2. (1) 如果NODE(B)是标记为常数的叶结点,则转2.(3), 否则转3.(1)。 (2) 如果NODE(B)和NODE(C)都是标记为常数的叶结 点,则转2.(4),否则转3.(2 (3) 执行op B(即合并已知量),令得到的新常数为P。如 果NODE(B)是处理当前四元式时新构造出来的结点,则删除它。 如果NODE(P)无定义,则构造一用P做标记的叶结点n。置NODE (P)=n,转4.。 (4) 执行B op C(即合并已知量),令得到的新常数为P。如 果NODE(B)或NODE(C)是处理当前四元式时新构造出来的结 点,则删除它。如果NODE(P)无定义,则构造一用P做标记的叶 结点n。置NODE(P)=n,转4.。
编译原理第六章到第十一章课后习题答案

编译原理第六章到第十一章课后习题答案p116/1.已知文法G[S]为:S→a|∧|(T)T→T,S|S(1) 计算FIRSTVT -- LASTVT表(2) 构造算符优先关系表(OPERATER PRIORITY RELATION TABLE),说明是否为算符优先文法。
=: #=#, (=)<: (< FIRSTVT(T) , ,<firstvt(s)<="" ,="" p="">>:LASTVT(S)># , LASTVT(T)>), LASTVT(T)> ,表中无多重人口所以是算符优先(OPG)文法。
(3)计算G[S]的优先函数。
收敛(4)对输入串(a,a)#的算符优先分析过程为Success!3.有文法G(S):s->Vv->T/ViTT->F/T+FF->)V*|((1)(+(i(的规范推导S=>V=>ViT=>ViF=>Vi(=>Ti(=>T+Fi(=>T+(i(=>F+(i(=>(+(i((2)F+Fi(的短语、句柄、素短语。
短语S: F+Fi(T1:F+F (素短语)T2:F (句柄)F:( (素短语)(3) G(S)是否为OPG?若是,给出(1)中句子的分析过程!S’->#S# S->V V->T/ViT T->F/T+F F->)V*|(算符优先关系表(OPERATER PRIORITY RELATION TABLE)对输入串(+(I(的算符优先分析过程为:p152/2文法:S→L.L|LL→LB|BB→0|1拓广文法为G′,增加产生式S′→SI3若产生式排序为:0 S' →S1 S →L.L2 S →L3 L →LB4 L →B5 B →06 B →1由产生式知:First (S' ) = {0,1}First (S ) = {0,1}First (L ) = {0,1}First (B ) = {0,1}Follow(S' ) = {#}Follow(S ) = {#}Follow(L ) = {.,0,1,#}Follow(B ) = {.,0,1,#}G′的LR(0)项目集族及识别活前缀的DFA如下图所示:I5B →.0和B →.1为移进项目,S →L.为归约项目,存在移进-归约冲突,因此所给文法不是LR(0)文法。
《编译原理》期末复习资料(完整版)

1.给出语言{a n b n a m b m | n,m≥0}的一个上下文无关文法。
(6分)解:G[S]:S—>ABA—>aAb |εB—>aBb |ε2.给出语言{1 n 0 m 1 m0 n | n,m≥0}的一个上下文无关文法。
解:G[S]:S—>1S0 | AA—>0A1 |ε3.P48 第6题(5)、(6).画语法树6、已知文法G:<表达式>::=<项>|<表达式>+<项><项>::=<因子>|<项>*<因子><因子>::=(<表达式>)|i(5)i+(i+i) (6)i+i*i解:(5)语法树:(6)语法树:4.P48第13题直接短语等13、一个上下文无关文法生成句子abbaa的推导树如下:(3)求直接短语解:直接短语有:a ε bP102例题6.1及其分析.( 后加画语法树)例6.1 设文法G[S]为:(1)S—>aAcBe(2)A—>b(3)A—>Ab(4)B—>d对输入串abbcde#进行分析,检查该符号串是否是G[S]的句子。
步骤符号栈输入符号串动作(1)# abbcde# 移进(2)#a bbcde# 移进(3)#ab bcde# 归约(A—>b)(4)#aA bcde#移进(5)#aAb cde# 归约(A—>Ab)(6)#aA cde# 移进(7)#aAc de# 移进(8)#aAcd e# 归约(B—>d)(9)#aAcB e# 移进(10)#aAcBe # 归约(S—>aAcBe)(11)#S # 接受一、计算分析题(60%)1、正规式→ NFA→ DFA→最简DFAP72第1题(1)、(4);第一题1、构造下列正规式相应的DFA.(1)1(0|1)*101解:先构造NFA0 1S AA A ABAB AC ABAC A ABZABZ AC AB除S,A外,重新命名其他状态,令AB为B、AC为C、ABZ为D,因为D含有Z(NFA的终态),所以0 1S AA A BB C BC A DD C B(4) b((ab)*|bb)*ab解:先构造NFA得到DFA如下所示:P72第4题(a)4、把下图确定化和最小化解:确定化:a b0 01 101 01 11 0、{1},其中A为初态,A,B为终态,因此有:a bA B CB B CC A最小化::初始分划得终态组{A,B},非终态组{C}Π0:{A,B},{C},对终态组进行审查,判断A和B是等价的,故这是最后的划分。
编译原理课后答案-第二版

第三章1、L(G[S])={ abc }2、L(G[N])={ n位整数或空字符串| n>0 }3、G[E]:E—>E+D | E-D | DD—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 94、L(G[Z])={ a n b n | n>0 }5、(1) 考虑不包括“0”的情况G[S]:S—>0S | ABC | 2 | 4| 6 | 8A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B—>AB | 0B | εC—>0 | 2 | 4 | 6 | 8考虑包括“0”的情况:G[S]:S—>AB | CB—>AB | CA—>0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9C—>0 | 2 | 4 | 6 | 8(2)方法1:G[S]:S—> ABC | 2 | 4 | 6 | 8A—>1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9B—>AB | 0B | εC—>0 | 2 | 4 | 6 | 8方法2:G[S]:S—>AB | CB—> AB | 0B | C | 0A—> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9C—>2 | 4 | 6 | 86、设<表达式>为E,<项>为T,<因子>为F,注:推导过程不能省略,以下均为最左推导(1) E => T => F => i(4) E => E+T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i(6) E => E+T => T+T => F+T => i+T => i+T*F => i+F*F => i+i*F => i+i*I7、<表达式><表达式>*<表达式><表达式>+<表达式>i i i<表达式><表达式>+<表达式>i <表达式>*<表达式>i i8、是有二义性的,因为句子abc 有两棵语法树(或称有两个最左推导或有两个最右推导)最左推导1:S => Ac => abc 最左推导2:S => aB => abc 9、(1)(2) 该文法描述了变量a 和运算符+、*组成的逆波兰表达式10、(1) 该文法描述了各种成对圆括号的语法结构(2) 是有二义性的,因为该文法的句子()()存在两种不同的最左推导: 最左推导1:S => S(S)S => (S)S => ()S => ()S(S)S => ()(S)S => ()()S => ()()最左推导2:S => S(S)S => S(S)S(S)S => (S)S(S)S=> ()S(S)S => ()(S)S => ()()S => ()()11、(1) 因为从文法的开始符E 出发可推导出E+T*F ,推导过程如下:E => E+T =>E+T*F ,所以E+T*F 是句型。
编译原理课后答案

第二章 高级语言及其语法描述4.令+、*和↑代表加,乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值:(1) 优先顺序(从高至低)为+,*和↑,同级优先采用左结合。
(2) 优先顺序为↑,+,*,同级优先采用右结合。
解:(1)1+1*2↑2*1↑2=2*2↑1*1↑2=4↑1↑2=4↑2=16 (2)1+1*2↑2*1↑2=1+1*2*1=2*2*1=2*2=46.令文法G6为 N →D|NDD →0|1|2|3|4|5|6|7|8|9 (1) G6 的语言L (G6)是什么?(2) 给出句子0127、34和568的最左推导和最右推导。
解:(1)L (G6)={a|a ∈∑+,∑=﹛0,1,2,3,4,5,6,7,8,9}}(2)N =>ND => NDD => NDDD => DDDD => 0DDD => 01DD => 012D => 0127 N => ND => N7=> ND7=> N27=> ND27=> N127=> D127=> 0127 N => ND => DD => 3D => 34 N => ND => N4=> D4 =>34N => ND => NDD => DDD => 5DD => 56D => 568 N => ND => N8=> ND8=> N68=> D68=> 5687.写一个文法,使其语言是奇数集,且每个奇数不以0开头。
解:A →SN, S →+|-|∑, N →D|MDD →1|3|5|7|9, M →MB|1|2|3|4|5|6|7|8|9 B →0|1|2|3|4|5|6|7|8|9 8. 文法:E T E T E T TF T F T F F E i→+-→→|||*|/()| 最左推导:E E T T TF T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+********()*()*()*()*()*()*()最右推导:E E T E TF E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+⇒+**********()*()*()*()*()*()*()*()语法树:/********************************EE FTE +T F F T +iiiEEFTE-T F F T -iiiE EFT+T F FTiii*i+i+ii-i-ii+i*i*****************/9.证明下面的文法是二义的:S → iSeS|iS|I解:因为iiiiei 有两种最左推导,所以此文法是二义的。
编译原理课后习题答案

编译原理课后习题答案第一章1.典型的编译程序在逻辑功能上由哪几部分组成?答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。
2. 实现编译程序的主要方法有哪些?答:主要有:转换法、移植法、自展法、自动生成法。
3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式?答:编译法、解释法。
4. 编译方式和解释方式的根本区别是什么?答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。
第二章1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关系如何?答:1)0型文法、1型文法、2型文法、3型文法。
2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。
答:Z→SME | BS→1|2|3|4|5|6|7|8|9M→ε | D | MDD→0|SB→2|4|6|8E→0|B3. 设文法G为:N→ D|NDD→ 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。
答:N?ND?N3?ND3?N23?D23?123N?ND?NDD?DDD?1DD?12D?123N?ND?N1?ND1?N01?D01?301N?ND?NDD?DDD?3DD?30D?301N?ND?N1?ND1?N31?ND31?N431?ND431?N5431?D5431?7 5431N?ND?NDD?NDDD?NDDDD?DDDDD?7DDDD?75DDD?754 DD?7543D?75431 4. 证明文法S→iSeS|iS| i是二义性文法。
答:对于句型iiSeS存在两个不同的最左推导:S?iSeS?iiSesS?iS?iiSeS所以该文法是二义性文法。
编译原理课后第十一章答案

对假设(2) B:=3 D:=A+C E:=A*C F:=D+E K:=B*5 L:=K+F
计算机咨询网()陪着您
10
《编译原理》课后习题答案第十一章
第7题 分别对图 11.25 和 11.26 的流图: (1) 求出流图中各结点 n 的必经结点集 D(n)。 (2) 求出流图中的回边。 (3) 求出流图中的循环。
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
i:=m-1 j:=n t1:=4*n v:=a[t1] i:=i+1 t2:=4*i t3:=a[t2] if t3< v goto (5) j:=j-1 t5:=4*j t5:=a[t4] if t5> v goto (9) if i >=编译原理》课后习题答案第十一章
第 5 题: 如下程序流图(图 11.24)中,B3 中的 i∶=2 是循环不变量,可以将其提到前置结点吗? 你还能举出一些例子说明循环不变量外移的条件吗?
图 11.24 答案: 不能。因为 B3 不是循环出口 B4 的必经结点。 循环不变量外移的条件外有: (a)(I)s 所在的结点是 L 的所有出口结点的必经结点 (II)A 在 L 中其他地方未再定值 (III)L 中所有 A 的引用点只有 s 中 A 的定值才能到达 (b)A 在离开 L 之后不再是活跃的,并且条件(a)的(II)和(III)成立。所谓 A 在离开 L 后不再是活跃的是指,A 在 L 的任何出口结点的后继结点的入口处不是活跃的(从此点后 不被引用) (3)按步骤(1)所找出的不变运算的顺序,依次把符合(2)的条件(a)或(b)的 不变运算 s 外提到 L 的前置结点中。如果 s 的运算对象(B 或 C)是在 L 中定值的,则只有 当这些定值四元式都已外提到前置结点中时,才可把 s 也外提到前置结点。
编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)编译原理(龙书)课后题解答第一章1.1.1 :翻译和编译的区别?答:翻译通常指自然语言的翻译,将一种自然语言的表述翻译成另一种自然语言的表述,而编译指的是将一种高级语言翻译为机器语言(或汇编语言)的过程。
1.1.2 :简述编译器的工作过程?答:编译器的工作过程包括以下三个阶段:(1) 词法分析:将输入的字符流分解成一个个的单词符号,构成一个单词符号序列;(2) 语法分析:根据语法规则分析单词符号序列中各个单词之间的关系,确定它们的语法结构,并生成抽象语法树;(3) 代码生成:根据抽象语法树生成目标程序(机器语言或汇编语言),并输出执行文件。
1.2.1 :解释器和编译器的区别?答:解释器和编译器的主要区别在于执行方式。
编译器将源程序编译成机器语言或汇编语言等,在运行时无需重新编译,程序会一次性运行完毕;而解释器则是边翻译边执行,每次执行都需要进行一次翻译,一次只执行一部分。
1.2.2 :Java语言采用的是解释执行还是编译执行?答:Java一般是编译成字节码的形式,然后由Java虚拟机(JVM)进行解释执行。
但是,Java也有JIT(即时编译器)的存在,当某一段代码被多次执行时,JIT会将其编译成机器语言,提升代码的执行效率。
第二章2.1.1 :使用BNF范式定义简单的加法表达式和乘法表达式答:<加法表达式> ::= <加法表达式> "+" <乘法表达式> | <乘法表达式><乘法表达式> ::= <乘法表达式> "*" <单项式> | <单项式><单项式> ::= <数字> | "(" <加法表达式> ")"2.2.3 :什么是自下而上分析?答:自下而上分析是指从输入字符串出发,自底向上构造推导过程,直到推导出起始符号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8
9
B2
T6:=T5[T1]
T7:=T3*T6 T1=T1+4
B2
10 P:=P+T7 3‘ 12 If T1<=80 goto (5)
经过优化以后执行效率大大提高
12
11.2 局部优化
局部优化是指基本块内的优化。
基本块定义:
1. 2. 3. 指程序中一顺序执行的语句序列; 只有一个入口语句和一个出口语句。 执行时只能从入口语句进入,从出口语句退出。
2.
代码外提
此优化的目的在于减少循环中代码总数。 把循环中不变运算,即其结果独立于循环执行次数的表达 式,提到循环外(前面)。 使之只在循环外计算一次。 将(4)和(7)提到循环外
6
经过删除公共子表达式和外提代码后的中间代码
1 2 P:=0 I:=1
B1
4
7
虽然仍然是12行中间代码 存贮空间没有省。
19
用 DAG 进行基本块的优化
四元式
0型: A:=B(:=,B, —,A)
DAG结点
n1 n1
A
B
n2 n2 A
1型:
A:=op B(op,B, —,A)
op n1 n1 B
n3
A op n1 n1 B
n2 n2
2型: A:=B
op C(op, B, C,A)
C
20
用 DAG 进行基本块的优化
范围
依据优化所涉及的程序范围,优化可分为局部优化、循环优化和全 局优化。
3
11.1 优化技术简介
局部优化:指的是在只有一个入口、一个出口的基本程序块上进行的优 化。(基本块优化,通过DAG图优化。)
循环优化:是对循环中的代码进行优化。(依据控制流,循环中代码优 化,包括代码外提和强度消弱等。)
2
2. 知识要点
11.1 优化技术简介
定义
所谓优化,实质上是对代码进行等价变换,使得变换后的代码运行 结果与变换前代码运行结果相同,而运行速度加大或占用存贮空间 减少。 优化可在编译的不同阶段进行,对同一阶段,涉及的程序范围也有 所不同,在同一范围内,可进行多种优化。
阶段
优化工作阶段可在中间代码生成后或目标代码生成后进行。对中间 代码优化相对要简单(与机器无关的优化);对目标代码优化相对 要复杂,因为目标代码是针对具体计算机的(依赖计算机的优化)。
T4:=T1
T6:=T5[T4] T7:=T3*T6 P:=P+T7 I:=I+1 T1=T1+4 If I<=20 goto (5)
8
B2
4.
变换循环控制条件
中间代码中,I和T1始终保持T1=4*I的线性关系; 把四元式(12)的循环控制条件I≤20变换成T1≤80, 这样整个程序的运行结果不变。 这种变换称为变换循环控制条件。 变换后,循环中I的值在循环后不会被引用,四元式 (11)成为多余运算,可以从循环中删除。 变换循环控制条件可以达到代码优化的目的。
10
6. 删除无用赋值
(6)对T4赋值,但T4未被引用; (2)和(11)对I赋值,但只有(11)引用I。
(6),(2)和(11)对程序的运行结果无任何作用。
我们称之为无用赋值,无用赋值可以从程序中删除。
11
中间代码
1
1 2 P:=0 I:=1
P:=0
T2:=addr(A)-4 T5:=addr(B)-4 T1:=4
14
3.
程序的控制流图 把一个程序划分成若干基本块后,可以按 照程序的执行过程用有向边把基本块连接 起来,这就构成了程序的控制流图。 流图是一个具有唯一首结点的有向图。 流图G可以表示为:G=(N,E,n0)。
1. N是流图的所有的结点的集合,流图中的结点 就是基本块; 2. n0是流图的首结点; 3. E是流图的所有的有向边组成的集合。
3.
4.
如果当前四元式是1型,则转2(1)。
如果当前四元式是2型,则:如果NODE(1)无定义,则构造一标 记为C的叶结点并定义NODE(1) 为这个结点;转2 (2)
将DAG定义为一个特殊的数据结构:在其中存放着DAG的各个结点信息,包括
每个结点的标注信息(常数或者运算符)和附加信息(变量名称)。
一个基本块,可用一个DAG来表示。
各种四元式及相对应的DAG的结点形式。 图中ni为结点编号,结点下面的符号(运算符、标 识符或常数)是各结点的标记;
n1 n1
A
B
n2 n2 A
各结点右边的标识符是结点的附加标识符。
各种形式的四元式按其对应结点的后继个数分为四类。 a. 0个后继结点的四元式称为0型; b. 1个后继结点的四元式称为1型; c. 2个后继结点的四元式称为2型; d. 3个后继结点的四元式称为3型。
16
例题:
1 2 3 4 5 6 7 8 9 10 11 Read(limit) I:=1 If I>limit goto(11) Read(j) If I=1 goto(8) Sum:=sum+j Goto(9) Sum:=j I:=I+1 Goto(3) Write(sum)
上述程序中,入口语句分别为1、3、4、6、 8、9、11。 该程序共有7个基本块。 其中语句1、2为1块; 3语句为2块; 4、5语句为3块; 6、7语句为4块; 8语句为5块; 9、10语句为6块; 11语句为7块。 根据执行过程可以构成控制流图如下:
B1
B1
4 7 3
3 4 5 6 7 8 9 10 11 12
T1:=4*I T2:=addr(A)-4 T3:=T2[T1] T4:=4*I T5:=addr(B)-4 T6:=T5[T4] T7:=T3*T6 P:=P+T7 I:=I+1 If I<=20 goto (3)
5
T3:=T2[T1]
对于一个给定程序,可以划分出一系列基本块。
13
11.2 局部优化
基本块划分: 入口语句:
1. 2. 3. 程序的第一个语句; 或者,条件转移语句或无条件转移语句的转移目标语句; 或者,紧跟在条件转移语句后面的语句。
基本块划分算法:
1. 2. 求出各个入口语句; 对每个入口语句,构造其所属的基本块。即由该入口语句 到下一个入口语句(不包含该语句),或到一转移语句 (包含该语句),或到一停语句(包含该语句)之间的语 句序列组成。 凡是未被纳入某个基本块中的语句,都是程序控制流程中 无法到达的语句,也是不会被执行的语句,因此,可以删 除掉。
如果有向图中任一个通路都不是环路,则称该有向图为无环 路有向图。简称DAG。
18
基本块的DAG表示
DAG图中的结点带有标记或者附加信息。
图的叶节点:即无后继的节点,以一标识符(变量名)或常数作为标记, 表示该节点代表该变量或常数。
图的内部节点:即有后继的节点,以一运算符作为标记,表示该节点代 表应用该运算符对其后继节点所代表的值进行运算的结果。 图中各个节点上可能附加一个或多个标识符,表示这些变量具有该节 点所代表的值。 DAG可以用来描述计算过程。 一个基本块,可用一个DAG来表示
9
5.
合并已知量和复写传播
四元式(3)计算4*I时,I必为1。 4*I的两个运算对象都是编码时的已知量,可在编译时计算 出它的值,即四元式(3)可变为T1=4,这种变换称为合 并已知量。 四元式(6)把T1的值复写到T4中,四元式(8)要引用T4的 值,而从四元式(6)到四元式(8)之间未改变T4和T1的 值,则将四元式(8)改为T6∶=T5[T1], 这种变换称为复写传播.复写传播之后运算结果保持不变。
22
基本块的DAG构造算法
第二步骤, 1. 如果NODE(B)是标记为常数的叶结点 ,则转2(3),否 则转3(1)。 2. 如果NODE(B)和NODE(C)都是标记为常数的叶结点,则 转2(4),否则转3(2)。 3. 执行op B(即合并已知量),令得到的新常数为P。 如果NODE(B)是处理当前四元式时新构造出来的结点, 则删除它。如果NODE(P)无定义,则构造一用P做标记 的叶结点n。置NODE(P)=n,转4。 4. 执行B op C(即合并已知量),令得到的新常数为P。 如果NODE(B)或NODE(C)是处理当前四元式时新构造出 来的结点,则删除它。如果NODE(P)无定义,则构造 一用P做标记的叶结点n。置NODE(P)=n,转4。
2
3 4 5
I:=1
T1:=4*I T2:=addr(A)-4 T3:=T2[T1]
6
对源程序编译后得到中间代码 中间代码由B1和B2两部分组成 B2为循环部分。 对中间代码可以进行相应优化。
T4:=4*I
T5:=addr(B)-4 T6:=T5[T4]
B2
7 8
9
10 11 12
T7:=T3*T6
全局优化:是整个程序范围内进行优化。(依据数据流,大范围的优化, 主要分析变量的定值点和引用点。)
源代码
前段
中间代码
代码生成
目标代码
无论在哪个阶段进行优化都 可以通过上述三个方式实现。
中间代码优化
目标代码优化
编译的优化工作阶段
4
优化技术举例(中间代码优化)
源程序
中间代码 B1
1
P:=0
P:=0 for I:=1 to 20 do P:=P+A[I]*B[I];
1 2 3 7 4 5 6
17
基本块的DAG表示
一个有向图中有n个节点。对于任意一个有向边ni→nj,ni为 前驱(父节点),nj为后继(子节点)。 对于任意一个有向边序列,n1→n2、 n2→n3、„..、 nk1→nk ,称为从节点n1到nk的的一条通路。如果n1=nk ,则称 该通路为环路。