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

上传人:b****7 文档编号:23336760 上传时间:2023-05-16 格式:DOCX 页数:14 大小:373.50KB
下载 相关 举报
编译原理教程课后习题答案第五章.docx_第1页
第1页 / 共14页
编译原理教程课后习题答案第五章.docx_第2页
第2页 / 共14页
编译原理教程课后习题答案第五章.docx_第3页
第3页 / 共14页
编译原理教程课后习题答案第五章.docx_第4页
第4页 / 共14页
编译原理教程课后习题答案第五章.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

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

《编译原理教程课后习题答案第五章.docx》由会员分享,可在线阅读,更多相关《编译原理教程课后习题答案第五章.docx(14页珍藏版)》请在冰豆网上搜索。

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

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

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

LT

(2)循环优化是指对循环中的代码进行优化。

例如,如果在循环语句中某些运算结果不随循环的重复执行而改变,那么该运算可以提到循环外,其运算结果仍保持不变,但程序运行的效率却提高了。

循环优化包括代码外提、强度削弱、删除归纳变量、循环合并和循环展开。

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

read(A,B)

F=1

C=A*A

D=B*B

ifC

E=A*A

F=F+1

E=E+F

write(E)

halt

L1:

E=B*B

F=F+2

E=E+F

write(E)

ifE>100gotoL2

halt

L2:

F=F-1

gotoL1

【解答】先求出四元式程序中各基本块的入口语句,即程序的第一个语句,或者能由条件语句或无条件转移语句转移到的语句,或者条件转移语句的后继语句。

然后对求出的每一入口语句构造其所属的基本块,它是由该入口语句至下一入口语句(不包括该入口语句)或转移语句(包括该转移语句)或停语句(包括该停语句)之间的语句序列组成的。

凡未被纳入某一基本块的语句都从程序中删除。

要注意基本块的核心只有一个入口和一个出口,入口就是其中第一个语句,出口就是其中最后一个语句。

如果发现某基本块有两个以上的入口或两个以上的出口,则划分基本块有误。

程序流图画法是当下述条件

(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

S3=T+C

R=2/S3

H=R*S2

5.6试画出如下中间代码序列的程序流图,并求出:

(1)各结点的必经结点集合D(n);

(2)流图中的回边与循环。

J=0

L1:

I=0

if I<8gotoL3

L2:

A=B+C

B=D*C

L3:

if B=0gotoL4

writeB

gotoL5

L4:

I=I+1

ifI<8gotoL2

L5:

J=J+1

if J<=3gotoL1

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的程序流图

由于有n5→n2和n6→n1,而n2不是n5的必经结点,n1是n6的必经结点,所以n6→n1为回边;即该回边表示的循环为{n1,n2,n3,n4,n5,n6},入口结点为n1,出口结点为n6。

5.7证明:

如果已知有向边n→d是一回边,则由结点d、结点n以及有通路到达n而该通路不经过d的所有结点组成一个循环。

【解答】根据题意画出示意图,如图5-4所示。

 

图5-4具有回边n→d的流图

证明过程如下:

(1)令结点d、结点n以及有通路到达n而该通路不经过d的所有结点构成集合L(即图5-4中的全部结点),则L必定是强连通的。

为了证明这一点,令M=L-{d,n}。

由L的组成成分可知M中每一结点ni都可以不经过d而到达n。

又因dDOMn(已知n→d为回边,由回边定义知必有dDOMn),所以必有dDOMni,如图5-4所示。

如不然,则从首结点就可以不经过d而到达ni,从而也可以不经过d到达n,这与dDOMn矛盾。

因dDOMni

所以d必有通路到达M中任一结点ni,而M中任一结点又可以通过n到达d(n→d为回边),从而M中任意两个结点之间必有一通路,L中任意两个结点之间亦必有一通路。

此外,由M中结点性质可知:

d到M中任一结点ni的通路上所有结点都应属于M,ni到n的通路上所有结点也都属于M。

因此,L中任意两结点间通路上所有结点都属于L,也即,L是强连通的。

(2)因为对所有ni∈L,都有dDOMni,所以d必为L的一个入口结点。

我们说d也一定是L的唯一入口结点。

如不然,必有另一入口结点d1∈L且d1≠d。

d1不可能是首结点,否则dDOMn不成立(因为有dDOMd1,如果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是循环的唯一入口结点。

5.8对下面四元式代码序列:

A=0

I=1

L1:

B=J+1

C=B+I

A=C+A

ifI=100gotoL2

I=I+1

gotoL1

L2:

writeA

halt

(1)画出其控制流程图;

(2)求出循环并进行循环的代码外提和强度削弱优化。

【解答】

(1)在构造程序的基本块的基础上画出该程序的流图,如图5-5所示。

 

图5-6习题5.8中代码外提后的程序流图

我们知道,强度削弱不仅可对乘法运算进行,也可对加法运算进行。

由于本题中的四元式程序不存在乘法运算,所以只能进行加法运算的强度削弱。

从图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外提到前置结点B2′中,同时在B3中I=I+1之后给C增加一个常量1。

进行强度削弱后的结果如图5-7所示。

 

图5-7习题5.8中强度削弱后的程序流图

5.9某程序流图如图5-8所示。

(1)给出该流图中的循环;

(2)指出循环不变运算;

(3)指出哪些循环不变运算可以外提。

 

图5-8习题5.9的程序流图

【解答】

(1)流图中的循环为{B2,B3,B4}。

(2)B3中的i=2是循环不变运算。

(3)循环不变运算外提的条件是:

①该不变运算所在的结点是循环所有出口结点的必经结点;

②当把循环不变运算A=BopC(B或opC可以没有)外提时,要求循环中其他地方不再有A的定值点;

③当把循环不变运算A=BopC外提时,要求循环中A的所有引用点都是而且仅仅是这个定值所能到达的。

由于i=2所在的结点不是循环所有出口结点的必经结点,故不能外提。

5.10一程序流图如图5-9所示,试分别对其进行代码外提、强度削弱和删除归纳变量等优化。

 

图5-9习题5.10的程序流图

【解答】由图5-9可知,B5→B4与B6→B2为流图的有向边,从而有

D(B5)={B1,B2,B3,B4,B5}

D(B6)={B1,B2,B3,B4,B6}

故有B4DOMB5和B2DOMB6,因此B5→B4和B6→B2为回边(其余都不是回边),即分别组成了循环{B4,B5}、{B2,B3,B4,B5,B6}。

对循环{B4,B5}、{B2,B3,B4,B5,B6}进行代码外提、强度削弱和删除归纳变量等优化后,其优化后的程序流图如图5-10所示。

 

图5-10习题5.10中优化后的程序流图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 中考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1