一. 单选题(共10题,20分)
1. (单选题, 2分) 中间代码是介于源语言程序和什么之间的一种码? B
A 源代码
B 机器语言
C 汇编语言
D 目标代码
2. (单选题, 2分)
在编译程序中与生成中间代码的目的无关的是( )D
A便于目标代码优化
B便于存储空间的组织
C便于目标代码的移植
D便于编译程序的移植
3. (单选题, 2分)
四元式之间的联系是通过( )实现的 B
A指示器
B临时变量
C符号表
D程序变量
4. (单选题, 2分)
后缀式 ab+cd+/可用表达式( )来表示 B
Aa+b/c+d
B(a+b)/(c+d)
C a+b/(c+d)
D a+b+c/d
5. (单选题, 2分)
间接三元式表示法的优点为( ) A
A采用间接码表,便于优化处理
B节省存储空间,不便于表的修改
C便于优化处理,节省存储空间
D节省存储空间,不便于优化处理
6. (单选题, 2分)
编译过程中将源代码翻译成中间代码,具有很多优点,其中( )不是中间代码的优点。 A
A中间代码不能用于解释
B利于在不同目标机上实现同一种语言
C利于进行与机器无关的优化
D 编译程序的逻辑结构更为简单明确
7. (单选题, 2分)
中间代码生成时所依据的是( ) C
A语法规则
B词法规则
C语义规则
D等价变换规则
8. (单选题, 2分)
在目标代码生成阶段,符号表的作用是( ) B
A目标代码生成
B语义检查
C语法检查
D地址分配
9. (单选题, 2分)
以下( )不是中间代码的表示形式 D
ADAG图
B后缀式
C三元式
D间接四元式
10. (单选题, 2分)
表达式a+b*c-d/e↑f的后缀式是( ) C
Aab+c*d-e↑f
Babc+*def/↑-
C abc*+def↑/-
Dabc*+-def↑/
二. 填空题(共8题,20分)
11. (填空题, 2分)
当源程序中的标号出现“先引用后定义”时,中间代码的转移地址须持标号定义时才能确定,因而要进行 。 回填
12. (填空题, 2分)
生成中间代码主要是为了使 。目标代码的优化容易实现
13. (填空题, 4分)
文法符号的属性有两种,一种称为 综合属性 ,另一种称为 继承属性 。
14. (填空题, 4分)
符号表中名字的有关信息在 词法分析 和 语法语义分析 过程中陆续填入。
15. (填空题, 2分)
在目标代码生成阶段,符号表是 地址分配 的依据。
16. (填空题, 2分)
目标程序运行的动态分配策略中,含有栈式和 堆式 分配策略
17. (填空题, 2分)
优化就是对程序进行各种等价 变换,使之能生成更有效的 目标代码 。
18. (填空题, 2分)
局部优化是 基本块 范围内进行的一种优化。
三. 判断题(共5题,10分)
19. (判断题, 2分)
逆波兰表示法表示表达式时无须使用括号 对
20. (判断题, 2分)
在编译处理过程中,符号表只有在词法分析阶段和语法分析阶段才是有用 错
21 (判断题, 2分)
为了提高线性符号表的查找效率,可以将线性组织成自适应线性表。 对
22. (判断题, 2分)
建立完整的符号表只需要扫描一遍程序。 错
23. (判断题, 2分)
编译一个源程序时,符号表可以是一张统一的表,也可以按名字的不同种属分为几张。 对
四. 简答题(共3题,50分)
24. (简答题, 20分)
给出赋值语句X:=-Y*-(C+D)的四元式表示形式。
(1)(+,C,D,T1)
(2)(-,0,T1,T2)
(3)(*,Y,T2,T3)
(4)(-,0,T3,X)
25. (简答题, 10分)
什么是基本块?划分基本块的算法是什么?
基本块是连续三地址状态的最大序列,其中控制流只能在块的第一个语句中输入,并在最后一个语句中停留,而不会停止或分支。
划分基本块的算法:
(1)从语句序列中确定满足以下条件的出口语句:
1)第一个语句;
2)能由条件转移语句或无条件转移语句转移到的语句;
3)紧跟在条件转移语句后面的语句;
(2)确定满足以下 条件的出口语句:
1)下一个入口语句的前导语句;
2)转移语句(包括转移语句自身);
3)停语句(包括停语句自身)。
26. (简答题, 20分)
把下面的语句翻 译成四元式序列。
while A<C and B<D do
if A=1 then C:=C+1 else
while A≤D do A:=A+2
该语句的四元式序列如下(其中 E1 、 E2 和 E3 分别对应: A<C ∧ B<D, A=1 和 A≤D 并且关
系运算符优先级高):
100 (j<,A,C,102)
101(j,_,_,113 ) /*E1 为 F*/
102 (j<,B,D,104) /*El 为 T*/
103 (j,_,_,113) /*El 为 F*/
104 (j=,A,1,106) /*Ez 为 T*/
105 (j,_,_,108 ) /*EZ 为 F*/
106 ( + ,C,1,C) /*C:=C+1*/
107 (j,_,_,112) /* 跳过 else 后的语句 */
108 (j≤,A,D,110) /*E3 为 T*/
109 (j,_,_,112) /*E3 为 F*/
110 ( + ,A,2,A) /*A:=A+2*/
111 (j,_,_,108) /* 转回内层 while 语句开始处 */
112(j,_,_,100) /* 转回外层 while 语句开始处 */