《编译原理教程》课后习题答案 第五章 代码优化

合集下载

《编译原理》课后习题答案第5章

《编译原理》课后习题答案第5章

2
《编译原理》课后习题答案第五章
#)NS
a
)#...
#)Na
a
)#...
#)N
)
#...
#)
)
#...
#
#
可见输入串(a,a)#是文法的句子。
S→a .
N→ε
计算机咨询网()陪着您
3
《编译原理》课后习题答案第五章
第3题
已知文法 G[S]: S→MH|a H→LSo|ε K→dML|ε L→eHf M→K|bLM 判断 G 是否是 LL(1)文法,如果是,构造 LL(1)分析表。
A B N
FIRST {b} {b,a} {b,a}
FOLLOW {#} {#,b} {#,b }
预测分析表:
a
b
#
A
→baB
→ε
B
→a
→bN
N
→aBbb
→b
由预测分析表中无多重入口判定文法是 LL(1)的。
(2) 文法: A→aABe|a B→Bb|d
提取左公共因子和消除左递归后文法变为: 0) A→a N 1) N→A B e 2) N→ε
非终结符
FIRST 集
FOLLOW 集
计算机咨询网()陪着您
7
《编译原理》课后习题答案第五章
S
{b}...
B
{a}...
N
{ε,a}
对相同左部的产生式可知:
SELECT(N→B a N)∩SELECT(N→ε) ={ a }∩ {# }= 所以文法是 LL(1)的。 预测分析表(Predicting Analysis Table)
A→BaC|CbB B→CbBcB'|cB' B'→aCcB'|ε C→cB'bC'|bC' C'→bBcB'bC'|ε

编译原理-第5章-习题与答案2上课讲义

编译原理-第5章-习题与答案2上课讲义

编译原理-第5章-习题与答案2第五章习题5-1 设有文法G[S]:S→A/ A→aA∣AS∣/(1) 找出部分符号序偶间的简单优先关系。

(2) 验证G[S]不是简单优先文法。

5-2 对于算符文法G[S]:S→E E→E-T∣T T→T*F∣F F→-P∣P P→(E)∣i(1) 找出部分终结符号序偶间的算符优先关系。

(2) 验证G[S]不是算符优先文法。

5-3 设有文法G′[E]:E→E1 E1→E1+T1|T1 T1→T T→T*F|F F→(E)|i其相应的简单优先矩阵如题图5-3所示,试给出对符号串(i+i)进行简单优先分析的过程。

题图5-3 文法G′[E]的简单优先矩阵5-4 设有文法G[E]:E→E+T|TT→T*F|FF→(E)|i其相应的算符优先矩阵如题图5-4所示。

试给出对符号串(i+i)进行算符优先分析的过程。

题图5-4 文法G[E]的算符优先矩阵5-5 对于下列的文法,试分别构造识别其全部可归前缀的DFA和LR(0)分析表,并判断哪些是LR(0)文法。

(1) S→aSb∣aSc∣ab(2) S→aSSb∣aSSS∣c(3) S→A A→Ab∣a5-6 下列文法是否是SLR(1)文法?若是,构造相应的SLR(1)分析表,若不是,则阐明其理由。

(1) S→Sab∣bR R→S∣a(2) S→aSAB∣BA A→aA∣B B→b(3) S→aA∣bB A→cAd∣ε B→cBdd∣ε5-7 对如下的文法分别构造LR(0)及SLR(1)分析表,并比较两者的异同。

S→cAd∣b A→ASc∣a5-8 对于文法G[S]:S→A A→BA∣ε B→aB∣b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。

5-9 对于如下的文法,构造LR(1)项目集族,并判断它们是否为LR(1)文法。

(1) S→A A→AB∣ε B→aB∣b(2) S→aSa∣a第5章习题答案25-1 解:(1) 由文法的产生式和如答案图5-1(a)所示的句型A//a/的语法树,可得G中的部分优先关系如答案图5-1(b)所示。

编译原理课后习题答案-清华大学-第二版

编译原理课后习题答案-清华大学-第二版

《编译原理》课后习题答案第一章
是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综 合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是 边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源 程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来 完成,即只翻译不执行。
好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
《编译原理》课后习题答案第一章
第6题
计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?
答案: 计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
第4题
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、 代码生成)报告的。 (1) else 没有匹配的 if (2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
b∶=10; end (q); procedure s; var c,d; procedure r;
var e,f; begin (r)
call q; end (r); begin (s) call r; end (s); begin (p) call s;
end (p); begin (main)

编译原理课后习题答案

编译原理课后习题答案

编译原理课后习题答案第一章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所以该文法是二义性文法。

编译原理 第5章习题解答

编译原理 第5章习题解答

第五章习题解答5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。

S→SASCS→εA→AaA→bC→DcDD→d5.2 消除下列文法的左递归:① G[A]:A→BX∣CZ∣WB→Ab∣BcC→Ax∣By∣Cp② G[E]:E→ET+∣ET–∣TT→TF*∣TF/FF→(E)∣i③ G[X]:X→Ya∣Zb∣cY→ Zd∣Xe∣fZ→X e∣Yf∣a④ G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3 设文法G[<语句>]:<语句>→<变量>: = <表达式>|if<表达式>then<语句>|if<表达式>then<语句>else<语句> <变量>→i<表达式>→<项>|<表达式>+<项><项>→<因子>|<项>*<因子><因子>→<变量>|′(′<表达式>′)′试构造该文法的递归下降子程序。

5.4 设文法G[E]:E→ TE'E'→ + E∣εT→ FT'T'→ T∣εF→ PF'F'→ *F∣εP→ (E)∣ a∣^①构造该文法的递归下降分析程序;②求该文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。

5.5 设文法G[S]:S→ SbA∣aAB→ SbA→ Bc①将此文法改写为LL(1)文法;②求文法的每一个非终结符的FIRST集合和FOLLOW集合;③构造相应的LL(1)分析表。

5.6 设文法G[S]:S→ aABbcd∣εA→ ASd∣εB→ SAh∣eC∣εC→ Sf∣Cg∣εD→ aBD∣ε①求每一个非终结符的FOLLOW集合;②对每一个非终结符的产生式选择,构造FIRST集合;③该文法是LL(1)文法。

编译原理教程05代码优化

编译原理教程05代码优化
缺点
可能会增加代码大小,增加编译时间 和内存占用。
优点
减少函数调用的开销,提高代码执行 效率。
使用场景
对于小函数且被频繁调用的情况,使 用内联优化可以获得更好的性能。
死代码删除
定义
死代码删除是指删除程序中永远不会被执行到的代码,以提高代码的执行效率。
优点
减少代码大小,提高程序执行效率。
缺点
可能导致程序行为发生变化,需要谨慎使用。
使用场景
在编译过程中进行静态分析,识别并删除无用的代码。
循环展开
定义
优点
循环展开是一种优化技术, 通过将循环体中的代码复制 到循环外部,减少循环次数, 提高代码执行效率。
减少循环次数,提高代码执 行效率。
Байду номын сангаас缺点
可能会增加代码大小,增加 编译时间和内存占用。
使用场景
对于循环次数较少且循环体 内有大量计算的场景,使用 循环展开可以获得更好的性 能。
编译器可以识别并替换常量表达式的结果, 以减少计算需求。
死代码消除
移除永远不会被执行到的代码,减少生成的 代码大小。
寄存器分配
优化寄存器的使用,提高指令的执行效率。
全局优化
循环展开
通过重复执行循环体来减少循环次数,提高执 行效率。
循环不变量代码外提
将循环不变量代码移出循环,减少循环内的计 算负担。
可以分为速度优化和空间优化。速度优化以提高执行速度为目标,而空
间优化则以减小目标代码的体积为目标。
03
按照优化手段分类
可以分为基于规则的优化和基于程序的优化。基于规则的优化是指根据
一些固定的规则对代码进行优化,而基于程序的优化则是指根据程序的

编译原理 第5章 代码优化

编译原理  第5章  代码优化
DAG(Directed Acyclic Graph)是一种有向图,常 常用来对基本块进行优化。一个基本块的DAG是一种 其结点带有下述标记或附加信息的DAG: (1) 图的叶结点(无后继的结点)以一标识符(变量名)
或常数作为标记,表示该结点代表该变量或常数的值。
如果叶结点用来表示一变量A的地址,则用addr(A)作 为该结点的标记。通常把叶结点上作为标记的标识符
然后再把A附加到新结点n上,并令Node(A)=n。
第5章 代码优化
例5.3 构造以下基本块的DAG。
(1) T0=3.14 (2) T1=2* T0
(3) T2=R+r
(4) A= T1* T2 (5) B=A (6) T3=2* T0 (7) T4=R+r (8) T5=T3* T4 (9) T6=R-r
n1
(S)
(5) if B rop C goto (S)
(7) goto (S)
图5–1 四元式与DAG结点
第5章 代码优化
利用DAG进行基本块优化的基本思想是:
首先按基本块内的四元式序列顺序将所有
的四元式构造成一个DAG,然后按构造结点的
次序将DAG还原成四元式序列。由于在构造
DAG的同时已作了局部优化,所以最后所得到
n5 +
T2 n4
*
n1 T0
2
r
(b) T1=2*T0
(c) T2=R+r n6 A,B
n6 A *
n5
+
T2 n4 r
*
n5 +
T2
n1 3.14
T0 n2 6.28
T1 n3 R (d) A=T1*T2
n1

编译原理-第五章习题答案

编译原理-第五章习题答案

上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)

# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT

上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章 代码优化 5.6 出: (1) 各结点的必经结点集合D(n); (2) 流图中的回边与循环。 J=0 L1:I=0 if I< 8 goto L3 试画出如下中间代码序列的程序流图,并求
L2:A=B+C
B=D*C
第五章 代码优化 L3:if B =0 goto L4 write B
提到前置结点B2′中,同时在B3中I=I+1之后给C增加一
个常量1。进行强度削弱后的结果如图5-7所示。
第五章 代码优化
A=0 I=1 B=J+1 C=B+I
B1
′ B2
B2 L :A=C+A 1 if I=100 goto2L F I=I+1 C=C+1 goto L 1 B3 T L :write A B4 2 halt
运算,所以只能进行加法运算的强度削弱。从图5-5中
可以看到,B2中的C=B+I,变量B因代码外提其定值点已 在循环之外,故相当于常数。而另一加数I值由B3 中的
I=I+1决定,即每循环一次I值增1;也即每循环一次,
B2中的C=B+I其C值增量与B3中的I相同,即常数1。因此, 我们可以对C进行强度削弱,即将B2中的四元式C=B+I外
第五章 代码优化 5.8 对下面四元式代码序列: A=0
I=1
L1: B=J+1 C=B+I
A=C+A
if I=100 goto L2 I=I+1 goto L1 L2: write A
halt
第五章 代码优化 (1) 画出其控制流程图; (2) 求出循环并进行循环的代码外提和强度削弱 优化。 【解答】 (1) 在构造程序的基本块的基础上画出 该程序的流图,如图5-5所示。
b=a-d0
d=b c=d+c0
第五章 代码优化 5.5 对于基本块P: S0=2 S1=3/S0 S2=T-C S3=T+C
R=S0/S3
H=R S4=3/S1 S5=T+C S6=S4/S5
H=S6*S2
第五章 代码优化 (1) 应用DAG对该基本块进行优化; (2) 假定只有R、H在基本块出口是活跃的,试写
环可通过回边求得,即找出由结点B2、结点B3以及有通
路到达B3但不经过B2的所有结点。所以,由回边组成的 B3→B2循环是{ B2,B3}。
进行代码外提就是将循环中的不变运算外提到循
环入口结点前新设置的循环前置结点中。经检查,找 出的不变运算为B2中的B=J+1。因此,代码外提后的程 序流图如图5-6所示。
出优化后的四元式序列。
【解答】 列为 S0=2 S4=2 (1) 根据DAG图得到优化后的四元式序
S1=1.5
S2=T-C
第五章 代码优化 S3=T+C S5=S3 R=2/S3 S6=R H=S6*S2
(2) 若只有R、H在基本块出口是活跃的,优化后的四 元式序列为
S2=T-C S3=T+C R=2/S3 H=R*S2
第五章 代码优化
第五章 代码优化
5.1 完成以下选择题: (1) 优化可生成 a. 运行时间较短 的目标代码。
b. 占用存储空间较小
c. 运行时间短但占用内存空间大 d. 运行时间短且占用存储空间小
第五章 代码优化 (2) 下列 a. 强度削弱 优化方法不是针对循环优化进行的。 b. 删除归纳变量
(2) b在该基本块出口处活跃;
请分别给出下列代码经过优化之后的代码: (1) a=b+c (3) c=b+c (2) b=a-d (4) d=a-d
第五章 代码优化
n5 c + n4 - n2 a + n0 b0 n1 c0 n3 d0 b, d
图5-2 习题5.4的DAG图
第五章 代码优化 【解答】 后的代码为 a=b0+c0 d=a-d0 c=d+c0 (2) 当b在出口活跃时,生成优化后的代码为 a=b0+c0 (1) 当b在出口处不活跃时,生成优化


