返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么用Python实现简单的C++程序范围
  • 522
分享到

怎么用Python实现简单的C++程序范围

2023-06-29 06:06:10 522人浏览 安东尼
摘要

本篇内容主要讲解“怎么用python实现简单的c++程序范围”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现简单的C++程序范围”吧!1. 实验说明问题要求:针对静态单赋值(

本篇内容主要讲解“怎么用python实现简单的c++程序范围”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现简单的C++程序范围”吧!

    1. 实验说明

    问题要求:针对静态单赋值(SSA)形式的函数中间代码输入,输出函数返回值的范围

    实现思路: 基本根据 2013年在CGo会议上提出的“三步法”范围分析法加以实现[3],求得各个变量的范围

    算法优势:空间复杂度和时间复杂度都是 O(n),效率高

    算法瓶颈: “三步法”的功能存在较大局限,它只能分析各个变量的最大范围,对活跃变量只做了最简单的考虑,因此最终得到的范围比较不准确,往往只能得到范围的一个界

    2. 项目使用

    python main.py (ssa文件路径在main.py中设置)

    不需要安装任何库。

    3. 算法原理

    简单概括:采用三步法(2013年在CGO会议上提出)

    3.1 构建CFG

    代码:\src\eSSAConstraintGraph.py; \src\structure.py

    功能:解析SSA,构建CFG。

    由于函数之间存在调用关系,因此首先把SSA划分成不同的函数的SSA,再分别构建CFG。CFG中保留了每一个函数的语句、Block之间的关系,为下一步构建Constraint Graph打基础。

    CFG的结构如下:

    # CFG类      class CFG:    def __init__(self):        self.name = ''        self.Blocks = []        self.Edges = []        self.Arguments = []

    3.2 构建Constraint Graph

    代码:\src\eSSAConstraintGraph.py

    三步法的前提是构建Constraint Graph数据结构如下。在这一步中,我用自己定义的数据类型Mynode来表示一条Constraint

    # Constraint Graph类      class ConstraintGraph:    def __init__(self, cfg):        self.MyNodes = []            #基本节点,每一个节点是一个Constraint        self.MyConditions = []        #用于后面E-SSA Constraint Graph补充条件        self.cfg = cfg                     self.Arguments = []            #输入参数        self.returnName = ''        #输出参数# MyNode : Constraint Graph的节点,也就是保存变量范围的地方class MyNode:    def __init__(self, t= "", name = "",  args = [], result = [], fromBlock = 0, Statement = ''):        self.type = t             #节点类型:leave 叶节点存放范围和值 #op运算符 #var变量名        self.name = name.strip()  #节点名称:运算名称,或变量名称        self.args = args    #参数,一个节点是另一个节点的argument,意味着二者之间有边相连        self.result = result        #被用到哪,一个节点是另一个节点的result,意味着二者之间有边相连        self.Conditions = []        #约束条件, 在后面E-SSA Constraint Graph中补充条件        self.fromBlock = fromBlock  #在CFG的哪个Block中定义的        self.Statement = Statement  #在SSA中的哪条Statement中        self.Range = Range()        #节点范围        self.size = ''        self.input = False# Range由两个Bound组成 class Range:    def __init__(self ):        self.lowBound = Bound()        self.highBound = Bound()# Bound由值和类型组成class Bound:    def __init__(self):        self.value = 'None'      # inf 最大值 ; -inf 最小值; None 未设置; Not Exists 不存在        self.size = 'None'       #边界是 int or float

    需要注意的是,在解决两个函数之间的调用关系时,将被调用的函数**内联进原函数**。我将被调用的函数的所有变量名都加入相应的后缀,比如`foo`调用`bar`函数,那么`bar`中的变量`i_1`将被更名保存为`i_1#bar$1`,其中#是变量原名和后缀分割符,$是函数名和一个随机数的分割符,\$的作用是为了区分多次调用同一个函数的情况。

    3.3 构建E-SSA Constraint Graph

    代码:`\src\eSSAConstraintGraph.py`

    这一步用于解决条件的添加。诸如`if (i_2 < j_3)`这样的条件。在MyNode节点类型中,我设置了Conditions结构用于保存条件。Condition的数据结构如下:

     Class Description : Constraint Graph中的条件,附加在MyNode中

    class MyCondition:    def __init__(self, condition, index):        self.condition = condition        self.arg1 = re.sub("\(.*\)", "",condition.split()[0].strip())        self.arg2 = re.sub("\(.*\)", "",condition.split()[2].strip())        self.op = condition.split()[1].strip()        self.index = index

    其中,arg1和arg2分别表示条件的两个参数,op表示条件的比较运算符。在Future Resolution这一步会进行比较,进行范围的约束。

    以t7.ssa为例,得到的E-SSA Constraint Graph如下:

    call bar$1  in 2 : |Arguments: i_2,|Result: |Conditions: var i_2  in 2 : |Arguments: |Result: bar$1,i#bar$1,i_2#bar$1,|Conditions: var j_4  in 2 : |Arguments: _1#bar$1,|Result: bar$2,i#bar$2,i_2#bar$2,|Conditions: ret bar$1  in 2 : |Arguments: |Result: j_4,|Conditions: call bar$2  in 2 : |Arguments: j_4,|Result: |Conditions: var k_6  in 2 : |Arguments: _1#bar$2,|Result: _7,|Conditions: ret bar$2  in 2 : |Arguments: |Result: k_6,|Conditions: var _7  in 2 : |Arguments: k_6,|Result: |Conditions: var i_2#bar$1  in 3 : |Arguments: i_2,|Result: +,-,|Conditions: 0#bar$1 0|leaf 10  in 3 : |Arguments: |Result: +,|Conditions: op +  in 3 : |Arguments: i_2#bar$1,10,|Result: _3#bar$1,|Conditions: 0#bar$1 0|var _3#bar$1  in 3 : |Arguments: +,|Result: PHI,|Conditions: 0#bar$1 0|leaf 5  in 4 : |Arguments: |Result: -,|Conditions: op -  in 4 : |Arguments: 5,i_2#bar$1,|Result: _4#bar$1,|Conditions: 0#bar$1 1|var _4#bar$1  in 4 : |Arguments: -,|Result: PHI,|Conditions: 0#bar$1 1|op PHI  in 4 : |Arguments: _3#bar$1,_4#bar$1,|Result: _1#bar$1,|Conditions: 0#bar$1 1|var _1#bar$1  in 4 : |Arguments: PHI,|Result: j_4,|Conditions: 0#bar$1 1|leaf i#bar$1  in  : |Arguments: i_2,|Result: |Conditions: var i_2#bar$2  in 3 : |Arguments: j_4,|Result: +,-,|Conditions: 0#bar$2 0|leaf 10  in 3 : |Arguments: |Result: +,|Conditions: op +  in 3 : |Arguments: i_2#bar$2,10,|Result: _3#bar$2,|Conditions: 0#bar$2 0|var _3#bar$2  in 3 : |Arguments: +,|Result: PHI,|Conditions: 0#bar$2 0|leaf 5  in 4 : |Arguments: |Result: -,|Conditions: op -  in 4 : |Arguments: 5,i_2#bar$2,|Result: _4#bar$2,|Conditions: 0#bar$2 1|var _4#bar$2  in 4 : |Arguments: -,|Result: PHI,|Conditions: 0#bar$2 1|op PHI  in 4 : |Arguments: _3#bar$2,_4#bar$2,|Result: _1#bar$2,|Conditions: 0#bar$2 1|var _1#bar$2  in 4 : |Arguments: PHI,|Result: k_6,|Conditions: 0#bar$2 1|leaf i#bar$2  in  : |Arguments: j_4,|Result: |Conditions: Conditions:i_2(D) >= 0#bar$1 0#bar$1,i_2(D) >= 0#bar$2 0#bar$2,```Http://www.biyezuopin.vip

    3.4 三步法

    3.4.1 Widen

    代码:`\src\rangeAnalysis.py`

    Widen 步骤用于将 变量范围扩大。此步骤可以在O(n)阶段内完成。基于原理如下:可以形象的理解为:在进行&Phi;操作时,如果发现变量范围向上增加,就直接扩大到inf,如果发现变量范围向下减小,就直接减小到-inf。

    这样下来后,每一个MyNode的范围都会扩大到最大。

    3.4.2 Future Resolution &  Narrow

    代码:`\src\rangeAnalysis.py`

    在Widen步骤中,只能解决每一个变量内部之间的赋值行为,在Future Resolution步骤,可以对变量之间的运算、以及条件进行处理。

    我用了复杂的`ConditionHandle()`函数来解决条件变量的Constraint问题。我在每一个MyNode中添加了Conditions结构,用Condition约束来代替变量替换。这样可以大大减少变量替换带来的麻烦。

    在`ConditionHandle()`中,我将条件拆分成`arg1` `arg2`和`op`三部分,将他们组合成条件为真的范围,和条件为假的范围。并把相应的范围赋给相应的变量,以及检查此路径是否可以相通。

    以`t7.ssa`为例,三步法得到的所有变量的范围如下:

    Enter Range For i: -10 10bar$1 None None | Range:  Not Exists Not Existsi_2 int int | Range:  -10 10j_4 int int | Range:  0 20bar$1 None None | Range:  Not Exists Not Existsbar$2 None None | Range:  Not Exists Not Existsk_6 int int | Range:  5 30bar$2 None None | Range:  Not Exists Not Exists_7 int int | Range:  5 30i_2#bar$1 int int | Range:  -10 1010 None None | Range:  10 10+ int int | Range:  0 20_3#bar$1 int int | Range:  0 205 None None | Range:  5 5- int int | Range:  Not Exists Not Exists_4#bar$1 int int | Range:  15 -5PHI int int | Range:  0 20_1#bar$1 int int | Range:  0 20i#bar$1 None None | Range:  Not Exists Not Existsi_2#bar$2 int int | Range:  0 2010 None None | Range:  10 10+ int int | Range:  10 30_3#bar$2 int int | Range:  10 305 None None | Range:  5 5- int int | Range:  Not Exists Not Exists_4#bar$2 int int | Range:  5 -15PHI int int | Range:  5 30_1#bar$2 int int | Range:  5 30i#bar$2 None None | Range:  Not Exists Not Exists

    可以直接得到结果变量_7的范围为:_7 int int | Range: 5 30

    4. 实验结果

    # t1.SSAReference Range:[100, 100]Output Range: [100, +inf]# t2.SSAReference Range:[200, 300]Output Range: [200, +inf]# t3.SSAReference Range:[20, 50]Output Range: [20, +inf]# t4.SSAReference Range:[0, +inf]Output Range: [0, +inf]# t5.SSAReference Range:[210, 210]Output Range: [0, +inf]# t6.SSAReference Range:[-9, 10]Output Range: [-9, 10]# t7.SSAReference Range:[16, 30]Output Range: [5, 30]# t8.SSAReference Range:[-3.2192308, 5.94230769]Output Range: [-0.41923075526423315, 14.700000286102295]# t9.SSAReference Range:[9791, 9791]Output Range: [-10, +inf]# t10.SSAReference Range:[-10, 40]Output Range: [1, 1]

    到此,相信大家对“怎么用Python实现简单的C++程序范围”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: 怎么用Python实现简单的C++程序范围

    本文链接: https://lsjlt.com/news/323009.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 怎么用Python实现简单的C++程序范围
      本篇内容主要讲解“怎么用Python实现简单的C++程序范围”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现简单的C++程序范围”吧!1. 实验说明问题要求:针对静态单赋值(...
      99+
      2023-06-29
    • 如何利用Python实现简单C++程序范围分析
      目录1. 实验说明2. 项目使用3. 算法原理3.1 构建CFG3.2 构建Constraint Graph3.3 构建E-SSA Constraint Graph3.4 三步法3....
      99+
      2024-04-02
    • 怎么用C#实现简单的计算器小程序
      这篇文章主要介绍“怎么用C#实现简单的计算器小程序”,在日常操作中,相信很多人在怎么用C#实现简单的计算器小程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C#实现简单的计算器小程序”的疑惑有所帮助!...
      99+
      2023-06-29
    • 怎么用python实现简单的聊天小程序
      这篇文章主要讲解了“怎么用python实现简单的聊天小程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用python实现简单的聊天小程序”吧!概要这是一个使用python实现一个简单的...
      99+
      2023-06-20
    • C#实现简单订单管理程序
      本文实例为大家分享了C#实现订单管理程序的具体代码,供大家参考,具体内容如下 订单管理的控制台程序,能够实现添加订单、删除订单、修改订单、查询订单、序列化与反序列化订单功能。 主要的...
      99+
      2024-04-02
    • C++如何调用简单的python程序
      目录一、基本环境的搭建二、直接在C++里面调用执行python语句三、调用python脚本文件里面的定义函数调用不含参数的函数调用含多个参数的函数总结一、基本环境的搭建 首先,用vs...
      99+
      2023-02-17
      C++调用python程序 C++调用python C++调用python
    • C#实现简单的计算器小程序
      作为一个程序员,如何从浅入深的训练自己的技术,可以通过一些小程序来训练下面简单介绍一下如何制作一个简单的计算器小程序 如下为制作之后的小程序截图 代码段 其中计算用了dataTab...
      99+
      2024-04-02
    • python实现简单的聊天小程序
      概要 这是一个使用python实现一个简单的聊天室的功能,里面包含群聊,私聊两种聊天方式.实现的方式是使用套接字编程的一个使用TCP协议 c/s结构的聊天室 实现思路 x01 服务端的建立 首先,在服务端,使用soc...
      99+
      2022-06-02
      python 聊天 小程序
    • Python如何实现简单的GUI程序
      这篇文章主要介绍Python如何实现简单的GUI程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、记事本源码#python简易记事本from tkinter import *from...
      99+
      2023-06-29
    • C#如何实现简单订单管理程序
      这篇文章主要介绍“C#如何实现简单订单管理程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现简单订单管理程序”文章能帮助大家解决问题。订单管理的控制台程序,能够实现添加订单、删除订单、修...
      99+
      2023-06-30
    • Python opencv怎么实现高动态范围成像
      这篇“Python opencv怎么实现高动态范围成像”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python openc...
      99+
      2023-07-02
    • 用Python实现一个简单的抽奖小程序
      目录写在前面 实现结果 1 数据拉取2 数据清洗、去重3 中奖数据抽取python 相关知识点总结写在前面  因为粉丝福利,所以想自己写一个抽...
      99+
      2023-05-12
      python抽奖系统 python随机抽奖 python抽奖游戏
    • Python实现简单购物车小程序
      本文实例为大家分享了Python实现简单购物车小程序的具体代码,供大家参考,具体内容如下 要求 代码 # --*--coding:utf-8--*-- # Author: 村雨 ...
      99+
      2024-04-02
    • C++怎么实现一个简单的线程池
      本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容...
      99+
      2023-06-30
    • python怎么使用SimpleXMLRPCServer实现简单的rpc过程
      这篇文章主要介绍了python怎么使用SimpleXMLRPCServer实现简单的rpc过程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python怎么使用SimpleXMLRPCServer实现简单的rp...
      99+
      2023-07-02
    • Python如何实现的简单购物车程序
      购物车程序需求: 用户输入购物预算 展示商品列表 用户购买商品,每次购买后提示用户购买信息和剩余预算 购物完成后打印购物花费和购物清单,并将商品从原列表移除 实现代码如下: #...
      99+
      2022-06-02
      python 购物车 python 购物车程序
    • Python实现一个简单的验证码程序
        老师讲完random函数,自己写的,虽然和老师示例的不那么美观,智能,但是也自己想出来的,所以记录一下,代码就需要自己不断的自己练习,实战,才能提高啊!不然就像我们这些大部分靠自学的人,何时能学会。还有...
      99+
      2022-06-04
      验证码 简单 程序
    • 如何进行Python Helloworld程序的简单实现
      本篇文章为大家展示了如何进行Python Helloworld程序的简单实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对于一个学习过编程语言的朋友来说,肯定会对Helloworld这一词汇记忆深...
      99+
      2023-06-17
    • java NIO怎么实现简单聊天程序
      这篇文章主要为大家展示了“java NIO怎么实现简单聊天程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java NIO怎么实现简单聊天程序”这篇文章吧。具体内容如下服务...
      99+
      2023-06-21
    • C++基于范围的for循环怎么使用
      这篇文章主要讲解了“C++基于范围的for循环怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++基于范围的for循环怎么使用”吧!1、概念// 普通的for循环for(表...
      99+
      2023-06-30
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作