一种面向结构化并发的软件自动重构方法技术

技术编号:38846174 阅读:22 留言:0更新日期:2023-09-17 09:57
本发明专利技术涉及一种面向结构化并发的软件自动重构方法,采用如下步骤:一.在重构之前进行前置条件检查,二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;三.在源程序抽象语法树上对这些重构场景进行重构;本发明专利技术可以精准的识别程序中需要重构的代码,支持由三种场景到结构化并发的自动重构转换,可以避免程序员手动重构引入的错误,节省时间;重构后的代码的有更加明确的结构和约束,因此代码的复杂性更低;错误处理机制更加合理,因此开发人员更容易捕获和处理错误;引入了明确的控制流和组织结构,因此代码的扩展性更强。因此代码的扩展性更强。因此代码的扩展性更强。

【技术实现步骤摘要】
一种面向结构化并发的软件自动重构方法


[0001]本专利技术涉及一种面向结构化并发的软件自动重构方法,属于计算机软件维护和演化领域。

技术介绍

[0002]随着多核处理器的普及和不断发展,并发编程将会被越来越多的普通程序使用,然而传统的并发编程存在以下问题:
[0003]复杂性管理:并发编程往往导致复杂性的增加,当多个任务同时执行时,它们之间的交互和同步会变得复杂。
[0004]错误处理:并发程序中的错误可能很难追踪和调试。当多个任务同时执行时,错误可能会在不同的执行路径中出现,使得问题的根源难以确定。
[0005]可读性和可维护性:并发程序通常很难理解和修改;多个任务之间的交互和同步逻辑往往隐含在代码中,使得代码难以阅读和维护。
[0006]结构化并发是一种多线程编程的范式,通过引入结构化的概念来简化并发编程。结构化并发的核心概念是,通过控制流构造来封装执行的并发线程(这里包括内核和用户域线程和进程),这些构造具有清晰的入口和出口点,并确保所有生成的线程在退出之前都已完成。
[0007]软件自动重构是不需要程序开发人员手动操作的情况下,自动的将程序中的某一结构转换为另一种结构,程序的外部语义没有变化。软件重构在早期主要用于提升软件的可维护性,近几年,将软件重构和并行编程结合除了用于提升软件的可维护性外,还用于对软件内部的并发结构进行转换,提升并行程序的性能。目前面向结构化并发的重构方法主要对于程序中某些场景进行优化,并将这些场景转换成结构化并发来提高程序的性能。
专利
技术实现思路

