《编译原理》画 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 元式代码- 例题解析相关推荐

  1. 编译原理画出c语言中注释的转化图,编译原理节词法分析DFANFA及其转换.ppt

    编译原理节词法分析DFANFA及其转换 Step4 寻找可合并状态 ε ε 0 1 2 0 5 0 1 6 1 3 4 7 ε ε 0 8 9 1 1 0 10 11 0 0 1 1 1 0 12 1 ...

  2. 【编译原理】中间代码优化(三) 循环优化

    文章目录 循环优化概述. 计算必经节点集. 循环查找算法. 1.查找回边. 2.查找循环. 代码外提. 强度削弱. 删除归纳变量. 循环优化概述. 什么叫做循环?循环就是程序中那些可能反复执行的代码序 ...

  3. 编译原理:奇数个0和奇数个1的正规式求解

    编译原理第三版词法分析:P64-8-3 奇数个0或1,一看好像很难下手.我们从简单的做起,一步一步分析. 首先构造奇数个0,一个0时直接就是正规式:0 然后是3,5,7--个,我们需要每次增加两个0, ...

  4. 编译原理 —— 知识结构导图

    一.什么是编译 二.语言及其文法 (2.1)字母表 (2.2)串 (2.3)短语.直接短语.素短语和句柄 (2.4)文法的定义 (2.5)语言的定义 (2.6)CFG的分析树 三.词法分析 (3.1) ...

  5. 编译原理:自上而下LL(1)分析法实验(c++代码实现)

    程序输入/输出示例: 对下列文法,用LL(1)分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG (3)G->ε (4)T->FS (5)S->*F ...

  6. 编译原理教程(第四版)参考答案 胡元义

    部分页码可能有点缺失(已有P1-42:P50-90) 此处为P1~42 此处为P50~90

  7. R语言与临床模型预测——LASSO回归,单因素多因素cox,差异表达分析,Venn图,森林图,列线图,矫正曲线,ROC全套代码及解析——第十三部分 校准曲线 本专栏可免费答疑

    1.下载数据 2. 匹配基因 3. 基因去重复 4.匹配临床数据 5.批量cox回归分析 6.差异表达基因筛选 7.取交集,选出预后相关的差异表达基因 8.森林图绘制 9.lasso回归进一步排除具有 ...

  8. 大学编译原理试卷考试题

    <编译原理>期末试题(一) 一.是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.编译程序是对高级语言程序的解释执行.(× ) 2.一个有限状态自动机中,有且仅有一个 ...

  9. 【编译原理】山东大学编译原理复习提纲

    涵盖所有考点,复习绝对高效,点赞+留邮箱获取pdf版本. 山东大学编译原理复习提纲 一.简答与计算 1.1 必考 1. 编译过程 画图表示编译过程的各阶段,并简要说明各阶段的功能: 词法分析器:输入源 ...

  10. 编译原理期末复习资料

    Chomsky把文法分为几种类型?什么是文法的二义性? 乔姆斯基把文法法分成四种类型,即0型.1型.2型和3型.这几种文法类型的概念一定要掌握,是一个非常重要的考点.对于这几种文法,一般书上都只有简单 ...

最新文章

  1. JavaWEB开发04——JQuery
  2. 超全!iOS 面试题汇总
  3. 一个简单案例教你如何用Typescript写Vuex
  4. python取数组最后一个元素_Python Json。只获取json数组中的最后一个元素
  5. “钉钉打卡神器”开发者被判五年半!
  6. 拓端tecdat|R语言Gabor滤波进行目标图像纹理特征的提取
  7. Mac上的MySQL可视化工具总结
  8. MOOC创新创业学第十二章单元测试题及答案
  9. control reaches end of non-void function [-Wreturn-type] 实例分析
  10. win10家庭版怎么删除多余的用户
  11. VisualStudio2019 安装时下载不动或者显示下载失败
  12. Scrapy 豆瓣搜索页爬虫
  13. Jetson Orin 平台GMSL camera 96712调试手册重点
  14. Linux-Ubuntu 和 安装 genymotion 的一些问题和一些命令
  15. Axure 交互学习1 基础页面跳转、鼠标悬停样式
  16. 翻译考试用计算机作答,2021翻译资格水平考试:CATTI考试时间是多久?考试是上机操作吗?...
  17. 将本地项目上传至码云仓库
  18. php 传递指针,windtear 追求完美
  19. mysql rollback如何使用_MYSQL的COMMIT和ROLLBACK使用讲解
  20. Final Cut Pro 一篇入门(没废话、干货)

热门文章

  1. 在心中刻上你的名字,让思念如烟
  2. 玩转群晖NAS套件系列七:File Station的安装与使用保姆级教程!
  3. 用Excel利用RFM模型进行客户细分
  4. shader 重建世界坐标
  5. 通过js脚本处理剪切板(简单而强大的效率工具)
  6. 极路由2hc5761刷华硕固件_[固件] 【原创首发】极二路由HC5761 9012.1.9227s成功刷成openwrt...
  7. 历史记录具体时间linux,查看命令历史记录及其操作时间
  8. 自动写代码工具要颠覆码农?(转)
  9. 【科普】码农是程序员吗?码农与真正程序员的区别是啥?
  10. 童年十大经典玩耍游戏