一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于代码提交的软件知识图谱增量更新方法

2023-01-04 17:41:39 来源:中国专利 TAG:


1.本发明属于计算机软件技术领域,涉及一种基于代码提交(commit)的软件知识图谱增量更新方法。


背景技术:

2.软件知识图谱是一种辅助开发人员掌握领域知识、理解软件项目架构的有效途径。但随着软件项目代码的不断演化,软件项目代码理解和软件项目知识图谱构造面临着新的挑战。研究表明,那些因软件不断发展而产生的软件维护任务,占据了软件开发中大部分的开发成本。而在实际开发场景中,软件代码面临着大量且频繁的修改提交,静态构建的软件知识图谱难以保证时效性和一致性;而开发及测试人员也需要关注项目源代码的演化信息,如数据结构的增删、函数调用关系的修改等,从而保障代码架构的质量和可维护性。而软件开发过程中,代码演化信息通常由版本控制系统(如git)以代码提交(commit)为单元进行管理,使得开发人员难以快速获得代码变更的范围和内容,从而理解软件项目架构的变化。
3.现有针对知识图谱更新的工作主要集中在面向通用知识图谱的知识表示学习方法的研究,这类方法对数据的依赖性较高,在软件项目知识图谱这样面向特定领域的知识图谱中缺乏足够数据的支持,对很多领域特定的知识概念难以有效地学习;而在代码演化信息表示方面,软件知识图谱的相关工作大多以特定版本的代码为研究对象,对代码演化知识的抽取和利用的研究相对较少,针对多版本代码往往只是简单对各个版本的代码数据分别构建知识图谱,不同版本之间的独立性会在很大程度上阻碍使用者的查询操作,不便于代码演化信息的获取。
4.为了及时对已经构建好的软件知识图谱进行更新,并帮助开发者方便快捷地获取代码演化信息、理解软件项目架构,有必要发明一种软件知识图谱增量更新的方法。


技术实现要素:

5.针对现有技术中存在的问题,本发明的目的在于提供一种软件代码片段历史追溯的方法和机制,本发明通过基于git版本控制系统的代码提交数据的解析来获取代码演化知识,进而实现软件知识图谱的增量更新。
6.为了克服现有的软件知识图谱更新效率低下,同时缺少对代码演化知识进行显式表示的问题,本发明提供一种基于代码提交(commit)的软件知识图谱增量更新方法,并基于此实现了一个工具插件。通过本发明提供的方法和工具,能够基于软件源代码仓库的git版本控制系统的代码提交数据,抽取出更新文件的集合,通过对更新代码文件的解析获取对应软件知识图谱中的代码演化知识,并设计相应的知识图谱更新算法实现软件知识图谱的增量更新。
7.本发明解决其技术问题所采用的技术方案是:一种基于代码提交的软件知识图谱增量更新方法,其步骤包括:
1)根据目标软件项目现有的知识图谱,为该目标软件项目创建代码演化知识图谱元模型;所述代码演化知识图谱元模型包含代码提交实体(即commit实体)和代码实体,所述代码实体包括:代码文件、变量、函数、结构体及域成员;所述代码演化知识图谱元模型的关系类型包括所述commit实体与所述代码实体之间的增加关系、所述commit实体与所述代码实体之间的删除关系、所述commit实体与所述代码实体之间的修改关系、所述代码文件对所述变量的定义关系、所述代码文件对所述函数的定义关系、所述代码文件对结构体的定义关系、所述代码文件之间的引用关系、所述函数实体对其他函数或变量的调用关系、所述域成员与所述结构体之间的所属关系;版本控制系统将该目标软件项目的每一次commit作为一commit实体;2)对该目标软件项目的每一次commit数据进行解析,抽取当次commit修改的代码文件集合,并对该目标软件项目更新前后两个版本的代码文件分别进行解析,得到对应的两个语法树;然后遍历每一所述语法树,依据节点类型以及节点之间的父子关系,将每一所述语法树的信息记录在相应的集合当中,获得更新前后两个版本的代码文件对应的集合并对其进行差异分析,抽取出更新的代码元素集;3)根据更新的代码元素集和所述演化知识图谱元模型,对该目标软件项目当前的知识图谱进行更新,得到更新后的软件知识图谱:(1)对于新增代码实体,在所述知识图谱中创建相应类型的实体节点并设置其begin_timestamp属性值为当次commit的时间戳,将该代码实体挂载到所述知识图谱中并建立与其他实体的关系,并对所建关系的begin_timestamp属性值进行设置;begin_timestamp为开始时间属性;(2)对于删除代码实体,保留该代码实体在所述知识图谱中的相关内容,将该代码实体及相关关系的属性end_timestamp设置为当次commit的时间戳;(3)对于修改代码实体,则在所述知识图谱中对该代码实体被修改的属性信息进行更新;对于修改后该代码实体新增的与其他实体之间的关系,执行创建关系的操作,同时设置该关系的begin_timestamp属性为当次commit的时间戳;对于修改后该代码实体删除的与其他实体之间关系,设置该关系的end_timestamp属性为当次commit的时间戳。
8.进一步的,步骤2)中,抽取出更新的代码元素集的方法为:对commit数据进行解析,获取新增类型代码元素、删除类型代码元素和修改类型代码元素;21)对于新增类型代码元素:对更新后版本中新增类型代码元素所在的局部源代码进行静态分析,获取该新增类型代码元素对应到所述知识图谱中的实体属性及关联关系;22)对于删除类型代码元素:依据该删除类型代码元素所属代码文件在该目标软件项目中的绝对路径以及元素名称,将该删除类型代码元素匹配到所述知识图谱中的实体;23)对于修改类型代码元素:首先将被修改的代码元素匹配到知识图谱中的实体,然后对该代码元素所在的源代码进行静态分析,将解析结果与当前所述知识图谱进行差异分析,得到该代码元素对应到所述知识图谱中需要更新的实体属性及关联关系。
9.进一步的,步骤3)中,如果当次commit数据中存在待更新实体之间的依赖关系,即当次commit新增的元素包括函数a和函数b,同时函数a对函数b进行了调用,则更新所述知识图谱的方法为:31)查找所述知识图谱中与函数b匹配的实体,如果匹配失败,则判定函数b为新增
的实体;然后在虚拟节点集合中查询与函数b匹配的虚拟节点,若虚拟节点集合中存在与函数b匹配的虚拟节点b,则建立函数a所对应节点与虚拟节点b之间的关联关系,并设置该关联关系的begin_timestamp属性值;然后从虚拟节点集合中移除该虚拟节点b;32)若虚拟节点集合中不存在与函数b匹配的虚拟节点,则综合函数b所属文件名、名称和类型为函数b创建一虚拟节点b’,并将该虚拟节点添加到虚拟节点集合;然后建立函数a所对应节点与虚拟节点b’之间的关联关系,并设置该关联关系的begin_timestamp属性值。
10.进一步的,对该目标软件项目当前的知识图谱进行更新时,对于新增代码实体:在所述知识图谱中创建相应的实体,补充属性信息并将所创建实体的begin_timestamp属性值设置为当前commit的时间戳;建立该实体与其他实体之间的关系,并将所建立关系的begin_timestamp属性值设置为当前commit的时间戳;以及在当前commit实体与新创建的实体之间建立增加关系。
11.进一步的,对该目标软件项目当前的知识图谱进行更新时,对于删除代码实体:在所述知识图谱中匹配到待删除的代码实体,查询该代码实体入边及该入边关联的首实体,以及出边和该出边关联的尾实体,并对尾实体进行递归查询;然后将查询到的所有实体及关系的end_timestamp属性值设置为当前commit的时间戳,并创建当前commit实体与相关代码实体的删除关系。
12.进一步的,对该目标软件项目当前的知识图谱进行更新时,对于修改代码实体:如果修改操作只涉及实体属性的修改,则修改相关实体的属性值;如果修改操作涉及实体间新增关系,则创建对应首尾实体之间的关系并设置关系属性begin_timestamp;如果修改操作涉及实体删除,则将所删除实体的end_timestamp属性设置为commit时间戳,创建当前commit实体与更新实体之间的修改关系。
13.进一步的,利用eclipsecdt工具对更新前后两个版本的代码文件分别进行解析,得到对应的两所述语法树。
14.一种服务器,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行上述方法中各步骤的指令。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述方法的步骤。
16.本发明包括:1.软件代码演化知识图谱元模型的设计针对特定的软件项目,知识图谱需要界定该领域要获取的知识实体、关系的类型和属性,即定义知识图谱元模型,对知识图谱的基本概念和结构模式进行了定义和约束。本发明中的软件代码演化知识图谱元模型的设计主要从两方面考虑:一是c语言代码本身的语法结构依赖,如对头文件的引用,文件内定义的变量函数等、函数对变量以及其他函数的调用,
……
等;另一方面则是代码的演化信息,commit对代码文件的更新涉及到代码实体及实体之间关系的新增或删除,依据commit对代码实体执行的更新操作类型(增删改)建立这两类实体之间的关系,同时对于commit中包含的时间/版本信息进行标识与记录。最终建立的代码演化知识图谱元模型包含了6类实体,版本控制系统的每一次commit为一类实体,即
commit实体,commit自身的信息作为commit实体的属性,而所提交的数据则是具体修改的代码内容,通过建立commit实体与相关代码实体的关系来表示。commit实体的属性包括:当前commit的id、commit的提交日期(即时间戳)、commit修改文件的列表,而该commit所具体修改的代码内容,则通过建立该commit实体与相关代码实体之间的关联进行表示;其余5类实体是代码实体,包括:代码文件、变量、函数、结构体及域成员。该模型包含的关系类型有9种,commit实体与代码实体之间依据更新类型有:增加关系(add)、删除关系(delete)和修改关系(modify)三类关系;代码类型实体则包括:代码文件对变量、函数、结构体的定义(define),代码文件之间存在的引用关系(include),函数实体对其他函数以及变量的调用关系(invoke),域成员与结构体的所属关系(member_of)。
17.commit更新操作本质上对应到相关实体和关系的增加/删除,因此定义的模型对于每类代码实体,以及代码实体之间的关系,均添加两类属性类型:begin_timestamp、end_timestamp(初始值设为
ꢀ‑
1),以相应commit的提交时间作为时间戳,表示实体或关系创建和删除的时刻,通过这两个属性信息来表示一个代码实体或关系的生命周期。代码演化过程中的变更对应到图谱当中意味着实体或关系的新增或删除,以及实体属性的修改,通过添加这两类属性类型来描述图谱元素的演化信息。比如某一函数实体被删除时,该实体以及直接关联的define、invoke关系仍然保留,仅将其中的end_timestamp 属性值设为当前commit的时间戳来表示相关图谱元素的删除。任一代码实体或关系的end_timestamp属性值不是缺省值,则表示该实体或关系为历史版本中的信息,且根据这两个属性值可以得知它存在的时间跨度,以及相应commit的更新记录。
18.根据代码演化知识图谱元模型的定义,本发明对代码演化的更新操作在知识图谱当中的图结构表示进行说明。具体而言,(1)代码元素的新增:在图谱中创建相应的实体,补充属性信息,并建立该实体与其他实体之间的关系。这一过程中涉及到的所有新创建的实体和关系,对应的begin_timestamp属性值设置为当前commit的时间戳,并且在当前commit与新创建的实体之间建立add关系。
19.(2)代码元素的删除:匹配到待删除的代码实体,进而查询该实体入边及入边关联的首实体,以及出边和出边关联的尾实体,并对这类尾实体按照同样的处理递归查询。将查询到的所有实体及关系的end_timestamp属性值设置为当前commit的时间戳,并创建该commit实体与相关代码实体的delete关系。
20.(3)代码元素的修改:由于某些修改操作只涉及实体属性的修改,比如函数修饰符的改变,这类修改操作并不对应到实体之间的关系变更,因此针对这类更新,只修改相关实体的属性值。而对于修改操作涉及的实体间变更的关系,对于新增关系,创建对应首尾实体之间的关系并设置关系属性begin_timestamp;对于被删除关系,仅将其end_timestamp属性设置为commit时间戳即可。最后创建commit实体与被修改实体之间的modify关系。
21.2.基于代码提交的代码演化知识抽取利用jgit工具对commit数据进行解析,抽取出当次commit修改的代码文件集合,并获取代码文件更新前后的具体内容,进而利用eclipse cdt工具对更新前后两个版本的代码文件分别进行解析,得到对应的两个抽象语法树,然后遍历该语法树,依据节点类型以及节点之间的父子关系,即该代码文件包含的头文件、变量、结构体及域成员,以及函数及
函数对其他函数和变量的调用,将语法树的信息记录在相应的集合当中,将获得的两个版本代码文件对应的集合进行差异分析,最终抽取出更新代码元素集。
22.通过对commit数据的解析实现了更新代码元素的定位,而为了获取这些更新元素在图谱当中具体的更新内容,依据元素的更新类型分别设计相应的处理规则:(1)新增类型代码元素:利用eclipse cdt工具,对更新后版本的源代码进行局部的静态分析(只解析更新元素所处的代码源文件),获取该元素对应到目标图谱中的实体属性及关联关系等信息;(2)删除类型代码元素:依据该元素所属代码文件在项目当中的绝对路径以及元素名称,将被删除代码元素匹配到现有图谱当中的实体;(3)修改类型代码元素:首先同(2)中处理,将元素匹配到图谱当中的实体,然后按照(1)中的局部静态分析方法解析更新后的代码文件,将解析结果与现有图谱内容进行差异分析(属性差异、关联实体差异)从而得到这类更新类型的代码元素对应图谱实体的待更新属性与关系。
23.3.基于虚拟节点的知识图谱更新算法在获取代码演化知识的基础上,对现有知识图谱进行更新。依据实体更新类型执行以下操作:(1)对于新增类型代码实体,在图谱中创建相应类型的实体节点并设置属性begin_timestamp为此次commit的时间戳,将该实体挂载到图谱当中建立与其他实体的关系,并对关系的begin_timestamp属性值进行设置;(2)对于删除类型实体而言,对该实体在图谱当中的相关内容仍然保留,只是将实体及相关关系的属性end_timestamp设置为当次commit时间戳,表示实体及关系的删除;(3)修改类型实体对应相关实体属性的修改和实体之间关系的新增或删除,通过设置begin_timestamp和end_timestamp属性值来表示代码演化信息。
24.在图谱更新的过程中,考虑到待更新实体之间可能存在着依赖关系,如在一次commit更新中,函数a新增了对函数b的调用关系,而函数b属于这次更新中新增的实体,这样的话在更新函数a之前必须要对函数b首先进行更新,否则在查找函数b实体时就会由于该实体还未创建而出现匹配失败的情况,这就造成实体更新之间的依赖。针对这一类情形,本发明提出了创建虚拟节点的方法,在实体匹配失败时临时创建的用于建立实体间关系的实体节点,其属性信息在后续的更新过程中进行补充。具体的操作过程如下:(1)针对匹配失败的实体,通过hash(filename, elementname, elementtype)的哈希方法,即综合代码元素所属文件名、元素名称和元素类型的信息,创建相应的虚拟节点,并将该节点添加到虚拟节点集合予以维护;(2)在查询匹配实体时,如果未能匹配到普通的实体节点,则查询虚拟节点的集合:若存在,则直接建立实体节点之间的关联,并设置该关系的begin_timestamp属性,表示关系的创建时间戳;若虚拟节点集合中不存在所匹配查询的节点,则创建相应的虚拟节点,计算哈希值将该节点添加到虚拟节点集合当中,同时创建节点之间的关系,并设置对应的时间戳属性值;(3)在新建代码实体节点时,如果虚拟节点集合中已经存在该实体对应的哈希索引,则根据静态分析的结果完善该虚拟节点的属性信息,同时从集合中移除该节点。
25.以前文中的函数a、b为例,在更新函数实体a的过程中需要查找a调用的函数实体b,但由于此时函数实体b尚未创建,因此生成b对应的虚拟节点,这里暂记为vb,将其添加到虚拟节点的集合当中,同时建立函数实体a到vb的调用关系;而在后续对函数实体b的更新过程中,在创建该实体节点时首先访问虚拟节点集合,依据计算的哈希值匹配到了对应的虚拟节点vb,则不再进行实体节点创建的操作,仅将该虚拟节点的属性信息补全并从虚拟节点集合中移除,得到更新后的函数实体b。
26.本发明的有益效果为:用户通过设置commit数据作为工具的输入,便能够对现有软件知识图谱进行增量更新,同时将数据范围内的软件代码的演化信息记录到图谱当中并予以表示,较大程度地降低了图谱全量更新带来的冗余开销,保证了图谱内容的时效性和一致性,并为用户提供了更为直观的获取代码变更范围和内容的途径。
附图说明
27.图1为本发明的执行流程示意图。
28.图2为软件代码演化知识图谱元模型。
29.图3为本发明的整体实现框架。
30.图4为本发明更新后的示例子图。
具体实施方式
31.下面结合附图对本发明进行进一步详细描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
32.图1说明了本发明工具的执行流程:首先设计了软件代码演化知识图谱元模型来显式地表示代码演化知识;进而基于代码提交,通过更新元素抽取、更新实体映射的过程实现了代码演化知识的抽取,并最终通过图谱更新算法实现软件代码演化知识图谱的增量更新;图2是软件代码演化知识图谱元模型的设计,对知识图谱中的实体、关系以及实体的属性进行了定义;图3说明了本发明工具的整体实现框架:更新元素抽取模块获取commit更新的代码元素,更新实体映射模块获取代码元素在知识图谱当中具体的待更新内容,而知识图谱更新模块通过执行数据库事务对软件知识图谱进行增量式更新。
33.为了验证本文工具的效果,即知识图谱增量更新的效率和知识图谱更新的正确性,本发明选取了4个c语言软件项目进行了实验验证,包含了github的高星开源项目以及企业内部的软件项目。其中一次commit提交修改的代码文件内容如下所示:
此次更新的内容包括:新增头文件los_toolchain.h的引用;新增函数los_lowbitget的定义;对函数los_bitmapsetnbits进行修改,删除了对变量bitmap_bits_per_word和os_bitmap_word_mask的调用,同时新增了对函数 bitmap_last_word_mask的调用。
34.在更新元素抽取阶段,以上操作被识别为代码文件los_bitmap.c的修改操作,具体记录为头文件的新增;函数的新增以及函数的修改;在更新实体映射阶段,将记录的更新代码元素映射到图谱实体及关系,获取此次更新操作对应到知识图谱具体的待更新内容;进而通过执行数据库事务,将这些待更新实体及关系在图谱中予以表示,得到如图4所示的结构表示(为了直观表示,只显示了此次commit更新的部分子图)。
35.其中,commit实体建立与文件实体los_bitmap.c的modify关系,而具体的更新内容包括:新增对los_toolchain.h头文件的include,该include关系的begin_timestamp属性值设置为此次commit的提交日期,表示该关系创建的起始时间;同时commit实体与函数实体los_lowbitget建立add关系表示新增定义,该函数实体,两条invoke类型的出边以及define类型的入边的属性begin_timestamp都设置为commit提交日期;而commit对函数实体los_bitmapsetnbits的修改也通过modify的关系表示,由于该函数在此次更新中删除了对两个变量实体的调用,因此这两个invoke关系的end_timestamp属性值设置为commit提交日期,表示关系的删除时间,同理将新增的对函数实体bitmap_last_word_mask的invoke关系的begin_timestamp属性值设置为commit提交日期,表示该关系的创建时间。
36.尽管为说明目的公开了本发明的具体实施例,其目的在于帮助理解本发明的内容并据以实施,本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范
围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献