编译原理教程课后习题答案——第五章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章代码优化

5.1 完成以下选择题:

(1) 优化可生成的目标代码。

a. 运行时间较短

b. 占用存储空间较小

c. 运行时间短但占用内存空间大

d. 运行时间短且占用存储空间小

(2) 下列优化方法不是针对循环优化进行的。

a. 强度削弱

b. 删除归纳变量

c. 删除多余运算

d. 代码外提

(3) 基本块内的优化为。

a. 代码外提,删除归纳变量

b. 删除多余运算,删除无用赋值

c. 强度削弱,代码外提

d. 循环展开,循环合并

(4) 在程序流图中,我们称具有下述性质的结点序列为一个循环。

a. 它们是非连通的且只有一个入口结点

b. 它们是强连通的但有多个入口结点

c. 它们是非连通的但有多个入口结点

d. 它们是强连通的且只有一个入口结点

(5) 关于必经结点的二元关系,下列叙述中不正确的是。

a. 满足自反性

b. 满足传递性

c. 满足反对称性

d. 满足对称性

【解答】

(1) d (2) c (3) b (4) d (5) d

5.2 何谓局部优化、循环优化和全局优化?优化工作在编译的哪个阶段进行?

【解答】优化根据涉及的程序范围可分为三种。

(1) 局部优化是指局限于基本块范围内的一种优化。一个基本块是指程序中一组顺序执行的语句序列(或四元式序列),其中只有一个入口(第一个语句)和一个出口(最后一个语句)。对于一个给定的程序,我们可以把它划分为一系列的基本块,然后在各个基本块范围内分别进行优化。通常应用DAG方法进行局部优化。

(2) 循环优化是指对循环中的代码进行优化。例如,如果在循环语句中某些运算结果不随循环的重复执行而改变,那么该运算可以提到循环外,其运算结果仍保持不变,但程序运行的效率却提高了。循环优化包括代码外提、强度削弱、删除归纳变量、循环合并和循环展开。

5.3 将下面程序划分为基本块并作出其程序流图。

read(A,B)

F=1

C=A*A

D=B*B

if C

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

【解答】先求出四元式程序中各基本块的入口语句,即程序的第一个语句,或者能由条件语句或无条件转移语句转移到的语句,或者条件转移语句的后继语句。然后对求出的每一入口语句构造其所属的基本块,它是由该入口语句至下一入口语句(不包括该入口语句)或转移语句(包括该转移语句)或停语句(包括该停语句)之间的语句序列组成的。凡未被纳入某一基本块的语句都从程序中删除。要注意基本块的核心只有一个入口和一个出口,入口就是其中第一个语句,出口就是其中最后一个语句。如果发现某基本块有两个以上的入口或两个以上的出口,则划分基本块有误。

程序流图画法是当下述条件(1)和(2)有一个成立时,从结点i有一有向边引到结点j:

(1) 基本块j在程序中的位置紧跟在基本块i之后,并且基本块i的出口语句不是无条件转移语句goto(s)或停语句。

(2) 基本块i的出口语句是goto(s)或if…goto(s),并且(s)是基本块j的入口语句。

应用上述方法求出本题所给程序的基本块及程序流图见图5-1,图中的有向边、实线是按流图画法(1)画出的,虚线是按流图画法(2)画出的。

图5-1 程序流图

5.4 基本块的DAG 如图5-2所示。若: (1) b 在该基本块出口处不活跃; (2) b 在该基本块出口处活跃; 请分别给出下列代码经过优化之后的代码:

(1) a=b+c (2) b=a-d

(3) c=b+c (4) d=a-d

图5-2 习题5.4的DAG 图

【解答】 (1) 当b 在出口处不活跃时,生成优化后的代码为

a=b0+c0

d=a-d0

c=d+c0

(2) 当b 在出口活跃时,生成优化后的代码为

a=b0+c0

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 在基本块出口是活跃的,试写出优化后的四元式序列。

【解答】 (1) 根据DAG 图得到优化后的四元式序列为

S0=2

S4=2

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

00

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

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}

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-3 习题5.6的程序流图

相关文档
最新文档