当前位置: 首页 > news >正文

《编译原理》画 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

相关文章:

  • 不用 qlv 格式转换成 mp4 - 优雅的下载腾讯视(mp4 格式)
  • LeetCode01 - 两数之和(Java 实现)
  • LeetCode02 - 两数相加(Java 实现)
  • LeetCode03 - 无重复字符的最长子串(Java 实现)
  • Idea 获取 git 仓库时更新类型update type 的选择
  • Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP
  • 8080 端口被占用的解决方法 netstat -ano;taskkill (命令行)
  • 手写 Spring MVC
  • Oracle 在 Drop 表时的 Cascade Constraints
  • Oracle:ORA-01219:database not open:queries allowed on fixed tables/views only
  • MyBatis: Invalid bound statement (not found) 错误的可能原因
  • Git 删除已经 Push 的远程文件夹或文件的命令方法
  • 写给自己 - 开发路上
  • ubuntu 18 自带截图工具 - 快捷键
  • svn 必须会敲的常用命令
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 4个实用的微服务测试策略
  • ES10 特性的完整指南
  • ES2017异步函数现已正式可用
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript函数式编程(一)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • leetcode讲解--894. All Possible Full Binary Trees
  • Node + FFmpeg 实现Canvas动画导出视频
  • Node 版本管理
  • node入门
  • Selenium实战教程系列(二)---元素定位
  • SQLServer之索引简介
  • WebSocket使用
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 安装python包到指定虚拟环境
  • 构建工具 - 收藏集 - 掘金
  • 关于Flux,Vuex,Redux的思考
  • 关于for循环的简单归纳
  • 小程序button引导用户授权
  • 7行Python代码的人脸识别
  • 大数据全解:定义、价值及挑战
  • 积累各种好的链接
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #stm32整理(一)flash读写
  • #大学#套接字
  • (C)一些题4
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • .bat批处理(六):替换字符串中匹配的子串
  • .describe() python_Python-Win32com-Excel
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • /etc/fstab 只读无法修改的解决办法
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [ffmpeg] x264 配置参数解析
  • [git]git命令如何取消先前的配置