程序依赖相关知识点(PDG,SDG)

什么叫可达性

变量v的定义d:对变量v的赋值语句称为变量v的定义

变量v的使用:在某个表达式中引用变量v的值

当变量v被再次赋值时,上一次赋值对变量v的定义d就被kill掉了

如果定义d到点p之间存在一条路径,且在路径中定义d没有被kill掉,则称d可以到达p

如下图所示,d可以通过path2到达u但是不能通过path1到达u,因为k这条语句kill掉了定义d。而因为d到u之间存在着没有被kill的路径path2,所以d可以到达u。

X = . 叫做精确定义,*p = . 叫做模糊定义,因为p可能指向X,一般考虑可达性只考虑精确定义对路径的kill。

数据依赖

两个句子存在数据依赖:一条语句中一个变量的定义,可以到达另一条语句中对该变量的使用

在编译领域有不同类型的数据依赖,如果我们说s2依赖于s1,可以是:

  1. s1 写内存 s2 读 (RAW)
  2. s1 读内存 s2 写 (WAR)
  3. s1 写内存 s2 写 (WAW)
  4. s1 读内存 s2 读 (RAR)

在软件工程领域,主要关注RAW依赖,在源码或IR的层度上。

DU-chains: def-use chains 优点是可以快速得到数据依赖,缺点是必须不断计算和更新,空间开销大。将每个语句作为结点,箭头作为有向边,即可得到数据依赖图。

SSA:static single assignment 每一次赋值都由一个不同的变量表示,优点是使得分析变得简单高效,缺点是需要添加额外的条件才能正确执行,时空开销大。

如下图所示,转换为SSA就是使得每个变量只有一次定义。转换过程有两个步骤,分别为对每一个定义重命名,和对所有定义能到达的使用重命名。

PDG:程序依赖图

程序依赖图的结点代表语句,边代表依赖关系,这里的依赖关系包括数据依赖和控制依赖

数据依赖:

s1: A = B * C;
s2: D = A * E + 1
由于s1语句变量A在s2语句中被读,因此称s2数据依赖于s1

控制依赖:

s1: if (A) then
s2:  B = C * Dendif
由于s1语句变量A的值决定了s2语句是否被执行,因此称s2控制依赖于s1

其中控制依赖用实箭头表示,数据依赖用虚箭头表示。构建PDG图的整体流程如下。

首先做出其控制流图,从中找到控制依赖图和数据依赖图,结合起来即得到PDG图。数据依赖图上面已经说过了,控制依赖图由控制流图和FDT(Forward dominance Tree)产生。

FDT就是前向支配树,那么什么是支配树呢?编译原理里面有这样的一个概念,如果每一条从流图的入口结点到结点n的路径都经过结点d, 我们就说d支配(dominate)n,记为d dom n。请注意,在这个定义下每个结点都支配它自己如下图所示,左侧为流图,右侧为其对应的支配树。

在支配树(dominator tree)中,对于结点n来说,从根节点到结点n所在路径上的结点都严格支配结点n,例如上图中从根节点1 -> 2 -> 3,其中结点1和结点2都严格支配结点3。该路径上离结点n最近的结点叫做结点n的直接支配结点(immediate node),用IDom(n)表示,例如上图中IDom(6) = 2。

前向支配树(FDT)指的就是根节点为函数出口的支配树,也就是上图的翻转,如下图所示,右侧为左侧函数对应的FDT(比如5->2的箭头表示,所有从函数出口到2的路径都一定会经过5,因此5是2的主导):

于是,得到FDT后将其与控制流图结合即可得到控制依赖图如下,有了控制依赖图,加上之前的数据依赖图,集合起来就得到了程序依赖图PDG。

SDG:系统依赖图

系统依赖图,顾名思义,在PDG的基础上增加了一些点和边将整个系统整合在一起表示,对于系统中主函数的依赖图称为program dependence graph,对于其余函数称为procedure dependence graphs。

