CN115185728A - 一种基于图节点嵌入的软件系统架构恢复方法 - Google Patents

一种基于图节点嵌入的软件系统架构恢复方法 Download PDF

Info

Publication number
CN115185728A
CN115185728A CN202210820883.5A CN202210820883A CN115185728A CN 115185728 A CN115185728 A CN 115185728A CN 202210820883 A CN202210820883 A CN 202210820883A CN 115185728 A CN115185728 A CN 115185728A
Authority
CN
China
Prior art keywords
graph
software system
nodes
dependency
embedding
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202210820883.5A
Other languages
English (en)
Inventor
蒋雨宸
张天
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN202210820883.5A priority Critical patent/CN115185728A/zh
Publication of CN115185728A publication Critical patent/CN115185728A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Abstract

本发明公开一种基于图节点嵌入的软件系统架构恢复方法,主要包括提取文件依赖关系图、随机游走图节点嵌入、k‑means聚类三个部分,具体步骤为:分析软件系统源码,接收系统的源码文件作为输入;基于特定编程语言和粒度粗细,提取软件系统中文件之间的依赖关系;通过文件之间的依赖关系构建依赖图,然后使用随机游走算法提取图结构信息,基于节点在采样序列中的上下文将图节点嵌入到向量空间;获得图节点的向量表示之后,使用k‑means算法进行聚类,聚类结果将source code划分到不同的module簇,作为本方法的输出。本方法具有可伸缩性强,系统架构恢复效果好的特点,且本方法后续利用价值较大。

Description

