目标代码生成概述
目标代码生成程序的任务
- 将前端产生的源程序的中间代码表示转换为等价的目标代码。
对目标代码生成程序的要求:
- 正确
- 高质量
代码生成程序的位置
输入:
- 中间代码
- 符号表
- 记录了与名字有关的信息
- 决定中间表示中的名字所代表的数据对象的运行地址
输出:
与源程序等价的目标代码
逻辑地址空间
划分成为四个代码及数据区域:
- 一个静态确定的代码区 Code。这个区存放可执行的目标代码。目标代码的大小可以在编译时刻确定。
- 一个静态确定的静态数据区 Static。这个区存放全局常量和编译器生成的其他数据。全局常量和编译器数据的大小也可以在编译时刻确定。
- 一个动态管理的堆区 Heap。这个区存放程序运行时刻分配和释放的数据对象。Heap 的大小不能在编译时刻静态确定。
- 一个动态管理的栈区 Stack。这个区存放过程的活动记录。活动记录会随着过程的调用和返回被创建和消除。和堆区 - 样,栈区的大小也不能在编译时刻确定。
目标代码的形式
- 绝对地址的机器语言程序
- 可把目标代码放在内存中固定的地方、立即执行
- 可重定位的机器语言程序
.obj(DOS)
、.o(UNIX)
- 开发灵活,允许各子模块单独编译
- 由连接装配程序将它们连接在一起,生成可执行文件
- 汇编语言程序
代码生成程序设计的相关问题。
基本块与流图
断句
如何划分基本块(考点):
龙书说:
- 把中间代码划分成为基本块 (basic block)。每个基本块是满足下列条件的最大的连续三地址指令序列。 ①控制流只能从基本块中的第 - 一个指令进人该块。也就是说,没有跳转到基本块中间的转移指令。 ②除了基本块的最后一个指令,控制流在离开基本块之前不会停机或者跳转。
- GOTO 后断。
- GOTO 到的语句之前断。
GOTO 前不断后断。
1 i := 1
2 if i<=10 goto (4)
3 goto (17)
4 t1:= a-4
5 t2:= 4*i
6 t3:= a-4
7 t4:= 4*i
8 t5:=t3[t4]
9 t6:=b-4
10 t7:=4*i
11 t8:=t6[t7]
12 t9:=t5+t8
13 t1[t2]:=t9
14 t10:=i+1
15 i:=t10
16 goto (2)
17 …
GOTO 目标语句之前断。
1 i:=1
2 if i<=10 goto (4)
3 goto (17)
4 t1 := a-4
5 t2 := 4*i
6 t3 := a-4
7 t4 := 4*i
8 t5 := t3[t4]
9 t6 := b-4
10 t7 := 4*i
11 t8 := t6[t7]
12 t9 := t5+t8
13 t1[t2]:=t9
14 t10:=i+1
15 i:=t10
16 goto (2)
17 …
GOTO 目标语句之前断。
1 i:=1
2 if i<=10 goto (4)
3 goto (17)
4 t1 := a-4
5 t2 := 4*i
6 t3 := a-4
7 t4 := 4*i
8 t5 := t3[t4]
9 t6 := b-4
10 t7 := 4*i
11 t8 := t6[t7]
12 t9 := t5+t8
13 t1[t2]:=t9
14 t10:=i+1
15 i:=t10
16 goto (2)
17 …
例子 2
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]
12 if t5 > v goto (9)
13 if i >= j goto (23)
14 t6 := 4*i
15 x := a[t6]
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
27 t14 := a[t13]
28 a[t12] := t14
29 t15 := 4*n
30 a[t15] := x
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]
12 if t5 > v goto (9)
13 if i >= j goto (23)
14 t6 := 4*i
15 x := a[t6]
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
27 t14 := a[t13]
28 a[t12] := t14
29 t15 := 4*n
30 a[t15] := x
下次引用信息
i: x:= 1
... \
... \
j: y:= x op z
j 是语句 i 中的 x 的下次引用。
要求:没有改变变量 x 状态的其他语语句
若无下次引用,则变量变成非活跃。