[0008]本专利技术所要解决的技术问题是提供一种提升代码的可阅读性和扩展性的面向结构化并发的软件自动重构方法。
[0009]本专利技术采用如下技术方案:
[0010]本专利技术面向结构化并发的软件自动重构方法,采用如下步骤:
[0011]步骤一.在重构之前进行前置条件检查,分析是否满足基本重构的条件,并且进行重构场景划分,将需要重构的代码分为:串行重构场景、多任务并行重构场景和ForkJoin重构场景;
[0012]步骤二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;
[0013]步骤三.在源程序抽象语法树上对这些重构场景进行重构。
[0014]本专利技术步骤一中的前置条件检查具体为:
[0015]先将源程序转换成抽象语法树AST,并且通过抽象语法树AST中的访问者模式查找
是否有相应的结构,最后对需要重构的代码进行划分。
[0016]本专利技术对需要重构的代码划分具体采用如下步骤:
[0017]步骤101.在抽象语法树AST上如果查到有连续的两个methodInvoke语句,且都有返回值,并且后续有同时使用这些返回值的方法,则记为串行重构场景;
[0018]步骤102.如果有使用Executors创建线程池的语句,并且后续有使用该线程池连续提交两个以上任务,这些任务都有返回值,并且最后有同时使用这些返回值的方法,则记为多任务并行重构场景;
[0019]步骤103.如果有继承RecursiveTask的类,且重写了compute方法,且有与之对应的ForkJoinPool任务提交,则记为ForkJoin重构场景。
[0020]本专利技术步骤二中的数据流分析和控制流分析是作为后续变量范围分析、方法依赖分析和线程依赖分析的基础,之后对串行重构场景采取变量范围分析和方法依赖分析,对并行重构场景采取变量范围分析和线程依赖分析。
[0021]本专利技术步骤三中在抽象语法树上完成重构转换,具体方法为:生成程序源代码的抽象语法树,在抽象语法树上查找目标结构,获取该结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览。
[0022]本专利技术所述变量范围分析具体为:通过控制流分析和静态分析工具获取获取需要重构的代码段,并获取此段代码中所有的变量,通过静态分析工具soot创建表示该代码段范围的对象,并通过数据流、控制流判断所有变量是否能够逃离该代码段。
[0023]本专利技术所述方法依赖分析具体为:参数为两个待分析的方法,先通过静态分析工具中的doesInvoke方法判断两个方法之间是否存在直接调用关系;接着获取两个方法的参数列表,判断是否存在交集;再获取前一个方法的返回值信息,判断是否是后一个方法的入参;最后获取两个方法中使用的所有的静态变量,观察是否存在交集。
[0024]本专利技术所述线程依赖分析具体为:先通过数据流分析和控制流分析判断线程之间是否存在调用情况;再分别获取两个线程中共享数据、互斥锁、条件变量和信号量的使用情况,判断一个线程在执行之前需要等待另一个线程完成某个操作或者释放资源。
[0025]本专利技术积极效果如下:本专利技术通过前置条件和程序分析可以精准的识别程序中需要重构的代码,支持由三种场景到结构化并发的自动重构转换;通过对抽象语法树AST结构的改变完成对源程序的修改,最后用户通过确认和拒绝完成此次重构。重构后的代码的有更加明确的结构和约束,因此代码的复杂性更低;错误处理机制更加合理,因此开发人员更容易捕获和处理错误;引入了明确的控制流和组织结构,因此代码的扩展性更强;本专利技术可以避免程序员手动重构引入的错误,节省时间。
附图说明
[0026]附图1为本专利技术框架结构示意图;
[0027]附图2为本专利技术程序分析结构示意图;
[0028]附图3为本专利技术变量范围分析算法图;
[0029]附图4为本专利技术方法依赖分析算法图;
[0030]附图5为本专利技术线程依赖分析算法图;
[0031]附图6为本专利技术重构转换结构示意图。
具体实施方式
[0032]本专利技术一种面向结构化并发的软件自动重构方法,采用如下步骤:
[0033]步骤一.在重构之前进行前置条件检查,分析是否满足基本重构的条件,并且进行重构场景划分,将需要重构的代码分为:串行重构场景、多任务并行重构场景和ForkJoin重构场景;
[0034]前置条件检查具体为:将源程序转换成抽象语法树AST,并且通过抽象语法树AST中的访问者模式查找是否有相应的结构,最后将需要重构的代码进行划分;
[0035]对需要重构的代码划分具体采用如下步骤:
[0036]步骤101.在抽象语法树AST上如果查到有连续的两个methodInvoke语句,且都有返回值,并且后续有同时使用这些返回值的方法,则记为串行重构场景;
[0037]步骤102.如果有使用Executors创建线程池的语句,并且后续有使用该线程池连续提交两个以上任务,这些任务都有返回值,并且最后有同时使用这些返回值的方法,则记为多任务并行重构场景;
[0038]步骤103.如果有继承RecursiveTask的类,且重写了compute方法,且有与之对应的ForkJoinPool任务提交,则记为Fo本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种面向结构化并发的软件自动重构方法,其特征在于,采用如下步骤:步骤一.在重构之前进行前置条件检查,分析是否满足基本重构的条件,并且进行重构场景划分,将需要重构的代码分为:串行重构场景、多任务并行重构场景和ForkJoin重构场景;步骤二.采用数据流分析、控制流分析、变量范围分析、方法依赖分析和线程依赖分析,对于不同的重构场景进行分析;步骤三.在源程序抽象语法树上对这些重构场景进行重构。2.根据权利要求1所述的一种面向结构化并发的软件自动重构方法,其特征在于,步骤一中的前置条件检查具体为:先将源程序转换成抽象语法树AST,并且通过抽象语法树AST中的访问者模式查找是否有相应的结构,最后对需要重构的代码进行划分。3.根据权利要求2所述的一种面向结构化并发的软件自动重构方法,其特征在于,对需要重构的代码划分具体采用如下步骤:步骤101.在抽象语法树AST上如果查到有连续的两个methodInvoke语句,且都有返回值,并且后续有同时使用这些返回值的方法,则记为串行重构场景;步骤102.如果有使用Executors创建线程池的语句,并且后续有使用该线程池连续提交两个以上任务,这些任务都有返回值,并且最后有同时使用这些返回值的方法,则记为多任务并行重构场景;步骤103.如果有继承RecursiveTask的类,且重写了compute方法,且有与之对应的ForkJoinPool任务提交,则记为ForkJoin重构场景。4.根据权利要求1所述的一种面向结构化并发的软件自动重构方法,其特征在于,步骤二中的数据流分析和控制流分析是作为后续变量范围分析、方法依赖分析和线程依赖...

【专利技术属性】
技术研发人员:张杨申高洁
申请(专利权)人:河北科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1