SDG中增加了5类新的结点:1)调用点 2)actual-in结点:它是具有与调用点相关的控制依赖,将实参的值传入一个临时单元中(例如x_in) 3) actual-out结点:也是具有与调用点相关的控制依赖,将临时单元中的值返回给实参 4)formal-in结点:它是具有与被调函数入口相关的控制依赖,将临时单元中的值复制给形参 5)formal-out结点:也是具有与被调函数入口相关的控制依赖,将形参中的值返回给临时单元

SDG中增加了3类新的边:1)从调用点指向被调函数入口结点的边 2)parameter-in边:actual-in结点指向formal-in结点的边(相当于实参->临时单元->形参) 3)parameter-out边: formal-out结点指向actual-out结点的边(相当于上述过程的返回过程)

一个SDG图的例子如下:

生成SDG的步骤:

1)首先先生成主函数的program dependence graph,和所有被调函数的procedure dependence graphs

2)对于每一个调用点,添加一条边指向被调函数的入口点

3)对于在调用点处的每一个actual-in的结点,添加一条parameter-in的边,指向被调函数对应的formal-in的结点

4)对于在调用点处的每一个actual-out的结点,添加一条parameter-out的边,由被调函数对应的formal-out的结点所指向

参考文献:

【1】Ferrante J, Ottenstein K J, Warren J D. The program dependence graph and its use in optimization[J]. ACM Transactions on Programming Languages and Systems (TOPLAS), 1987, 9(3): 319-349.

【2】Sinha S, Harrold M J, Rothermel G. System-dependence-graph-based slicing of programs with arbitrary interprocedural control flow[C]//Proceedings of the 1999 International Conference on Software Engineering (IEEE Cat. No. 99CB37002). IEEE, 1999: 432-441.

【3】Tip F. A survey of program slicing techniques[M]. Amsterdam: Centrum voor Wiskunde en Informatica, 1994.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ管控台使用

安装成功RabbitMQ后,进入到管理控制台界面 拷贝配置文件到指定目录当中然后重启RabbitMQ。

ES-OAS-ERP-电子政务-企业信息化

ES-OAS-ERP-电子政务-企业信息化 专家系统ES办公自动化系统OAS企业资源规划ERP典型的信息系统架构模型 专家系统ES 模拟人类专家,解决结构化,半结构化问题 数据级,知识库级,控制级 专家系统的特点就是和人的区别 启发性知识&#…

RHCSA-VM-Linux基础配置命令

1.代码命令 1.查看本机IP地址&#xff1a; ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1&#xff1a;<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>为虚拟机自身网卡 2.测试网络联通性&#xff1a; [f…

HTTPS加密协议详解:TLS/SSL握手过程

1、握手与密钥协商过程 基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。 (1).client_hello 客户端发起请求&#xff0c;以明文传输请求信息&#xff0c;包含版本信息&#xff0c;加密套件候选列表&#xff0c;压缩算法候选列表&#xff0c;随机数&#…

Kotlin 协程 - 生命周期 Job

一、概念 对于每一个由协程构建器开启的协程&#xff0c;都会返回一个 Job 实例用来管理协程的生命周期。launch()直接返回 Job实现&#xff0c;async() 返回的 Deferred 实现了 Job接口。 Job public fun start(): Boolean public fun cancel(cause: CancellationException? …

引入Bootstrap的CSS样式后,<h>标签、<p>标签等HTML自带的标签被覆写没有?答:覆写了。

引入Bootstrap的CSS样式后,标签、 标签等HTML自带的标签被覆写没有&#xff1f;答&#xff1a;覆写了。 为什么这么说&#xff1f;证据呢&#xff1f; 写一个实例&#xff0c;然后调试模式看一下不就得了。 先看没有引入引入Bootstrap的CSS样式情况。 代码如下&#xff1a; …

一些芯片设计的冷知识

关于芯片物理版图 芯片物理版图是一种用来描述集成电路内部结构和连接的图形文件&#xff0c;它是芯片设计的最终结果&#xff0c;也是芯片制造的依据。芯片物理版图中包含了各种工艺层的信息&#xff0c;例如多晶硅层、金属层、活性区层、接触层等&#xff0c;每一层都有不同…

