APP下载

基于抽象语法树的C克隆代码重构应用与研究

2018-05-14辛艳艳吴海涛

关键词:组件

辛艳艳 吴海涛

摘 要: 为了缩短软件工程生命周期,引入组件、复制的概念,利用抽象语法树(AST)将相同功能的代码设计为一个函数,保留充足的接口参数,利用过程调用开发软件程序,可以提高软件开发效率.

关键词: 抽象语法树(AST); 代码重构; 过程调用; 组件

中图分类号: TP 312 文献标志码: A 文章编号: 1000-5137(2018)04-0466-03

Abstract: In order to shorten the life cycle of software engineering,we usethe abstract syntax tree(AST) to design the same function of the code as a function according to the concept of components and reproduction.By keeping sufficient interface parameters,we can call the procedure to improve the efficiency of coding.

Key words:abstract syntax tree(AST); code refactoring; procedure calling; component

0 引 言

软件复用可以对高质量的源代码进行重复利用,以减少程序设计工作量,降低重复性劳动和误差.但是,复用增加了代码长度,造成软件系统架构臃肿,运行效率低,维护困难,于是研究人员提出了重构技术[1].软件重构是一种提高程序开发的有效手段,可以在维持软件功能正常运转的条件下改善软件系统的程序组织结构,可以有效清理代码.刘阳等[2]提出一种自动检测的代码重构技术,引入版本比较理念,可以自动提取可重复利用的代码,并将其设计为函数.刘伟等[3]分析了人工重构效率较低问题,提出一种以单例模式为导向的程序代码自动化重构算法,将源代码转换为抽象语法树(AST),创建一个实例类.胡志刚等[4]针对类型重构,引入了一种简单的中间语言,并设计了一个寄存器抽象语法树,采集程序基本类型和结构体类型的约束信息,提出一种有效判断二进制代码循环结构和变量的方法,高效分析重构数据类型.卢红敏[5]提出一种重构语义分析方法,引入后置条件作为重构后程序语义的分析条件,能检测出代码异常的行为,利用不同重构之间的关系及其关联语义特征,发现重构存在的错误和缺陷,提高重构准确度.张重峰等[6]提出了一种自动识别的重构对象技术,利用程序切片构造一种度量函数量化元素间的依赖程度,识别源代码位置和从属关系,提高重构识别的效率.

由于程序重构过程中实体的数据属性、控制属性较为相似,分类时没有充分考虑语句之间的控制依赖,本文作者提出一种基于抽象语法树的C克隆代码重构方法,将代码端提取为一个新的函数,有效改善程序结构,减少克隆代码导致的错误,提高重构准确度.

1 基于抽象语法树的C克隆代码重构算法设计

为了提高代码执行效率,降低算法复杂度,利用抽象语法树设计一个C克隆代码重构算法.算法执行流程如下:首先针对C克隆代码进行程序编译,其次对C克隆代码进行有效的词法、语法分析,构建一个抽象语法树,并且建立一个程序控制依赖图,以便准确地获取控制流信息、数据流信息.抽象语法树使用控制依赖图分析具体的程序代码,将功能重复、完全独立的C克隆代码片段提取出来,进行加工、整理和优化,构建一个传递参数的过程,最后,将过程调用的函数放回到C克隆代码的位置.

算法执行过程中,其关键步骤包括以下几个方面.

1) 确定变量类型.变量类型确定时需要遍历程序依赖图,寻找声明语句,然后通过抽象语法树寻找对应类型的语法树节点,该节点的最左孩子节点即为变量的类型.采用深度遍历、广度遍历相结合的模式,以便能够快速地获取变量类型,准确地进行函数过程重构.

2) 确定待提取过程的参数类型及个数.将克隆代码重塑为一个新的函数过程,需要确定其参数类型及个数.为了便于分析,将变量划分为声明类型的变量、使用类型的变量及定值类型的变量,分别将它们放置到3个集合中.

3) 解决过程的返回值问题.如果新函数过程没有返回值,则直接将代码提取为一个新的函數过程;如果存在一个或多个返回值,则将返回值以引用形式添加到新函数过程的参数列表.采用分析数据流的方法确定新函数过程是否存在返回值,先计算标记后续语句的变量信息,与标记语句的声明变量作对比,如果二者存在交集,则认为新的过程存在返回值,返回值即是交集的元素.

