目标代码生成概述

目标代码生成程序的任务

  • 将前端产生的源程序的中间代码表示转换为等价的目标代码。

对目标代码生成程序的要求:

  • 正确
  • 高质量

代码生成程序的位置

image_up_1640186979f30f196c.jpg

输入:

  • 中间代码
  • 符号表
    • 记录了与名字有关的信息
    • 决定中间表示中的名字所代表的数据对象的运行地址

输出:

与源程序等价的目标代码

逻辑地址空间

划分成为四个代码及数据区域:

  1. 一个静态确定的代码区 Code。这个区存放可执行的目标代码。目标代码的大小可以在编译时刻确定。
  2. 一个静态确定的静态数据区 Static。这个区存放全局常量和编译器生成的其他数据。全局常量和编译器数据的大小也可以在编译时刻确定。
  3. 一个动态管理的堆区 Heap。这个区存放程序运行时刻分配和释放的数据对象。Heap 的大小不能在编译时刻静态确定。
  4. 一个动态管理的栈区 Stack。这个区存放过程的活动记录。活动记录会随着过程的调用和返回被创建和消除。和堆区 - 样,栈区的大小也不能在编译时刻确定。

目标代码的形式

  • 绝对地址的机器语言程序
    • 可把目标代码放在内存中固定的地方、立即执行
  • 可重定位的机器语言程序
    • .obj(DOS).o(UNIX)
    • 开发灵活,允许各子模块单独编译
    • 由连接装配程序将它们连接在一起,生成可执行文件
  • 汇编语言程序

代码生成程序设计的相关问题。

基本块与流图

断句

如何划分基本块(考点):

龙书说:

  1. 把中间代码划分成为基本块 (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 状态的其他语语句

若无下次引用,则变量变成非活跃

一个简单的代码生成程序