什么是JavaScript中的严格模式(strict mode)?应用场景是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 严格模式&#xff08;Strict Mode&#xff09;&#xff1a;⭐ 使用场景⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

在Git中将本地分支推送到远程仓库

这里很明显 我git云端只有一个master分支 然后 我在本地创建了一个develop分支 然后 现在我想将他放在云端 首先 我们要执行 git checkout -b develop将本地切换到 develop 分支上 因为我这里已经选择的就是了 就不需要了 然后我们执行 git push origin develop这样 刷新云…

DHCP工作过程详解

只有是一个网段的&#xff0c;它才会发送 ARP 请求&#xff0c;获取 MAC 地址。如果发现不是呢&#xff1f;Linux 默认的逻辑是&#xff0c;如果这是一个跨网段的调用&#xff0c;它便不会直接将包发送到网络上&#xff0c;而是企图将包发送到网关。 因为网关要和当前的网络至…

2023 年前端编程 NodeJs 包管理工具 npm 安装和使用详细介绍

npm 基本概述 npm is the world’s largest software registry. Open source developers from every continent use npm to share and borrow packages, and many organizations use npm to manage private development as well. npm 官方网站&#xff1a;https://www.npmjs.…

[EROOR] SpringMVC之500 回调函数报错

首先&#xff0c;检查一下idea里面的报错的原因&#xff0c;我的是jdk的版本的问题。所以更换一下就可以了。

React+Typescript+react-router 6 创建路由操作

本文我们来看看路由的安装 其实路由的操作没有什么变化 但是还是给大家讲一下 那么我们打开项目 在项目终端输入 npm install --save react-router react-router-dom安装 一下 react-router 和 react-router-dom 这都是react开发很基本的插件了 不过大家安装前先注意好我的版…

【MySQL学习笔记】(八)复合查询

在前面的笔记中做的查询基本都是对一张表进行查询&#xff0c;在实际开发中远远不够&#xff0c;本篇文章内容是复合查询相关的笔记。需要用到oracle9i的经典测试表&#xff0c;在笔记&#xff08;六&#xff09;中已经教大家如何导入了。 复合查询 基本查询回顾多表查询子连接…

如何实现24/7客户服务自动化?

传统的客服制胜与否的法宝在于人&#xff0c;互联网时代&#xff0c;对于产品线广的大型企业来说&#xff1a;单靠人力&#xff0c;成本大且效率低&#xff0c;相对于产品相对单一的中小型企业来说&#xff1a;建设传统客服系统的成本难以承受&#xff0c;企业客户服务的转型已…

MSTP + Eth-Trunk配置实验 华为实验手册

1.1 实验介绍 1.1.1 关于本实验 以太网是当今现有局域网LAN&#xff08;Local Area Network&#xff09;采用的最通用的通信协议标准&#xff0c;以太网作为一种原理简单、便于实现同时又价格低廉的局域网技术已经成为业界的主流。 本实验主要介绍了LAN网络中的Eth-Trunk技术…

NameError: name ‘add start docstrings to callable‘ is not defined解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MYSQL的慢查询

通过查询SQL的执行频次&#xff0c;我们就能够知道当前数据库到底是增删改为主&#xff0c;还是查询为主。 那假如说是以查询为主&#xff0c;次数我们可以借助于慢查询日志。接下来&#xff0c;我们就来介绍一下MySQL中的慢查询日志。 慢查询日志 慢查询日志记录了所有执行时间…

51单片机的简易计算器数码管显示仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机的简易计算器数码管显示仿真设计 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 51单片机的简易计算器数码管显示仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器…

微信小程序AI类目-深度合成-AI问答/AI绘画 互联网信息服务算法备案审核通过教程

近期小程序审核规则变化后&#xff0c;很多使用人类小徐提供的chatGPT系统的会员上传小程序无法通过审核&#xff0c;一直提示需要增加深度合成-AI问答、深度合成-AI绘画类目&#xff0c;该类目需要提供互联网信息服务算法备案并上传资质&#xff0c;一般对企业来说这种务很难实…