📜  编译器设计中的基本模块

📅  最后修改于: 2021-09-28 10:15:03             🧑  作者: Mango

基本块是一个直线代码序列,除了入口和末尾分别没有分支输入和输出分支。基本块是一组始终按顺序依次执行的语句。

第一个任务是将三地址代码序列划分为基本块。新的基本块从第一条指令开始,并添加指令直到遇到跳转或标签。在没有跳转控制的情况下,从一条指令到另一条指令会更连续地移动。这个想法在下面的算法中被标准化:

算法:
将三地址代码划分为基本块。

输入:三个地址指令的序列。

过程:确定来自中间代码的指令,即领导者。以下是用于寻找领导者的规则:

  1. 中间代码的第一个三地址指令是一个前导。
  2. 作为无条件或条件跳转/goto 语句目标的指令是领导者。
  3. 紧跟在无条件或条件跳转/goto 语句之后的指令被视为领导者。

对于由此确定的每个领导者,其基本块包含自己和所有指令,直到排除下一个领导者。

例子:
将 10*10 矩阵设置为单位矩阵的中间代码:

1)  i=1        //Leader 1 (First statement)
2)  j=1             //Leader 2 (Target of 11th statement)
3)  t1 = 10 * i     //Leader 3 (Target of 9th statement) 
4)  t2 = t1 + j
5)  t3 = 8 * t2
6)  t4 = t3 - 88
7)  a[t4] = 0.0
8)  j = j + 1
9)  if j <= goto (3)       
10) i = i + 1                    //Leader 4 (Immediately following Conditional goto statement)
11) if i <= 10 goto (2)
12) i = 1                        //Leader 5 (Immediately following Conditional goto statement)
13) t5 = i - 1                   //Leader 6 (Target of 17th statement) 
14) t6 = 88 * t5
15) a[t6] = 1.0
16) i = i + 1
17) if i <= 10 goto (13) 

给定的算法用于将矩阵转换为单位矩阵,即所有对角线元素为 0 且所有其他元素为 1 的矩阵。步骤 (3)-(6) 用于使元素为 0,步骤 (14) 用于使元素 1. 这些步骤由 goto 语句递归使用。

上面的代码中有6 个基本块:
B1) 声明 1
B2) 声明 2
B3) 声明 3-9
B4) 声明 10-11
B5) 声明 12
B6) 声明 13-17