第11章 功课及习题参考答案

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

编译原理作业参考答案- 1 -

第11章

(8分)将下面程序划分为基本块,并画出其基本块程序流图。

(1) if a

(2) halt

(3) if c

(4) goto (8)

(5) t1:=y+z

(6) x :=t1

(7) goto (1)

(8) t2:=y-z

(9) x :=t2

(10) goto (1)

11.1答:所谓代码优化即对代码进行等价变换,使得变换后的代码与变换前代码运行结果

相同,而运行速度加快或占用存储空间少,或两者兼有。

进行优化的基础是中间或目标代码生成,以及基本块的识别、控制流分析和数据

流分析。

2答:根据不同的阶段,分为中间代码优化和目标代码的优化。

根据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化。

3答:最常用的代码优化技术有:

(1)删除多余运算(2)代码外提

(3)强度削弱(4)变换循环控制条件

(5)合并已知量和复写传播(6)删除无用赋值

4 图11.23是图11.22的C代码的部分四元式代码序列

(1) 请将图11.23的四元式代码序列划分为基本块并做出其流图?

(2) 将每个基本块的公共子表达式删除?

(3) 找出流图中的循环,将循环不变量计算移出循环外?

- 2 - :编译原理作业参考答案

(4) 找出每个循环中的归纳变量,并且在可能的地方删除它们

图11.22

void quicksort(m,n)

int m,n;

{ int i,j;

int v,x; if (n<=m) return;

/* fragment begins here */

i = m-1;

j = n;

v = a[n];

while(1) {

do i = i+1;while (a[i]

do j = j-1; while (a[j]>v);

if (i>=j) break;

x = a[i];

a[i] = a[j];

a[j] = x;

}

x = a[i];

a[i] = a[n];

a[n] = x;

/* fragment ends here */

quicksort (m,j);

quicksort(i+1,n);

}

图11.23

(1) i:=m-1

(2) j:=n

(3) t1:=4*n

(4) v:=a[t1]

(5) i:=i+1

(6) t2:=4*i

(7) t3:=a[t2]

(8) if t3< v goto (5)

(9) j:=j-1

(10) t4:=4*j

(11) t5:=a[t4](16) t7:=4*i

(17) t8:=4*j

(18) t9:=a[t8]

(19) a[t7]:=t9

(20) t10:=4*j

(21) a[t10]:=x

(22) goto (5)

(23) t11:=4*i

(24) x:=a[t11]

(25) t12:=4*i

(26) t13:=4*n

编译原理作业参考答案- 3 -

(12) if t5> v goto (9)

(13) if i >= j goto (23)

(14) t6:=4*i

(15) x:=a[t6](27) t14:=a[t13]

(28) a[t12]:=t14

(29) t15:=4*n

(30) a[t15]:=x

答:

(1)1-4为第1块,5-8为第2块,9-12为第3块,13句为第4块,14-22为第5块,23-30句为第6块。流图如下:

(2) (14)和(16)都有4*i的运算,将(16)换成t7=t6

(17)和(20)都有4*j的运算,将(20)换成t10=t8

(23)和(25)都有4*i的运算,将(25)换成t12=t11

(3)、(26)和(29)都有4*n的运算,将(26)换成t13=t1,(29)换成t15=t1

(3) 有(5)-(8)、(9)-(12)、(5)-(22)三个循环。三个循环中没有循环不变量。

(4) 在循环(5)-(8)中,有基本归纳变量i和归纳变量t2;

在循环(9)-(12)中,有基本归纳变量j和归纳变量t4;

在循环(5)-(22)中,有基本归纳变量i和归纳变量t7、基本归纳变量j和归纳变量

t8、t10。

注意到B6:(23)-(30)不在循环内,且B6中依然对i存在引用,所以i不能删除;但j可以删除

(1) i:=m-1

(2) j:=n

(3) t1:=4*n

(4) v:=a[t1]

(p) t4 := 4 * n

(p+1) t8 := t4

(p+2) t10 := t4

(5) i:=i+1

- 4 - :编译原理作业参考答案

(6) t2:=4*i

(7) t3:=a[t2]

(8) if t3< v goto (5)

(9) j:=j-1 //删除

(10) t4:=t4 + 4

(11) t5:=a[t4]

(12) if t5> v goto (9)

(13) if t2 >= t4 goto (23)

(14) t6:=4*i

(15) x:=a[t6]

(16) t7:=4*i

(17) t8:=t8 + 4

(18) t9:=a[t8]

(19) a[t7]:=t9

(20) t10:=t10 + 4

(21) a[t10]:=x

(22) goto (5)

(23) t11:=4*i

(24) x:=a[t11]

(25) t12:=4*i

(26) t13:=4*n

(27) t14:=a[t13]

(28) a[t12]:=t14

(29) t15:=4*n

(30) a[t15]:=x

至于程序段中存在的大量4 * i公共子表达式,在代码优化时,不会在“删除归纳变量”步骤中删除。

5.如下程序流图(图11.24)中,B3中的i∶=2是循环不变量,可以将其提到前置结点吗?你还能举出一些例子说明循环不变量外移的条件吗?

图11.24