《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析
《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析
DAG 图(Directed Acylic Graph)无环路有向图
(一)基本块
基本块是指程序中一顺序执行的语句序列,其中只有一个入口语句(第一个语句)和一个出口语句(最后一个语句)
对于一个基本块来说,执行时只能从其入口语句进入,从其出口语句退出
| 语句 | |
|---|---|
| 出口语句 | 任何控制转移四元式 |
| 入口语句 | 所转向的目标语句 |
(二)划分基本块的步骤
1、求四元式序列中各个基本块的入口语句。
- ① 程序的第一个语句
- ② 能由条件或无条件转移语句转移到的语句
- ③ 紧跟在条件转移语句后面的语句
2、对每一入口语句,构造所属的基本块,该基本块由:
- 1)该入口语句到下一入口语句(不包括下一入口语句)之间的语句序列组成
- 2)该入口语句到一转移语句(包括该转移语句)之间的语句序列组成
- 3)该入口语句到一停语句(包括该停语句)之间的语句序列组成
3、凡是未包含在某一基本块中的语句,都是程序中控制流程不可达的语句,可删除它们。
例题:
对于下面给出的求最大公因子的程序,可以根据基本块的构造规则与其划分基本块

基本块构造步骤:
(1):由规则 (1) 中的 ① 可知语句 (1) 是一个入口语句
(2):由规则 (1) 中的 ② 可知,语句 (3) 和 (8) 均是人口语句
(3):由规则 (1) 中的 ③ 可知,语句 (5) 是二个人口语句,可以用 “+” 在人口语句的左侧作标记。
(4):由规则 (2) 可以划分该程序为四个基本块,它们分别是:
- 语句 (1)、(2) 组成的基本块 B1
- 语句 (3)、(4) 组成的基本块 B2
- 语句 (5)、(6) 和 (7) 组成的基本块 B3
- 语句 (8) .(9) 组成的基本块 B4
程序中在代码段左侧对各个基本块进行了标记。
(三)程序控制流程流图
定义: 以基本块为结点,控制程序流向作为有向边,画出的有向图称为流图。
特点:
- 具有唯一首结点的有向图
- 从首结点开始到流图中任何结点都有通路
如果一个结点的基本块的入口语句是程序的第一条语句,则称此结点为首结点
程序控制流程流图的表示
一个控制流程图可表示成一个三元组:
G=(N,E,n0 )
N:所有结点(基本块)集;
E:所有有向边集;
n0 :首结点。
有向边:
当下述条件有一个成立时,从结点i有一有向边引向结点 j:
- ① 基本块 j 在程序的位置紧跟在i后,且 i 的出口语句不是无条件转移或停语句
- ② i 的出口是 goto(S) 或 if goto(S),而 (S) 是 j 的入口语句

构造程序控制流图
对程序基本块:

构造以下程序控制流图:

(四)基本块的 DAG 表示
DAG Directed Acyclic Graph 无环路有向图
定义:
(1) 在一个有向图中,若结点 ni 有弧指向结点 nj,则 ni 是 nj 的父结点,nj 是 ni 的子结点;
(2) 若 n1,n2,…,nk 间存在有向弧 n1→n2→…→nk,则称 n1 到 nk 之间存在一条通路,若有 nk=n1,则称该通路为环路;
(3) 若有向图中任意通路都不是环路,则称该图为无环路有向图(DAG)
用来描述基本块的 DAG:
(1) 图的叶结点以一标识符或常数做标记,表示该结点代表该变量或常数的值。
(2) 图的内部结点以一运算符作为标记;
(3) 图中各个结点上可能附加一个或多个标识符,表示这些标识符具有该结点所代表的值,简称附标。
四元式对应的 DAG 结点形式
按其四元式对应结点的后继个数分成四种类型:0型、1型、2型、3型

(五)DAG 图构造例题
对于基本块 P
(1)S0 := 2
(2)S4 := 2
(3)S1 := 1.5
(4)S2 := T-C
(5)S3 := T+C
(6)S5 := S3
(7)R := 2/S3
(8)S6 := R
(9)H := R*S2
(1)试用 DAG 进行优化并重写基本块
(2)假定只有 R,H 在基本块出口是活跃的,试写出优化后的 4 元式序列
(只需要还原活跃变量)
解析:
(1)画出 DAG 图如下:
画图的步骤就是:根据基本块,一部一部组装

