编译原理课后答案 第五章 代码优化
《编译原理》课后习题答案第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'|ε
编译原理课后习题答案

第一章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⇒75431N⇒ND⇒NDD⇒NDDD⇒NDDDD⇒DDDDD⇒7DDDD⇒75DDD⇒754DD⇒7543D⇒75431 4. 证明文法S→iSeS|iS| i是二义性文法。
答:对于句型iiSeS存在两个不同的最左推导:S⇒iSeS⇒iiSesS⇒iS⇒iiSeS所以该文法是二义性文法。
编译原理-第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)所示。
编译原理_第1-5章习题课答案

(1)以01结尾的二进制数串。 (0 | 1)*01
(2)能被5整除的十进制数。
0|5
| (1|2|3|4|5|6|7|8|9)
(3)包含奇數個1或奇數個0的二進制串
0*1(0|10*1)*|1*0(0|10*1)*
(4)英文字母组成的所有符号串,要求符号串中的 字母按字典序排列。
(A | a)* (B | b)* (C | c)*… (Z | z)*
I00
0 ΦC
0
B {c,d} 1 0
E
1
{c,d} D
{c,d,f}
1
1
{c,d}
{c,d,f}
chapter1~5习题
I1 {b,c,d} 1 {c,dF,e}
{c,d,e} 0 {c,d,e} {c,d,e,g}
{c,d,e}
S
0
A(始态)
Φ
B
C
C
C
D
E
E
C
F(终态)
E
1 B D D D F(终态) D
1(0|1)*101 1(0|1)*101
chapter1~5习题
g
1
a
(0|1)* b
101
d
g
1 a
0
ε
ε
b
c
1
1
0
1
d
e
f
g
编译原理
②.状态转换矩阵
1 a
0
ε
ε
b
c
1
chapter1~5习题
1
0
1
d
e
f
g
I {a} {b,c,d} {c,d} {c,d,e} {c,d,f} {c,d,e,g}
编译原理课后习题答案-清华大学-第二版

《编译原理》课后习题答案第一章
是哪种方式,其加工结果都是源程序的执行结果。目前很多解释程序采取上述两种方式的综 合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是 边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源 程序翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来 完成,即只翻译不执行。
好似滚雪球一样,直到我们所要求的编译程序。 (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)
编译原理 第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代码优化

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