ni1
ni2 …

nij n
图5-4 具有回边n→d的流图
第五章 代码优化 证明过程如下: (1) 令结点d、结点n以及有通路到达n而该通路不经过d 的所有结点构成集合L(即图5-4中的全部结点),则L必定是 强连通的。为了证明这一点,令M=L-{d,n}。由L的组成成分 可知 M 中 每 一结点 ni 都可以不 经过 d 而到 达 n。又因 d DOM
(2) 基本块i的出口语句是goto(s)或if…goto(s),并
且(s)是基本块j的入口语句。 应用上述方法求出本题所给程序的基本块及程序 流图见图5-1,图中的有向边、实线是按流图画法(1)画 出的,虚线是按流图画法(2)画出的。
第五章 代码优化
read(A,B) F=1 C=A*A D=B*B ifC<D gotoL 1 B1
c. 删除多余运算
(3) 基本块内的优化为 。
d. 代码外提
a. 代码外提,删除归纳变量 b. 删除多余运算,删除无用赋值 c. 强度削弱,代码外提
d. 循环展开,循环合并
第五章 代码优化 (4) 在程序流图中,我们称具有下述性质 列为一个循环。 a. 它们是非连通的且只有一个入口结点 b. 它们是强连通的但有多个入口结点 c. 它们是非连通的但有多个入口结点 的结点序
d. 们是强连通的且只有一个入口结点
(5) 关于必经结点的二元关系,下列叙述中不正确的 是 。
a. 满足自反性
c. 满足反对称性 【解答】 (1) d (2) c (3) b
b. 满足传递性
d. 满足对称性 (4) d (5) d
第五章 代码优化 5.2 何谓局部优化、循环优化和全局优化?优化工作在
第五章 代码优化
A=0 I=1
B1
B2 L :B=J+1 1 C=B+I A=C+A if I=100 goto2L F I=I+1 goto L 1 B3 T L :write A B4 2 halt
图5-5 习题5.8的程序流图
第五章 代码优化 (2) 很容易看出,B3→B2是流图中的一条有向边, 并且有B2 DOM B3 ,故B3→B2 为流图中的一条回边。循
n2 n3
n5 L :I=I+1 4 if I<8 goto2L
n6 L :J=J+1 5 if J<=3 goto 1 L halt n7
图5-3 习题5.6的程序流图
第五章 代码优化 由于有n5→n2 和n6→n1 ,而n2 不是n5 的必经结点,n1 是n6 的必经结点,所以n6→n1 为回边;即该回边表示的
D(n4)={n0,n1,n3,n4}
D(n5)={n0,n1,n3,n5} D(n6)={n0,n1,n3,n6} D(n7)={n0,n1,n3,n6,n7} 程序流图如图5-3所示。
第五章 代码优化
J=0 n0
L :I=0 1 if I<8 goto3 L
n1
L :A=B+C 2 B=D*C L :if B=0 goto L 3 4 write B n 4 goto L 5
编译的哪个阶段进行? 【解答】 优化根据涉及的程序范围可分为三种。 (1) 局部优化是指局限于基本块范围内的一种优化。一 个基本块是指程序中一组顺序执行的语句序列(或四元式序
列),其中只有一个入口(第一个语句)和一个出口(最后一个
语句)。对于一个给定的程序,我们可以把它划分为一系列的 基本块,然后在各个基本块范围内分别进行优化。通常应用 DAG方法进行局部优化。
E=A*A B2 F=F+1 E=E+F write(E) halt
B3 L :E=B*B 1 F=F+2 E=E+F write(E) if E>100 goto2L halt B4 L :F=F-1 B5 2 goto L 1
图5-1 程序流图
第五章 代码优化 5.4 基本块的DAG如图5-2所示。若: (1) b在该基本块出口处不活跃;
结点之间必有一通路,L中任意两个结点之间亦必有一
通路。此外,由M中结点性质可知:d到M中任一结点ni 的通路上所有结点都应属于M,ni 到n的通路上所有结
点也都属于M。因此,L中任意两结点间通路上所有结
点都属于L,也即,L是强连通的。
第五章 代码优化 (2) 因为对所有ni∈L,都有d DOM ni,所以d必为L 的一个入口结点。我们说d也一定是L的唯一入口结点。 如不然,必有另一入口结点d1∈L且d1≠d。d1 不可能是 首结点,否则d DOM n不成立(因为有d DOM d1,如果d1 是首结点,则d就是首结点d1的必经结点,则只能是d=d1, 与d≠d1矛盾)。现设d1不是首结点,且设d1在L之外的前 驱是d2 ,那么,d2 和n之间必有一条通路d2→d1→…→n, 且该通路不经过d,从而d2应属于M,这与d2∈L矛盾。所 以不可能存在上述结点d1 ,也即d是循环的唯一入口结 点。 至此,我们已经满足了循环的定义:循环是程序流 图中具有唯一入口结点的强连通子图,也即,L是包含 回边n→d的循环,d是循环的唯一入口结点。
goto L5
L4:I= I+1 if I<8 goto L2 L5:J= J+1 if J<=3 goto L1
halt
第五章 代码优化 【解答】 (1) 各结点的必经结点集分别为 D(n0)={n0}
D(n1)={n0,n1}
D(n2)={n0,n1,n2} D(n3)={n0,n1,n3}
第五章 代码优化 (2) 循环优化是指对循环中的代码进行优化。例 如,如果在循环语句中某些运算结果不随循环的重复
执行而改变,那么该运算可以提到循环外,其运算结
果仍保持不变,但程序运行的效率却提高了。循环优 化包括代码外提、强度削弱、删除归纳变量、循环合
相关文档
最新文档