📜  编译器设计中的标注算法

📅  最后修改于: 2021-09-27 22:38:44             🧑  作者: Mango

标记算法由编译器在代码生成阶段使用。基本上,该算法用于找出程序完成其执行所需的寄存器数量。标记算法以自下而上的方式工作。我们将首先标记子节点,然后标记内部节点。标记算法的规则是:

  1. 如果“n”是叶节点——
    • 一种。如果“n”是左孩子,则其值为 1。
    • 如果 ‘n’ 是一个右孩子,那么它的值为 0。
  2. 如果“n”是一个内部节点——
    让我们假设 L1 和 L2 分别是内部节点的左子节点和右子节点。
    • 一种。如果 L1 == L2 那么 ‘n’ 的值是 L1 + 1 或 L2 + 1
    • 如果 L1 != L2 那么 ‘n’ 的值是 MAX(L1, L2)

例子:
考虑以下三个地址代码:

t1 = a + b
t2 = c + d
t3 = t1 + t2 

以上三个地址代码最多需要2个寄存器来完成它的执行。

有一个名为 getregister() 的函数,编译器使用它来决定将结果存储在哪里。这个函数有4种情况,如下:

  1. 如果有一个寄存器 R 没有保存多个值,那么我们可以使用这个寄存器来存储我们的结果的值(在上面的例子中,我们可以将 t3 存储在 R 中,前提是 R 中的当前值没有在任何地方使用该程序。)。
  2. 如果不满足第一个条件,则编译器将搜索任何空寄存器来存储我们的结果 (t3) 的值。
  3. 如果没有空寄存器,则将任何寄存器的内容交换到内存中并将结果 (t3) 存储在该寄存器中,前提是这些内容没有任何下次使用。
  4. 如果所有 3 个条件都不成立,则将结果存储在任何空闲内存位置。