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

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

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

  1. 如果“ n”是叶节点–
    • 一种。如果“ n”是左孩子,则其值为1。
    • b。如果“ n”是正确的子代,则其值为0。
  2. 如果“ n”是一个内部节点–
    假设L1和L2分别是内部节点的左子节点和右子节点。
    • 一种。如果L1 == L2,则’n’的值为L1 +1或L2 +1
    • b。如果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. 如果这三个条件都不满足,则将结果存储在任何可用的存储位置中。