一种基于抽象语法树节点变更抽取的Python代码变更提示方法

文档序号:8942874阅读:383来源:国知局
一种基于抽象语法树节点变更抽取的Python代码变更提示方法
【技术领域】
[0001] 本发明属于计算机技术领域,尤其是软件演化分析领域。本发明提供了一种面向 Python语言的、基于程序抽象语法树节点变更抽取的代码变更提示方法,用于在Python软 件演化过程中为程序变更提供辅助信息。
【背景技术】
[0002] 软件在其生命周期中一直在发生演化,从错误修正到增加功能等,对软件演化进 行分析可以揭示软件发展的基本规律,对软件生命周期的管理提供指导性意见,以达到提 高软件质量、开发可靠性软件的目的。而软件演化分析中的一个关键问题,就是识别程序不 同版本间的变更,挖掘演化信息中的关联代码和关联变更类型,为软件演化过程提供变更 辅助信息。
[0003] 目前,软件演化信息主要源于以文件或者项目为基本单元来记录软件变化历史的 软件配置管理系统、错误报告系统等CASE工具,这些工具大多使用代码行的增加或删除来 描述某一个变化,而与类或函数等特定的源代码实体无关。因此,当前对程序演化分析的研 究主要集中在代码行数、模块数量、发行包大小、宏定义数量等方面。这些数据能够在宏观 上揭示程序的演化过程,通过对它们的研究,已经得到了包括持续演化、复杂度增加、自我 规范等八条基本原则。但由于这些版本信息系统并不存储结构化的变更信息,因而对软件 演化的分析无法深入到函数实体或语句实体级别。例如,无法识别"if语句的else分支中 插入了一个函数调用"这类变化,而这类变更信息对于软件演化分析而言恰恰十分重要。
[0004] 软件演化信息包含了软件变更历史等信息,一直是学术界的研究热点。Gall等人 使用版本发行信息来识别模块间的耦合关系,并通过分析这种耦合关系发现可能的软件可 维护功能点,但这种方法以模块为单位,分析粒度较粗;为了发现细粒度代码结构间的耦合 关系,Thomas Zi_ermann等人对代码文件进行语法分析,将语法实体与代码行相关联,该 方法能在一定程度上预测程序可能发生变更的位置,但其没有对变更进行分类,无法对可 能的变更类型提出建议;而在程序变更类型分类方面,Beat Fluri等人提出了一种源代码 变化分类方法,该方法主要针对Java语言,从类和方法两个角度对变更进行分类。Python 虽然也是一种面向对象的程序设计语言,但其与Java仍有一定区别,如类本身也是对象 等,故Beat Fluri等人针对Java提出的源代码变化分类学,不完全适用于Python。Python 语言第一个公开发行版本发行于1991年,诞生时间较短,目前学术界针对Python语言的研 究较少,但Python自诞生以来,已经成为最受欢迎的程序设计语言之一,故对Python程序 变更信息进行分析,具有一定价值。
[0005] 总的来说,传统的软件变更历史研究方法存在如下缺点:1、仅仅依赖CVS等版本 控制系统提供的变更信息,变更只与代码行的增删相关,而与类或函数等代码实体无关;2、 分析粒度较粗,鲜有方法能分析函数级别的变更,缺乏深入到源代码语句级的分析方法;3、 没有对变更进行分类,仅能提示变更可能发生的位置,无法提示可能的变更类型;4、大多数 方法的研究对象为Java/C++等,针对Python语言的研究成果较少。

【发明内容】

[0006] 本发明提供了一种面向Python语言的、基于程序抽象语法树节点变更抽取的代 码变更提示方法,该方法通过匹配源程序的抽象语法树表示,结合基本树编辑操作(插入、 删除和更新),确定程序中每一处的变更类型,使用成熟的数据挖掘技术从变更信息中挖掘 关联规则,根据关联规则预测程序中可能出现变更的位置和可能的变更类型,从而对程序 变更提出建议。本发明旨在解决目前存在的缺乏针对Python语言的软件演化分析、无法提 示可能的代码变更类型等问题,进而指导软件生命周期的管理,提高软件演化的可控性,从 而能更好地控制软件产品的质量。
[0007] 为达成上述目的,本发明提出一种基于抽象语法树节点变更抽取的Python代码 变更提示方法。方法包括下列步骤:
[0008] 1)获取同一软件不同版本程序的源代码;
[0009] 2)生成两个版本的源程序代码对应的抽象语法树;
[0010] 3)匹配抽象语法树获取变更节点,结合变更节点上下文信息标记节点变更类型;
[0011] 4)将变更元组聚集为事务,构造训练集;
[0012] 5)利用FP-growth算法,挖掘变更元组中的频繁项集,生成关联规则;
[0013] 6)根据挖掘出的关联代码和关联变更类型,提示开发人员程序中可能出现变更的 位置和可能的变更类型。
[0014] 进一步,其中上述步骤1)的具体步骤如下:
[0015] 步骤1)_1:起始状态;
[0016] 步骤1)_2 :根据文件名和版本号,从软件版本控制系统中获取同一软件的两个不 同版本的源程序;
[0017] 步骤1)-3 :软件不同版本源程序采集完毕。
[0018] 进一步,其中上述步骤2)的具体步骤如下:
[0019] 步骤2)-1:起始状态;
[0020] 步骤2)-2 :对同一软件的两个不同版本的源程序进行词法分析和语法分析,利用 Python标准库中的ast模块生成两个版本程序对应的抽象语法树;
[0021] 步骤2) -3 :根据Python标准库中定义的抽象语法,为抽象语法树中的每个节点设 置label和value,并设置节点标识符。label表示节点的类型,如函数调用;value用于表 示节点的内容,中间节点的value依赖于其label,如if控制语句的value为其条件表达 式,叶子节点的value即语句的文本表示,如函数调用的具体内容等;节点标识符id用于唯 一标识节点;
[0022] 步骤2)-4 :两个不同版本程序对应的抽象语法树生成完毕。
[0023] 进一步,其中上述步骤3)的具体步骤如下:
[0024] 步骤3)-1:起始状态;
[0025] 步骤3)_2 :后序遍历抽象语法树,对叶子节点及中间节点采用不同的算法进行匹 配;
[0026] 步骤3)-3 :对于发生变更的节点,获取该节点自身及其父节点的label ;
[0027] 步骤3)-4 :分析对变更节点执行的基本树编辑操作,标记节点的变更类型;
[0028] 步骤3)-5 :对于每一个发生变更的节点,用元组δ =(节点标识符,变更类型)记 录其变更情况;
[0029] 步骤3) -6 :变更节点信息收集完毕。
[0030] 进一步,其中上述步骤4)的具体步骤如下:
[0031] 步骤4)-1:起始状态;
[0032] 步骤4)_2 :元组δ =(节点标识符,变更类型)记录了程序中的变更信息,将已 获得的记录两个版本间变更信息的元组序列C= {δρ δ 2,…,δ J聚集为一个事务Δ ; [0033] 步骤4)_3 :获取同一 Python程序各个版本间的变更,得到事务集合T ={ Δ i, A2,…,Δη},保存在数据库中;
[0034] 步骤4) -4 :扫描数据库,一次变更产生的事务作为一条训练数据,构造训练集a ;
[0035] 步骤4)-5 :重复上述步骤,获取多个Python程序的训练集{a^a;;,…七},对于a; 中的每条训练数据,抽
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1