第一章1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。
这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。
从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。
(在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。
这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。
在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。
因此,编译对源程序的处理是先翻译,后执行。
)1.3 请画出编译程序的总框图。
如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 【解答】编译程序总框图如图1-1所示。
作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。
总之,总设计师在设计编译程序时必须估量系统功能要求、硬件设备及软件工具等诸因素对编译程序构造的影响等。
第二章2.1 正规式M1和M2等价是指:M1和M2所识别的语言集相等。
2.2 什么是扫描器?扫描器的功能是什么?【解答】扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结点d、结点n以及有通路到达n而该通路不经过d的所有
结点组成一个循环。 【解答】 根据题意画出示意图,如图5-4所示。
第五章 代码优化
d
n11
n12 …
n1k
…
…
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
E = A * A B2 F= F+ 1 E=E+F w rite (E ) ha lt
B3 L1: E = B * B F= F+ 2 E=E+F w rite (E ) if E > 1 00 g oto L 2
h a lt
B4
L2: F = F - 1 B5 go to 1L
图5-1 程序流图
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 何谓局部优化、循环优化和全局优化?优化工作在
ha l t
n7
图5-3 习题5.6的程序流图
第五章 代码优化 由于有n5→n2 和n6→n1 ,而n2 不是n5 的必经结点,n1 是n6 的必经结点,所以n6→n1 为回边;即该回边表示的
循环为{ n1,n2,n3,n4,n5,n6},入口结点为n1 ,出口结点
为n6。 5.7 证明:如果已知有向边n→d是一回边,则由
第五章 代码优化
A=0 I= 1
B1
B= J+ 1
B′2
B2 L1: C = B + I A = C+ A i f I= 1 0 0 g o t2 L o F I= I+ 1 got o L 1 B3 T L2: w ri t e A B4 ha l t
图5-6 习题5.8中代码外提后的程序流图
第一个语句,出口就是其中最后一个语句。如果发现某基
本块有两个以上的入口或两个以上的出口,则划分基本块 有误。
第五章 代码优化 程序流图画法是当下述条件(1)和(2)有一个成立时, 从结点i有一有向边引到结点j:
(1) 基本块j在程序中的位置紧跟在基本块i之后,
并且基本块i的出口语句不是无条件转移语句goto(s)或 停语句。
第五章 代码优化 (2) 循环优化是指对循环中的代码进行优化。例 如,如果在循环语句中某些运算结果不随循环的重复
执行而改变,那么该运算可以提到循环外,其运算结
果仍保持不变,但程序运行的效率却提高了。循环优 化包括代码外提、强度削弱、删除归纳变量、循环合
并和循环展开。
第五章 代码优化 5.3 将下面程序划分为基本块并作出其程序流图。 read(A,B) F=1 C=A*A D=B*B
L2:A=B+C
B=D*C
第五章 代码优化 L3:if B =0 goto L4 write B
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}
第五章 代码优化 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所示。
if C<D goto L1
E=A*A F=F+1 E=E+F write(E)
halt
第五章 代码优化 L1: E=B*B F=F+2
E=E+F
write(E) if E >100 goto L2 halt L2: F=F-1
goto L1
第五章 代码优化 【解答】 先求出四元式程序中各基本块的入口语句, 即程序的第一个语句,或者能由条件语句或无条件转移语 句转移到的语句,或者条件转移语句的后继语句。然后对 求出的每一入口语句构造其所属的基本块,它是由该入口 语句至下一入口语句(不包括该入口语句)或转移语句(包括 该转移语句)或停语句(包括该停语句)之间的语句序列组成 的。凡未被纳入某一基本块的语句都从程序中删除。要注 意基本块的核心只有一个入口和一个出口,入口就是其中
R=S0/S3
H=R S4=3/S1 S5=T+C S6=S4/S5
H=S6*S2
第五章 代码优化 (1) 应用DAG对该基本块进行优化; (2) 假定只有R、H在基本块出口是活跃的,试写
出优化后的四元式序列。
【解答】 列为 S0=2 S4=2 (1) 根据DAG图得到优化后的四元式序
S1=1.5
D(n1)={n0,n1}
D(n2)={n0,n1,n2} D(n3)={n0,n1,n3}
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所示。
第五章 代码优化
第五章 代码优化 我们知道,强度削弱不仅可对乘法运算进行,也可 对加法运算进行。由于本题中的四元式程序不存在乘法
运算,所以只能进行加法运算的强度削弱。从图5-5中
可以看到,B2中的C=B+I,变量B因代码外提其定值点已 在循环之外,故相当于常数。而另一加数I值由B3 中的
I=I+1决定,即每循环一次I值增1;也即每循环一次,
编译的哪个阶段进行? 【解答】 优化根据涉及的程序范围可分为三种。 (1) 局部优化是指局限于基本块范围内的一种优化。一 个基本块是指程序中一组顺序执行的语句序列(或四元式序
列),其中只有一个入口(第一个语句)和一个出口(最后一个
语句)。对于一个给定的程序,我们可以把它划分为一系列的 基本块,然后在各个基本块范围内分别进行优化。通常应用 DAG方法进行局部优化。
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.6 出: (1) 各结点的必经结点集合D(n); (2) 流图中的回边与循环。 J=0 L1:I=0 if I< 8 goto L3 试画出如下中间代码序列的程序流图,并求
(2) 基本块i的出口语句是goto(s)或if…goto(s),并
且(s)是基本块j的入口语句。 应用上述方法求出本题所给程序的基本块及程序 流图见图5-1,图中的有向边、实线是按流图画法(1)画 出的,虚线是按流图画法(2)画出的。
第五章 代码优化
re a d (A ,B ) F= 1 C = A *A D = B *B ifC < D g o toL 1 B完成以下选择题: (1) 优化可生成 a. 运行时间较短 的目标代码。
b. 占用存储空间较小
c. 运行时间短但占用内存空间大 d. 运行时间短且占用存储空间小
第五章 代码优化 (2) 下列 a. 强度削弱 优化方法不是针对循环优化进行的。 b. 删除归纳变量
c
图5-2 习题5.4的DAG图
第五章 代码优化 【解答】 后的代码为 a=b0+c0 d=a-d0 c=d+c0 (2) 当b在出口活跃时,生成优化后的代码为 a=b0+c0 (1) 当b在出口处不活跃时,生成优化
b=a-d0
d=b c=d+c0
第五章 代码优化 5.5 对于基本块P: S0=2 S1=3/S0 S2=T-C S3=T+C
B2中的C=B+I其C值增量与B3中的I相同,即常数1。因此, 我们可以对C进行强度削弱,即将B2中的四元式C=B+I外
环可通过回边求得,即找出由结点B2、结点B3以及有通
路到达B3但不经过B2的所有结点。所以,由回边组成的 B3→B2循环是{ B2,B3}。
进行代码外提就是将循环中的不变运算外提到循
环入口结点前新设置的循环前置结点中。经检查,找 出的不变运算为B2中的B=J+1。因此,代码外提后的程 序流图如图5-6所示。
第五章 代码优化
A=0 I= 1
B1
B2 L1: B = J + 1 C= B+ I A = C+ A i f I= 1 0 0 g o t2 L o F I= I+ 1 got o L 1 B3 T L2: w ri t e A B4 ha l t