一种基于图节点嵌入的软件系统架构恢复方法
技术领域
本发明涉及文件级别的依赖提取和图结构嵌入以及无监督聚类,具体涉及一种基于图节点嵌入的软件系统架构恢复方法,属于软件工程领域与深度学习中的图神经网络领域。
背景技术
随着系统软件的不断发展,软件的规模与复杂性在快速提升。一个高层次的系统架构能精确地描述软件各模块间的关联性,有助于提高软件的可理解性与可维护性。但是由于系统软件庞大的规模以及高度的复杂性,人工的恢复软件系统的架构需要消耗大量的时间成本与人力成本,同时难以伴随软件迭代过程,对软件架构进行持续更新。为了解决软件架构恢复困难的问题,研究者提出了许多自动化或半自动化的架构恢复算法,其中,基于依赖的架构恢复技术普遍表现出更好的效果。这类技术通过构造软件系统的依赖图,并基于依赖图进行节点聚类,从而完成对系统的模块划分任务。尽管研究者为提高架构恢复效果,对这类技术进行了多方面的改进,仍然存在一些值得优化的地方。
现有的基于依赖结构的架构恢复工作并没有充分利用局部图结构的信息进行模块划分。主流的架构恢复技术主要采用高内聚、低耦合的质量目标,将架构恢复问题转换为优化问题,或采用基于子系统模式的理解驱动的架构恢复,或使用特殊的模块间的距离度量方法来进行层次聚类。这些技术的算法目标简单且单一,无法有效地利用依赖图中潜在的结构信息。
鉴于以上所述,需要基于粒度的不同,依据软件系统源代码提取源代码文件的依赖,快速准确的获得软件系统的架构。当前现有方法面临着两大问题:一是可伸缩性,现有算法应用到10MLOC(Lines Of Code)以上的大规模软件系统上时,效率不佳,有的算法甚至运行几天的时间耗尽内存也没有得到结果;二是效果不好,现有算法在不同的文件依赖和不同的度量标准上的表现有一定波动,没能在所有的情况下都取得好的效果。为了解决将软件系统架构恢复算法应用到大规模,高复杂性的系统,以及提高架构恢复算法在不同依赖不同关系不同度量上的表现,提出了快速准确的基于图节点嵌入的软件系统架构恢复算法。
发明内容
本发明的目的在于针对大规模、快速迭代的软件系统,在缺失开发文档的情况下,如何进行系统架构恢复,提出了一种基于图节点嵌入的软件系统架构恢复方法,通过接受源代码文件作为输入,提取文件级别的依赖关系,基于随机游走方法提取图结构信息,获得图节点的采样序列,然后利用节点在采样序列中的上下文将节点嵌入到向量空间,最后基于K-means将源代码文件聚类,旨在解决现有工作可伸缩性不高,难以拓展到大规模软件系统,以及架构恢复准确率效果较差的问题。
为实现上述目的,本发明采用的技术方案为:
一种基于图节点嵌入的软件系统架构恢复方法,其特征在于,其所述方法包含如下步骤:
步骤1)接收软件系统中的源代码文件作为方法的输入;本方法由于需要将源代码转化为中间代码表示,通过分析中间代码获得文件之间的依赖关系,暂时支持主流语言C,C++和Java;
步骤2)基于源代码文件的输入,先根据编程语言将C/C++源代码编译为LLVMbitcode,将Java处理成Java字节码,通过分析包含关系和符号依赖将软件系统建模成文件级别的依赖图,其中图节点为源代码文件,有向边为文件之间的依赖关系,根据提取依赖的粒度粗细不同,有不同的依赖图;
步骤3)拿到依赖图之后,使用随机游走算法用于提取图的结构信息,主要想法是具有相似的图结构的点会有更高的可能性在相同的采样过程中重现,与此同时,它们的特征向量之间的差距更小;获得图节点采样序列之后,基于节点在采样序列中的上下文将节点嵌入到向量空间;
步骤4)将图节点嵌入到向量空间之后,获得了源代码文件的向量表示,使用k-means无监督聚类算法,将源代码文件划分到不同的簇;
步骤5)将聚类结果与参考模型的结果进行比较计算外部指标,直接考察聚类结果的簇间相似度和簇内相似度作为内部指标,计算的结果分别记为评价软件系统架构恢复方法的评价指标。
上述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤1)中的软件系统的选取要具有代表性,能够评估架构恢复方法的准确性;选取的软件系统还需要具有相当数量的依赖关系可以构建依赖关系图;同时软件系统应具有ground-truth架构作为比较和评估的基准。
上述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤2)中的依赖关系的不同对架构恢复方法的效果有不同的影响,Include依赖基于C/C++中的#include指令和Java中的import语句进行提取;符号依赖用来反映文件之间的准确依赖关系,根据使用符号的类别,所述符号依赖包括function-call依赖和function-call-and-global-variable-use依赖;java符号依赖被划分为三个级别:S-CHA,S-Int和No-DyB。
上述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤3)中的随机游走算法提取图的子结构步骤具体包含以下子步骤:
步骤31)选取一个节点作为当前访问节点,加入访问节点序列;
步骤32)从当前节点的邻居节点中随机采样节点作为下一个访问的节点;
步骤33)重复步骤31)~步骤32)两步,直到访问节点序列达到预定的长度;
步骤34)获取足够数量的节点访问序列之后,使用skip-gram model进行学习节点的嵌入表示。
上述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤4)中的k-means算法进行无监督聚类的主要包括以下步骤:
步骤41)选择K个样本作为初始的聚类中心a{1},a{2},……,a{k}
步骤42)对于数据集中的每个样本xi,计算它到k个聚类中心的距离,并将该样本划分到距离最近的聚类中心对应的簇中;
步骤43)对于每一个类别ai,重新计算它的聚类中心
Figure BDA0003744352130000031
步骤44)重复步骤42)~步骤43),直到达到一定的迭代次数。
上述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤5)中的架构恢复算法的度量分为外部指标和内部指标,所述外部指标(external index)将聚类结果与某个“参考模型”(reference model)进行比较,其中参考模型就是架构恢复的groundtruth,由参与项目开发的人员和有经验的专家手工恢复;所述外部指标包括:MoJoFM、Architecture-to-Architecture(a2a)、Cluster-to-Cluster Coverage(c2c);所述内部指标(internal index)无需参考模型,直接考察聚类结果,内所述部指标包括NormalizedTurboMQ。
通过上述技术方案,可以得到以下有益效果:
本方法接收源代码文件作为输入,提取文件级别的依赖关系,基于随机游走方法提取图结构信息,获得图节点的采样序列,然后利用节点在采样序列中的上下文将节点嵌入到向量空间,最后基于K-means将源代码文件聚类。本方法具有可伸缩性强,系统架构恢复效果好的特点,因此本方法后续利用价值较大。
附图说明
图1为本发明实施例软件系统架构恢复的流程图。
图2为本发明实施例以C++为例的文件级别的依赖提取方法的流程图。
图3为本发明实施例文件依赖关系提取方法的流程图。
图4为本发明实施例广度优先采样策略与深度优先采样策略的差异性展示图。
图5为本发明实施例k-means算法进行无监督聚类的流程图。
图6为本发明实施例基于不同粒度的依赖Bash软件系统上评估效果。
图7为本发明实施例基于不同粒度的依赖在ArchStudio软件系统上的评估效果图。
图8为本发明实施例基于不同粒度的依赖在Hadoop软件系统上的评估效果图。
图9为本发明实施例基于不同粒度的依赖在ITK软件系统上的评估效果图。
图10为本发明实施例基于不同粒度的依赖在Chromium软件系统上的评估效果图。
具体实施方式
以下结合附图和具体实施例对本发明的技术方案做进一步详细说明。
本实施例软件系统架构恢复的四个步骤流程如图1所示,其具体步骤为:
1)本方法接收软件系统中的源代码文件作为方法的输入。本方法由于需要将源代码转化为中间代码表示,通过分析中间代码获得文件之间的依赖关系,因此暂时支持主流语言C,C++以及Java。基于源代码文件的输入,本方法先根据编程语言将C/C++源代码编译为LLVM bitcode,将Java处理成Java字节码,通过分析包含关系和符号依赖将软件系统建模成文件级别的依赖图,其中图节点为源代码文件,有向边为文件之间的依赖关系,根据提取依赖的粒度粗细不同,有不同的依赖图。
2)以C++为例讲解文件级别的依赖提取方法,方法的流程如图2所示,具体步骤如下:
21)方法的输入为C/C++软件的编译指令库与需要优化的源文件。编译指令库中包含了软件构建过程中在各个源文件上执行的编译指令,源文件的编译过程需要结合具体的宏定义条件进行,同理,对源文件进行分析也需要在具体的编译单元下执行。常用的C/C++软件的构建管理工具cmake支持自动导出编译指令库,使用经典的makefile管理的软件则可以使用开源工具bear,通过捕获编译过程执行的各个语句生成编译指令库。
22)在预处理阶段,捕获预处理器对#include语句的处理操作,并根据头文件的包含关系,建立头文件包含依赖图。
23)在语法树分析阶段,基于编译器生成的抽象语法树进行递归遍历操作,从语法树结构中提取符号的使用依赖关系,并加入到头文件包含依赖图中。
24)经过预处理阶段与抽象语法树遍历阶段的分析操作,获得了完整的文件依赖图模型。该模型中包含头文件的包含依赖关系以及真实的符号使用关系,基于该模型的结果,使用二次搜索算法计算间接依赖关系。
3)对于依赖图,我们使用随机游走获得图节点采样序列,然后参考Skipgram的思路,基于节点在采样序列中的上下文将节点嵌入到低维的向量空间,提取依赖关系的方法分两个阶段:随机游走和节点嵌入,如图3所示,图3为本发明实施例文件依赖关系提取方法的流程图:
31)随机游走策略又分为深度优先和广度优先,BFS策略将采样范围限制在初始节点的直接邻居上,它关注的是微观视角下的局部图结构特征。BFS采样得到的图结构统计信息反映了节点的同质性,在该性质下,高度互相连接或属于同一个簇的节点具有更高的概率出现在同一遍历序列中。DFS的采样过程可以探索到距离初始节点更远的范围,因此可以从宏观的角度感知局部图结构。DFS采样的图结构统计信息更关注节点的结构等价性。与节点的同质性不同,结构等价性并不是特别注重节点间的连接程度,因此在图结构中距离较远的节点同样可以归属于同一个簇中。如附图4所示,广度优先采样策略与深度优先采样策略的差异性:以节点u为起点,游走步长为3的单次游走过程。红线表示广度优先采样过程,蓝线表示深度优先采样过程。
32)随机游走采样节点序列之后,将随机游走过程采样得到的节点序列作为语料库,以及经过初始化的节点嵌入函数输入到SkipGram模型中进行训练。对于语料库中的每个节点序列
Figure BDA0003744352130000051
SkipGram模型提取出每个节点
Figure BDA0003744352130000052
(1≤i-2ω&&i+2ω≤l)的上下文,并基于损失函数以及梯度下降算法,对嵌入函数φ进行优化。
4)k-means算法进行无监督聚类,主要步骤如图5所示:
41)选择K个样本作为初始的聚类中心a{1},a{2},……,ak
42)对于数据集中的每个样本xi,计算它到k个聚类中心的距离,并将该样本划分到距离最近的聚类中心对应的簇中。
43)对于每一个类别ai,重新计算它的聚类中心
Figure BDA0003744352130000053
44)重复所述步骤42)~步骤43),直到达到一定的迭代次数。
这种向量表示的思想利用了节点间的二阶相似性,即存在高度重合的直接邻居结构的节点间具有更短的向量距离的思想。
5)基于不同粒度的依赖在不同规模的软件系统上评估效果分别如图6~10所示:
我们使用阴影标记了top-1的结果,从附图中可以清晰地看出算法在几乎所有的实验中都获得了第一或第二的成绩,并在很多评价指标上大大领先于之前的工作。而对于可伸缩性的问题,是通过分析算法在Chromium软件系统上的表现来回答的。由于部分实验数据来自以前的工作,没有提供确切的运行时间结果,我们根据我们的实验结果和一些公开的数据进行讨论。不同级别的依赖关系消耗不同数量的运行时间和内存。对于Chromium来说,最大的依赖是Include依赖,它的边数超过100万,节点数超过2万。我们的算法在include依赖上单次运行时间约为14小时。在其他依赖级别上运行会消耗5-6个小时。与其他算法进行比较,FCA和ACDC是排名前二的高效算法,分别耗时8小时和10小时,而其他算法则需要更长的时间。例如,WCA和K-means消耗超过30小时,Bunch-SAHC和LIMBO在24天和8天后还没有计算出结果。对于基于知识的算法,ZBR在处理过程中耗尽了40gb RAM。因此可以得出结论,本发明的算法在具有极佳表现的同时还有着相当可观的效率。
以上仅是本发明的优选实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明的精神和原则的前提下,对本发明所做的任何修改、等同替换等,均应包含在本发明的保护范围。

