📜  Compiler Design 中的有向无环图(附示例)

📅  最后修改于: 2021-09-27 06:24:32             🧑  作者: Mango

有向无环图:
有向无环图(DAG)用于表示基本块的结构,可视化基本块之间的值流,并在基本块中提供优化技术。为了将优化技术应用于基本块,DAG 是作为中间代码生成结果而生成的三地址代码。

  • 有向无环图是一种数据结构,用于对基本块进行变换。
  • 有向无环图 (DAG) 有助于基本块的转换。
  • DAG 是一种识别常见子表达式的有效方法。
  • 它演示了如何在后续语句中使用语句的计算值。

有向无环图的例子:

有向无环图特点:
基本块的有向无环图是在节点上具有以下标签的有向无环图。

  • 图的每个叶子都有一个唯一的标识符,可以是变量名或常量。
  • 图的内部节点标有运算符符号。
  • 此外,节点被赋予字符串标识符,用作存储计算值的标签。
  • 有向无环图对传递闭包和传递归约有自己的定义。
  • 有向无环图定义了拓扑排序。

有向无环图的构造算法:
在三个地址代码上构建 DAG 有三种可能的场景:

情况 1 – x = y op z
情况 2 – x = op y
情况 3 – x = y

上述情况的有向无环图可以如下构建:

第1步 –

  • 如果未定义 y 操作数,则创建一个节点 (y)。
  • 如果未定义 z 操作数,则为 case(1) 创建一个节点作为 node(z)。

第2步 –

  • 为案例(1)创建节点(OP),节点(z)作为其右孩子,节点(OP)作为其左孩子(y)。
  • 对于情况(2),看看是否有一个节点运算符(OP)和一个子节点(y)。
  • 在情况 (3) 中,节点 n 将是节点 (y)。

第 3 步 –
从节点标识符列表中删除 x。步骤 2:将 x 添加到节点 n 的附加标识符列表中。

例子 :

表达式 1:T 0 = a + b

表达式 2:T 1 = T 0 + c

表达式 3:d = T 0 + T 1

最终有向无环图

例子 :

例子 :

最终有向无环图

例子 :

最终有向无环图

例子 :

最终有向无环图

有向无环图的应用:

  • 有向无环图决定了常用的子表达式。
  • 有向无环图确定块内使用的名称以及块外计算的名称。
  • 确定块中的哪些语句可以在块外具有它们的计算值。
  • 代码可以用一个有向无环图来表示,它描述了在代码中执行的每个算术运算的输入和输出;这种表示允许编译器有效地执行公共子表达式消除。
  • 几种编程语言描述了通过有向无环图链接在一起的价值系统。当一个值改变时,它的后继值被重新计算; DAG 中的每个值都被评估为其前身的函数。