什么是DAG(只讲概念不讲算法)
前提知识
中间表达
编译器的目的是将源程序编程目标代码(汇编)放入计算机执行。

这里有一个问题,世界上有很多不同架构的CPU,比如x86,ARM等。不同架构的CPU有不同的汇编。于是上图带来的问题是直接从源程序翻译成不同架构CPU的目标代码工作量太大且容易出错。正确的做法是在源程序和目标代码中间加一层中间表示作为桥梁,将其衔接起来。

名词解释
DAG: Directed Acycle Graph
中文:无环有向图
通过名字就知道,该图不是闭合的,但是内部有方向。
重点:
- DAG叶子节点对应原子运算分量。
原子运算:每次只进行一次操作
-
在DAG中一个结点N表示一个公共子表达式,但N可能有多个父节点。比如
a*(b-c)+(b-c)*db-c作为一个表达式,其表达式树为_ / \ b c但该子树有2个父节点
* * \ / - / \ b c整个表达式的变化过程为:
- 形成
a*(b-c)和(b-c)*d的子树组合
* * / \ / \ a - d / \ b c- 用
+将二者合并
+ / \ * * / \ / \ a - d / \ b c - 形成
举例说明

语法制导和编码
语法制导算法将源文件表达式转成DAG。具体实现参见《编译原理(第二版)》6.1,关于如何对DAG的节点进行编码参见6.2.
用途
用于产生三地址代码,三地址代码很容易转成对应平台的汇编指令
本文介绍了DAG(无环有向图)在编译器中的应用,作为源程序和目标代码之间的桥梁,处理不同架构CPU的问题。DAG节点表示公共子表达式,用于生成三地址代码,便于转换为特定平台的汇编指令。
659

被折叠的 条评论
为什么被折叠?