(2)假定只有 R,H 在基本块出口是活跃的,试写出优化后的 4 元式序列
(只需要还原活跃变量)
优化后的 4 元式代码可以写为:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2
解释:
与原来的基本块相比较可以看出:
- 原基本块中的 (2) 和 (7) 中的已知量都已经合并。因为 (2) 中 S4 := 2,(7) 中用 2,所以合并。
- (5) 和 (8) 中的公共子表达式 T+C 只在 (5) 中计算一次,在 (8) 中 直接引用其结果,所以删除了多余运算。
- (6) 中的无用赋值已被删除。S5 := S3,S5 后面没有再用,所以就和 S3 一起表示。
除了可以应用 DAG 进行上述的优化外,还可以从基本块的 DAG 中得到一些其他信息:
- DAG 叶结点上标记的标识符是在该基本块之前的基本块内被定值,并在该基本块内被引用的标识符。
- DAG 各结点上的附加标识符是在基本块内被定值,并可以在基本块后被引用的标识符。
如果确认某结点的一个附加标记在基本块后不会被引用,则该标识符的定值语句可以作为死代码被删除。
假设上面例子中 S0~S6。在基本块后面都不会被引用只有 R, H 在基本块出口是活跃的则优化后的四元式序列可以写为:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2
《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析的更多相关文章
- 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析
<编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...
- Go 编译原理实现计算器(测试驱动讲解)
本文不需要你掌握任何编译原理的知识. 只需要看懂简单的golang语言即可, 完整的代码示例在GIT, 代码是从writing an interpreter in go这本书抽取了简单的部分出来, 如 ...
- GCC编译器原理(三)------编译原理三:编译过程(2-1)---编译之词法分析
二.编译 引用文档:https://blog.csdn.net/chdhust/article/details/9040647 编译过程就是把预处理完的文件进行一系列词法分析.语法分析.语义分析及优化 ...
- POJ 1442 Air Raid(DAG图的最小路径覆盖)
题意: 有一个城镇,它的所有街道都是单行(即有向)的,并且每条街道都是和两个路口相连.同时已知街道不会形成回路. 可以在任意一个路口放置一个伞兵,这个伞兵会顺着街道走,依次经过若干个路口. 问最少需要 ...
- 深入理解 Flutter 的编译原理与优化
阿里妹导读:对于开发者而言,Flutter工程和我们的Android/iOS工程有何差别?Flutter的渲染和事件传递机制如何工作?构建缓慢或出错又如何去定位,修改和生效呢?凡此种种,都需要对Flu ...
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- 《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析
<编译原理>求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集. 表示及含义: FIRSTVT(T) 非 ...
- 编译原理_P1004
龙书相关知识点总结 //*************************引论***********************************// 1. 编译器(compiler):从一中语言( ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
随机推荐
- python学习笔记3-循环1
1 while break continue #while语句 ''' while 判断条件: 执行语句…… ''' count = 0 while (count < 9): print ('T ...
- 用grep在子目录中指定的文件类型中查找(转载)
转自:http://www.ai7.org/wp/html/653.html grep -r abcd *.py 这样的命令得不到你期待的结果,而 grep -r abcd * 这样得到的结果又太多, ...
- POJ - 1661 - Help Jimmy - 简单dp
http://poj.org/problem?id=1661 一般化处理,把一开始的落地和大地都视作平台,设计平台类的属性.dp的时候显然是从上往下dp的,而且要小心Jimmy不能够穿过平台,也就是从 ...
- C++笔试题(十)
这些题目相比其他公司的试题,较为基础,全部为C语言,没有涉及C++,但如果不细心,是很难得到较高分数的.另外大家转贴不要去掉我的个人信息啊.互相宣传下网站嘛.1. 找错 void test1() { ...
- Tenka1 Programmer Beginner Contest D - IntegerotS(位运算)
传送门 题意 给出N,K,给出N对数a[i],b[i],选择一些数使得or和小于k且\(max\sum b[i]\) 分析 枚举k的每一个1位,将其删去并让低位全为1,对于每一个这样的数c,如果a[i ...
- 第十篇 .NET高级技术之委托
委托是一种可以指向方法的数据类型,可以声明委托类型变量. 声明委托的方式:delegate返回值类型 委托类型名(参数) 比如delegate void MyDel(int n) 注意这里的除了前 ...
- C# BitmapData使用说明
C# BitmapData使用说明msdn关于BitmapData原文解释地址:http://msdn.microsoft.com/zh-cn/library/5ey6h79d(v=vs.110).a ...
- Qt容器类之二:迭代器
一.介绍 遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目.Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器.如果只是想按顺 ...
- 题解报告:hdu 1520 Anniversary party(树形dp入门)
Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural Stat ...
- pkill 和 pgrep总结
查看进程ID和方便kill进程 pgrep -d 指定分隔符 pgrep -d ' ' -u root 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 -u p ...