一种面向结构化并发的软件自动重构方法
未命名
09-18
阅读:78
评论:0

1.本发明涉及一种面向结构化并发的软件自动重构方法,属于计算机软件维护和演化领域。
背景技术:
2.随着多核处理器的普及和不断发展,并发编程将会被越来越多的普通程序使用,然而传统的并发编程存在以下问题:
3.复杂性管理:并发编程往往导致复杂性的增加,当多个任务同时执行时,它们之间的交互和同步会变得复杂。
4.错误处理:并发程序中的错误可能很难追踪和调试。当多个任务同时执行时,错误可能会在不同的执行路径中出现,使得问题的根源难以确定。
5.可读性和可维护性:并发程序通常很难理解和修改;多个任务之间的交互和同步逻辑往往隐含在代码中,使得代码难以阅读和维护。
6.结构化并发是一种多线程编程的范式,通过引入结构化的概念来简化并发编程。结构化并发的核心概念是,通过控制流构造来封装执行的并发线程(这里包括内核和用户域线程和进程),这些构造具有清晰的入口和出口点,并确保所有生成的线程在退出之前都已完成。
7.软件自动重构是不需要程序开发人员手动操作的情况下,自动的将程序中的某一结构转换为另一种结构,程序的外部语义没有变化。软件重构在早期主要用于提升软件的可维护性,近几年,将软件重构和并行编程结合除了用于提升软件的可维护性外,还用于对软件内部的并发结构进行转换,提升并行程序的性能。目前面向结构化并发的重构方法主要对于程序中某些场景进行优化,并将这些场景转换成结构化并发来提高程序的性能。
技术实现要素:
8.本发明所要解决的技术问题是提供一种提升代码的可阅读性和扩展性的面向结构化并发的软件自动重构方法。
9.本发明采用如下技术方案:
10.本发明面向结构化并发的软件自动重构方法,采用如下步骤:
11.步骤一.在重构之前进行前置条件检查,分析是否满足基本重构的条件,并且进行重构场景划分,将需要重构的代码分为:串行重构场景、多任务并行重构场景和forkjoin重构场景;
12.步骤二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;
13.步骤三.在源程序抽象语法树上对这些重构场景进行重构。
14.本发明步骤一中的前置条件检查具体为:
15.先将源程序转换成抽象语法树ast,并且通过抽象语法树ast中的访问者模式查找
是否有相应的结构,最后对需要重构的代码进行划分。
16.本发明对需要重构的代码划分具体采用如下步骤:
17.步骤101.在抽象语法树ast上如果查到有连续的两个methodinvoke语句,且都有返回值,并且后续有同时使用这些返回值的方法,则记为串行重构场景;
18.步骤102.如果有使用executors创建线程池的语句,并且后续有使用该线程池连续提交两个以上任务,这些任务都有返回值,并且最后有同时使用这些返回值的方法,则记为多任务并行重构场景;
19.步骤103.如果有继承recursivetask的类,且重写了compute方法,且有与之对应的forkjoinpool任务提交,则记为forkjoin重构场景。
20.本发明步骤二中的数据流分析和控制流分析是作为后续变量范围分析、方法依赖分析和线程依赖分析的基础,之后对串行重构场景采取变量范围分析和方法依赖分析,对并行重构场景采取变量范围分析和线程依赖分析。
21.本发明步骤三中在抽象语法树上完成重构转换,具体方法为:生成程序源代码的抽象语法树,在抽象语法树上查找目标结构,获取该结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览。
22.本发明所述变量范围分析具体为:通过控制流分析和静态分析工具获取获取需要重构的代码段,并获取此段代码中所有的变量,通过静态分析工具soot创建表示该代码段范围的对象,并通过数据流、控制流判断所有变量是否能够逃离该代码段。
23.本发明所述方法依赖分析具体为:参数为两个待分析的方法,先通过静态分析工具中的doesinvoke方法判断两个方法之间是否存在直接调用关系;接着获取两个方法的参数列表,判断是否存在交集;再获取前一个方法的返回值信息,判断是否是后一个方法的入参;最后获取两个方法中使用的所有的静态变量,观察是否存在交集。
24.本发明所述线程依赖分析具体为:先通过数据流分析和控制流分析判断线程之间是否存在调用情况;再分别获取两个线程中共享数据、互斥锁、条件变量和信号量的使用情况,判断一个线程在执行之前需要等待另一个线程完成某个操作或者释放资源。
25.本发明积极效果如下:本发明通过前置条件和程序分析可以精准的识别程序中需要重构的代码,支持由三种场景到结构化并发的自动重构转换;通过对抽象语法树ast结构的改变完成对源程序的修改,最后用户通过确认和拒绝完成此次重构。重构后的代码的有更加明确的结构和约束,因此代码的复杂性更低;错误处理机制更加合理,因此开发人员更容易捕获和处理错误;引入了明确的控制流和组织结构,因此代码的扩展性更强;本发明可以避免程序员手动重构引入的错误,节省时间。
附图说明
26.附图1为本发明框架结构示意图;
27.附图2为本发明程序分析结构示意图;
28.附图3为本发明变量范围分析算法图;
29.附图4为本发明方法依赖分析算法图;
30.附图5为本发明线程依赖分析算法图;
31.附图6为本发明重构转换结构示意图。
具体实施方式
32.本发明一种面向结构化并发的软件自动重构方法,采用如下步骤:
33.步骤一.在重构之前进行前置条件检查,分析是否满足基本重构的条件,并且进行重构场景划分,将需要重构的代码分为:串行重构场景、多任务并行重构场景和forkjoin重构场景;
34.前置条件检查具体为:将源程序转换成抽象语法树ast,并且通过抽象语法树ast中的访问者模式查找是否有相应的结构,最后将需要重构的代码进行划分;
35.对需要重构的代码划分具体采用如下步骤:
36.步骤101.在抽象语法树ast上如果查到有连续的两个methodinvoke语句,且都有返回值,并且后续有同时使用这些返回值的方法,则记为串行重构场景;
37.步骤102.如果有使用executors创建线程池的语句,并且后续有使用该线程池连续提交两个以上任务,这些任务都有返回值,并且最后有同时使用这些返回值的方法,则记为多任务并行重构场景;
38.步骤103.如果有继承recursivetask的类,且重写了compute方法,且有与之对应的forkjoinpool任务提交,则记为forkjoin重构场景;
39.步骤二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;数据流分析和控制流分析是作为后续变量范围分析、方法依赖分析和线程依赖分析的基础;之后对串行重构场景采取变量范围分析和方法依赖分析,对并行重构场景采取变量范围分析和线程依赖分析;
40.步骤三.在源程序抽象语法树上对这些重构场景进行重构;具体方法为:生成程序源代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览;
41.在附图1中,使用源程序作为输入,在重构之前先要进行前置条件检查,判断是否满足重构基本条件,并且筛选出需要重构的代码,由于要进行程序分析,所以先将源程序转换成适合于程序分析的中间表示形式,程序分析主要采用数据流分析、控制流分析、变量范围分析、方法依赖分析、线程依赖分析,分析由前置条件检查的结果,得到最终的重构场景;最后对相应的重构场景进行重构操作。
42.在附图2中,先对程序进行数据流分析,控制流分析,如果是串行重构场景,则需要进行方法依赖分析和变量范围分析;如果是并行重构场景,则需要进行线程依赖分析和变量范围分析。
43.本发明所述变量范围分析具体为:通过控制流分析和静态分析工具获取获取需要重构的代码段,并获取此段代码中所有的变量,通过静态分析工具soot创建表示该代码段范围的对象,并通过数据流、控制流判断所有变量是否能够逃离该代码段。附图3为变量范围分析算法具体过程,该算法以一个方法作为分析对象,getstatements用于获取该方法中的所有的语句,返回结果存储在集合statements中(第3行),初始化要分析的变量集合,初始化返回的标志位(第4-6行);根据传入的start为起点,end为终点,遍历statements,如果其中的statement中存在变量,则加入到要分析的变量集合中(第7-10行),方法setscope通过start和end,创建一个从start到end的scope对象(第11-12行);遍历要分析的变量集合,
通过scope中hasescape方法分析每一个变量是否在超出该scope以外使用,如果有,则修改方法返回标志位为true(第13-16行),最后方法返回标志位。
44.本发明所述方法依赖分析具体为:参数为两个待分析的方法,先通过静态分析工具中的doesinvoke方法判断两个方法之间是否存在直接调用关系;接着获取两个方法的参数列表,判断是否存在交集;再获取前一个方法的返回值信息,判断是否是后一个方法的入参;最后获取两个方法中使用的所有的静态变量,观察是否存在交集。附图4为方法依赖分析算法,用于判断两个待分析的方法之间是否存在依赖关系,主要从以下几个方面来进行,分别为两个待分析的方法之间的调用关系,参数依赖,返回值依赖,共享数据依赖。1.先判断两个待分析的方法之间是否存在调用关系(第3-6行);2.先分别获取两个待分析的方法的实参集合(第8-9行),判断参数集合是否存在交集(第11-12行);3.判断两个待分析的方法间返回值依赖情况,先获取两个待分析的方法各自的返回值(第14-15行),再判断该返回值是否是另一个方法的入参(第16-23行);4.最后判断两个待分析的方法中对于共享数据的依赖情况,先分别获取到每一个方法中使用到的静态变量(第25-26行),再判断两个静态变量集合是否存在交集(第29-31行)。
45.本发明所述线程依赖分析具体为:先通过数据流分析和控制流分析判断线程之间是否存在调用情况;再分别获取两个线程中共享数据、互斥锁、条件变量和信号量的使用情况,判断一个线程在执行之前需要等待另一个线程完成某个操作或者释放资源。附图5为线程依赖分析算法过程,首先判断两个线程之间是否存在相互调用的情况,如果存在就返回true(第2-6行);接着分别获取两个线程任务中所有的锁,再通过锁获取各自的共享变量集合,判断两个集合中是否存在交集,如果存在就返回true(第7-15行);再获取两个线程中的条件变量和信号量集合,判断是否存在交集,如果存在就返回true(第16-25行);最后分别获取t1和t2线程中对应任务的返回值,判断是否在另一个线程任务中使用,如果有返回true,如果以上都没有则返回false。
46.图6为重构转换的示意图,重构前的程序首先生成抽象语法树,然后查找目标代码在抽象语法树上的位置,找到后对目标代码进行替换,改变后的代码保存在change对象中,用于生成预览,用户预览结果并根据结果决定是否对源程序进行实质改变。
47.本发明通过前置条件和程序分析可以精准的识别程序中需要重构的代码,支持由三种场景到结构化并发的自动重构转换;通过对抽象语法树ast结构的改变完成对源程序的修改,最后用户通过确认和拒绝完成此次重构。重构后的代码的有更加明确的结构和约束,因此代码的复杂性更低;错误处理机制更加合理,因此开发人员更容易捕获和处理错误;引入了明确的控制流和组织结构;因此代码的扩展性更强;本发明可以避免程序员手动重构引入的错误,节省时间。
48.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围。
技术特征:
1.一种面向结构化并发的软件自动重构方法,其特征在于,采用如下步骤:步骤一.在重构之前进行前置条件检查,分析是否满足基本重构的条件,并且进行重构场景划分,将需要重构的代码分为:串行重构场景、多任务并行重构场景和forkjoin重构场景;步骤二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;步骤三.在源程序抽象语法树上对这些重构场景进行重构。2.根据权利要求1所述的一种面向结构化并发的软件自动重构方法,其特征在于,步骤一中的前置条件检查具体为:先将源程序转换成抽象语法树ast,并且通过抽象语法树ast中的访问者模式查找是否有相应的结构,最后对需要重构的代码进行划分。3.根据权利要求2所述的一种面向结构化并发的软件自动重构方法,其特征在于,对需要重构的代码划分具体采用如下步骤:步骤101.在抽象语法树ast上如果查到有连续的两个methodinvoke语句,且都有返回值,并且后续有同时使用这些返回值的方法,则记为串行重构场景;步骤102.如果有使用executors创建线程池的语句,并且后续有使用该线程池连续提交两个以上任务,这些任务都有返回值,并且最后有同时使用这些返回值的方法,则记为多任务并行重构场景;步骤103.如果有继承recursivetask的类,且重写了compute方法,且有与之对应的forkjoinpool任务提交,则记为forkjoin重构场景。4.根据权利要求1所述的一种面向结构化并发的软件自动重构方法,其特征在于,步骤二中的数据流分析和控制流分析是作为后续变量范围分析、方法依赖分析和线程依赖分析的基础,之后对串行重构场景采取变量范围分析和方法依赖分析,对并行重构场景采取变量范围分析和线程依赖分析。5.根据权利要求1所述的一种面向结构化并发的软件自动重构方法,其特征在于,步骤三中在抽象语法树上完成重构转换,具体方法为:生成程序源代码的抽象语法树,在抽象语法树上查找目标结构,获取该目标结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览。6.根据权利要求4所述的一种面向结构化并发的软件自动重构方法,其特征在于,所述变量范围分析具体为:通过控制流分析和静态分析工具获取需要重构的代码段,并获取此段代码中所有的变量,通过静态分析工具soot创建表示该代码段范围的对象,并通过数据流、控制流判断所有变量是否能够逃离该代码段。7.根据权利要求4所述的一种面向结构化并发的软件自动重构方法,其特征在于,所述方法依赖分析具体为:参数为两个待分析的方法,先通过静态分析工具中的doesinvoke方法判断两个方法之间是否存在直接调用关系;接着获取两个方法的参数列表,判断是否存在交集;再获取前一个方法的返回值信息,判断是否是后一个方法的入参;最后获取两个方法中使用的所有的静态变量,观察是否存在交集。8.根据权利要求4所述的一种面向结构化并发的软件自动重构方法,其特征在于,所述线程依赖分析具体为:先通过数据流分析和控制流分析判断线程之间是否存在调用情况;
再分别获取两个线程中共享数据、互斥锁、条件变量和信号量的使用情况,判断一个线程在执行之前需要等待另一个线程完成某个操作或者释放资源。
技术总结
本发明涉及一种面向结构化并发的软件自动重构方法,采用如下步骤:一.在重构之前进行前置条件检查,二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;三.在源程序抽象语法树上对这些重构场景进行重构;本发明可以精准的识别程序中需要重构的代码,支持由三种场景到结构化并发的自动重构转换,可以避免程序员手动重构引入的错误,节省时间;重构后的代码的有更加明确的结构和约束,因此代码的复杂性更低;错误处理机制更加合理,因此开发人员更容易捕获和处理错误;引入了明确的控制流和组织结构,因此代码的扩展性更强。因此代码的扩展性更强。因此代码的扩展性更强。
技术研发人员:张杨 申高洁
受保护的技术使用者:河北科技大学
技术研发日:2023.07.25
技术公布日:2023/9/16
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:一种手机主板维修检测仪的夹持机构的制作方法 下一篇:一种家禽保育箱的制作方法