📜  编译器设计中的基本块

📅  最后修改于: 2021-06-28 07:21:07             🧑  作者: Mango

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

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

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

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

流程:确定中间代码中作为领导者的指令。以下是用于查找领导者的规则:

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

对于这样确定的每个领导者,其基本块都包含其自身以及所有指令,直至排除下一个领导者为止。

例子:
用于将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)用于使元素0元素1.这些步骤由goto语句递归使用。

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