2 应用实例分析

为了验证所提算法的有效性,对一个开源软件中的C克隆代码进行实验,并且使用工具CPBugdetector检测源代码.将所提算法的有效性与重构语义分析算法[5]及基于C克隆代码重构算法进行对比,算法执行结果如表1所示.

由表1可知,所提算法精确度较高,尤其是在SDL-1.2.14程序中的克隆代码提取时,所提算法的精确度比重构语义分析算法的提高35个百分点,比C克隆代码重构算法的提高45个百分点.

3 结束语

提出了基于抽象语法树重构算法,该算法可以重构大部分的克隆代码,增加了克隆代码的标识位,将相关的变量信息保存在程序关联值中,关联变量的定制和返回值,增强信息交互性.但是在原子操作代码进行处理时还存在一些不足,主要原因是原子操作语句之间缺乏保护措施.因此,未来可以对这些操作进行改进,比如引入多台机制、切片度量等识别重构代码,提高算法的准确度.

参考文献:

[1] 马金鑫,李舟军,忽朝俭,等.一种重构二进制代码中类型抽象的方法 [J].计算机研究与发展,2013,50(11):2418-2428.

Ma J X,Li Z J,Hu C J,et al.A reconstruction method of type abstraction in binary code [J].Journal of Computer Research and Development,2013,50(11):2418-2428.

[2] 刘阳,刘秋荣,劉辉.函数抽取重构的自动检测方法 [J].计算机科学,2015,42(12):105-107.

Liu Y,Liu Q R,Liu H.Automated detection of extract method refactorings[J].Computer Science,2015,42(12):105-107.

[3] 刘伟,胡志刚,刘宏韬.单例模式导向的源代码自动重构研究 [J].小型微型计算机系统,2014(12):2664-2669.

Liu W,Hu Z G,Liu H T.Singleton pattern directed automatic refactoring for source code [J].Journal of Chinese Computer Systems,2014(12):2664-2669.

[4] 胡志刚,刘伟,刘宏韬.基于抽象语法树和多态机制的复杂条件语句自动重构研究 [J].电子科技大学学报,2014(5):736-741.

Hu Zhigang,Liu Wei,Liu Hongtao.Automatic refactoring for complex conditional statements based on abstract syntax tree and polymorphism [J].Journal of University of Electronic Science and Technology of China,2014(5):736-741.

[5] 卢红敏,郭晶,陈林,等.一种新的重构语义分析方法及其应用 [J].小型微型计算机系统,2012,33(11):2372-2374.

Lu H M,Guo J,Chen L,et al.Novel refactoring semantic analysis model and its application [J].Journal of Chinese Computer Systems,2012,33(11):2372-2374.

[6] 张重峰,李必信,孙小兵,等.基于切片度量的重构对象识别 [J].东南大学学报(自然科学版),2010,40(2):275-281.

Zhang C F,Li B X,Sun X B,et al.Slice-based metrics for identifying refactoring [J].Journal of southeast University (natural science edition),2010,40(2):275-281.

[7] Moret J M,Duval B P,Le H B,et al.Tokamak equilibrium reconstruction code LIUQE and its real time implementation [J].Fusion Engineering & Design,2015,91:1-15.

[8] Lazar F M,Banias O.Clone detection algorithm based on the Abstract Syntax Tree approach [C].International Symposium on Applied Computational Intelligence and Informatics,Timisoara:IEEE,2014.

(责任编辑:包震宇)

猜你喜欢

组件
无人机智能巡检在光伏电站组件诊断中的应用
一种嵌入式软件组件更新方法的研究与实现
新型碎边剪刀盘组件
U盾外壳组件注塑模具设计
跨平台APEX接口组件的设计与实现
T/R组件移相置位时间测试方法及实现
桥梁组件搭配分析
风起新一代光伏组件膜层:SSG纳米自清洁膜层
AGV在组件生产线中的应用方式
16%——Manz再度刷新CIGS光伏组件转换效率世界纪录