📜  编译器设计检测三个地址代码中的循环

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

先决条件–编译器中的三个地址代码
循环优化是中间代码生成之后的阶段。该阶段的主要目的是减少程序中的行数。在任何程序中,大多数时间都花在任何程序上,而实际上是在迭代程序的循环内。如果是递归程序,则将在其中存在一个块,并且大部分时间将出现在该块内部。

循环优化–

  1. 要应用循环优化,我们必须首先检测循环。
  2. 为了检测循环,我们使用程序流程图(PFG)使用控制流分析(CFA)。
  3. 要找到程序流程图,我们需要找到基本块

基本块–基本块是由三个地址语句组成的序列,其中控制从头开始进入,仅在末尾离开而没有任何跳跃或停止。

寻找基本障碍–
为了找到基本块,我们需要在程序中找到领导者。然后,一个基本的块将从一个领导者开始到下一个领导者,但不包括下一个领导者。这意味着如果您发现第1行是一个领导者而第15行是下一个领导者,则从1到14的行是一个基本块,但不包括第15行。

确定基本块中的领导者–

  1. 第一句话永远是领导者
  2. 有条件或无条件语句的目标语句是领导者
  3. 紧随有条件或无条件陈述之后的陈述是领导者
fact(x)
{
    int f = 1;
    for (i = 2; i <= x; i++)
        f = f * i;
    return f;
}

上面的C代码的三个地址代码:

  1. f = 1;
  2. 我= 2;
  3. 如果(i> x)转到9
  4. t1 = f * i;
  5. f = t1;
  6. t2 = i + 1;
  7. i = t2;
  8. 转到(3)
  9. 转到调用程序

领导者和基本块–

控制流分析–

如果控件输入B1,则在B1之后没有其他选项,则必须输入B2。现在,如果控制进入B2,则取决于条件,控制将流动,如果条件为真,我们将在第9行行,这意味着9除了B4外什么都不是。但是,如果条件为假,则控制转到下一个块B3。在B3之后,根本没有条件,我们直接转到第三条语句B2。上面的控制流程图在B2和B3之间有一个循环,仅是一个循环。