Claims (6)

1.一种基于图节点嵌入的软件系统架构恢复方法,其特征在于,其所述方法包含如下步骤:
步骤1)接收软件系统中的源代码文件作为方法的输入;本方法由于需要将源代码转化为中间代码表示,通过分析中间代码获得文件之间的依赖关系,暂时支持主流语言C,C++和Java;
步骤2)基于源代码文件的输入,先根据编程语言将C/C++源代码编译为LLVM bitcode,将Java处理成Java字节码,通过分析包含关系和符号依赖将软件系统建模成文件级别的依赖图,其中图节点为源代码文件,有向边为文件之间的依赖关系,根据提取依赖的粒度粗细不同,有不同的依赖图;
步骤3)拿到依赖图之后,使用随机游走算法用于提取图的结构信息,主要想法是具有相似的图结构的点会有更高的可能性在相同的采样过程中重现,与此同时,它们的特征向量之间的差距更小;获得图节点采样序列之后,基于节点在采样序列中的上下文将节点嵌入到向量空间;
步骤4)将图节点嵌入到向量空间之后,获得了源代码文件的向量表示,使用k-means无监督聚类算法,将源代码文件划分到不同的簇;
步骤5)将聚类结果与参考模型的结果进行比较计算外部指标,直接考察聚类结果的簇间相似度和簇内相似度作为内部指标,计算的结果分别记为评价软件系统架构恢复方法的评价指标。
2.根据权利要求1所述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤1)中的软件系统的选取要具有代表性,能够评估架构恢复方法的准确性;选取的软件系统还需要具有相当数量的依赖关系可以构建依赖关系图;同时软件系统应具有ground-truth架构作为比较和评估的基准。
3.根据权利要求1所述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤2)中的依赖关系的不同对架构恢复方法的效果有不同的影响,Include依赖基于C/C++中的#include指令和Java中的import语句进行提取;符号依赖用来反映文件之间的准确依赖关系,根据使用符号的类别,所述符号依赖包括function-call依赖和function-call-and-global-variable-use依赖;java符号依赖被划分为三个级别:S-CHA,S-Int和No-DyB。
4.根据权利要求1所述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤3)中的随机游走算法提取图的子结构步骤具体包含以下子步骤:
步骤31)选取一个节点作为当前访问节点,加入访问节点序列;
步骤32)从当前节点的邻居节点中随机采样节点作为下一个访问的节点;
步骤33)重复步骤31)~步骤32)两步,直到访问节点序列达到预定的长度;
步骤34)获取足够数量的节点访问序列之后,使用skip-gram model进行学习节点的嵌入表示。
5.根据权利要求1所述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤4)中的k-means算法进行无监督聚类的主要包括以下步骤:
步骤41)选择K个样本作为初始的聚类中心a{1},a{2},……,a{k}
步骤42)对于数据集中的每个样本xi,计算它到k个聚类中心的距离,并将该样本划分到距离最近的聚类中心对应的簇中;
步骤43)对于每一个类别ai,重新计算它的聚类中心
Figure FDA0003744352120000021
步骤44)重复步骤42)~步骤43),直到达到一定的迭代次数。
6.根据权利要求1所述的基于图节点嵌入的软件系统架构恢复方法,其特征在于,所述步骤5)中的架构恢复算法的度量分为外部指标和内部指标,所述外部指标(externalindex)将聚类结果与某个“参考模型”(reference model)进行比较,其中参考模型就是架构恢复的ground truth,由参与项目开发的人员和有经验的专家手工恢复;所述外部指标包括:MoJoFM、Architecture-to-Architecture(a2a)、Cluster-to-Cluster Coverage(c2c);所述内部指标(internal index)无需参考模型,直接考察聚类结果,内所述部指标包括Normalized TurboMQ。
CN202210820883.5A 2022-07-13 2022-07-13 一种基于图节点嵌入的软件系统架构恢复方法 Pending CN115185728A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210820883.5A CN115185728A (zh) 2022-07-13 2022-07-13 一种基于图节点嵌入的软件系统架构恢复方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210820883.5A CN115185728A (zh) 2022-07-13 2022-07-13 一种基于图节点嵌入的软件系统架构恢复方法

Publications (1)

Publication Number Publication Date
CN115185728A true CN115185728A (zh) 2022-10-14

Family

ID=83519589

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210820883.5A Pending CN115185728A (zh) 2022-07-13 2022-07-13 一种基于图节点嵌入的软件系统架构恢复方法

Country Status (1)

Country Link
CN (1) CN115185728A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116774988A (zh) * 2023-08-16 2023-09-19 易方信息科技股份有限公司 解除框架包模式符号依赖的方法及装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116774988A (zh) * 2023-08-16 2023-09-19 易方信息科技股份有限公司 解除框架包模式符号依赖的方法及装置
CN116774988B (zh) * 2023-08-16 2024-02-27 易方信息科技股份有限公司 解除框架包模式符号依赖的方法及装置

Similar Documents

Publication Publication Date Title
Yu et al. LSTM-EFG for wind power forecasting based on sequential correlation features
Zhao et al. Cascaded prediction network via segment tree for temporal video grounding
Zou et al. Finding top-k maximal cliques in an uncertain graph
CN112328578B (zh) 一种基于强化学习和图注意力网络的数据库查询优化方法
CN113722218B (zh) 一种基于编译器中间表示的软件缺陷预测模型构建方法
CN102073708A (zh) 面向大规模不确定图数据库的子图查询方法
CN111274817A (zh) 一种基于自然语言处理技术的智能化软件成本度量方法
CN115357904B (zh) 一种基于程序切片和图神经网络的多类漏洞检测方法
CN112364352A (zh) 可解释性的软件漏洞检测与推荐方法及系统
CN113761221A (zh) 基于图神经网络的知识图谱实体对齐方法
CN115185728A (zh) 一种基于图节点嵌入的软件系统架构恢复方法
CN114816517A (zh) 一种层次语义感知的代码表示学习方法
CN109992271B (zh) 一种基于代码词汇和结构依赖的分层架构识别方法
CN111949707A (zh) 一种基于影场的隐马尔可夫模型的非侵入式负荷分解方法
CN113177107B (zh) 一种基于句法树匹配的智能合约相似性检测方法
CN114491081A (zh) 基于数据血缘关系图谱的电力数据溯源方法及系统
Hu Research on English achievement analysis based on improved CARMA algorithm
Yu et al. Hgprompt: Bridging homogeneous and heterogeneous graphs for few-shot prompt learning
CN116467437A (zh) 面向复杂场景描述的自动流程建模方法
CN116302089A (zh) 基于图片相似度的代码克隆检测方法、系统及存储介质
CN114780403A (zh) 基于增强代码属性图的软件缺陷预测方法及预测装置
CN114706558A (zh) 基于K-Truss的复杂软件关键模块识别方法
CN111026659B (zh) 一种基于嵌入表示的移动应用回调分析研究方法
CN113988083A (zh) 一种用于航运新闻摘要生成的事实性信息编码与评估方法
Yang et al. IMBT--A Binary Tree for Efficient Support Counting of Incremental Data Mining

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination