CN105930162B - 一种基于子图搜索的特征定位方法 - Google Patents
一种基于子图搜索的特征定位方法 Download PDFInfo
- Publication number
- CN105930162B CN105930162B CN201610254292.0A CN201610254292A CN105930162B CN 105930162 B CN105930162 B CN 105930162B CN 201610254292 A CN201610254292 A CN 201610254292A CN 105930162 B CN105930162 B CN 105930162B
- Authority
- CN
- China
- Prior art keywords
- subgraph
- code
- code element
- candidate
- keyword
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明属于软件工程技术领域,具体为一种基于子图搜索的特征定位方法。本发明方法包括:对软件源代码进行预处理,获取代码元素间的调用依赖关系信息;用户输入关键字,并通过文本检索方法在软件源代码中搜索到包含任意关键字的代码元素作为候选元素;计算候选元素与输入的关键字的相似度;根据代码元素与关键字的相似度和代码元素间依赖关系定义评价函数,来评价调用依赖图的子图是否为较好的特征定位结果;然后在代码元素间的调用依赖图上搜索使评价函数值最高的子图作为结果。本发明的自动化程度较高,可以让开发者快速的进行特征定位,并能够清晰的了解代码结构,快速理解代码的实现过程。
Description
技术领域
本发明属于软件工程技术领域,具体涉及特征定位、代码分析以及图搜索技术,适用于辅助开发人员完成软件特征定位任务,并让开发人员快速了解软件功能实现过程。
背景技术
为了完成各种软件维护任务,例如纠正需求实现中的错误、改进已有的功能实现方式、或扩展新的功能特性,开发人员经常需要先确定需求特征与代码的对应关系。这种确定源代码中与给定需求特征相关的程序元素的过程称为特征定位。
开发人员在进行特征定位时,除了找出与特征对应的代码元素之外,还需要理解这些功能特征的实现过程,以便进行相应的维护任务。但传统的特征定位仅仅找出与特征对应的代码元素,并没有给出任何辅助开发者理解代码的信息,而程序元素间的关系错综复杂,开发人员要完全了解特征定位过程得到的结果仍然要耗费很多精力探索代码元素。因此有必要为开发人员提供更好的特征定位工具以辅助他们更好的理解特征是如何实现的。
为了让开发者尽快了解代码结构,本发明选择了代码间的调用关系作为结构信息加入到返回结果中。在软件程序中,每个代码元素都会负责相对单一的一个职能,要实现一个完整的功能特征,需要很多代码元素进行“协作”,而代码元素间的“协作”就是依靠代码之间的相互调用来完成。因此,代码间的调用关系能够很好的反映出代码元素间的协作过程,从而帮助开发人员快速的了解相应功能的实现过程。
为了获取到带有调用信息的特征定位结果,本发明将直接使用现有的静态分析技术处理源代码,该技术能够获取到代码元素间的调用关系,本发明根据代码元素信息和代码元素间的调用关系构建一个调用依赖图,并在此基础上使用子图搜索的方法来获取到与功能特征描述最为接近的子图,最终以该子图作为最后的结果返回给开发者。
在此需要说明的一点是,本发明中设计的子图搜索方法需要调用依赖图上任意两点间的最短路径。因此,本发明在构建了代码元素间的调用依赖图后,使用了弗洛伊德算法来计算最短路径信息。该算法是一种动态规划算法,能够高效的计算出图结构中任意两点间的最短路径。
在搜索时本发明中还设置了一个评价函数来判断搜索到的图与功能特征的关联程度,在搜索过程中寻找评价值最大的子图。子图的评价函数结合了代码元素与功能描述的文本相似度和代码元素间的调用关系,从而充分利用了代码语义信息和结构信息,保证搜索结果的准确性。
通过本发明,开发者只需要输入与特征相关的关键字,就能够快速的搜索到与特征相关的代码元素的调用依赖图。调用依赖图不仅能够帮助开发者找到相应的代码元素,还能够帮助开发者理解代码实现过程。
发明内容
本发明的目的在于提供一种快速自动化的特征定位方法,并在给出特征定位结果的同时提供代码元素间调用关系来辅助开发者快速理解代码。
在使用该方法时,开发人员先输入一组描述特征的关键字。该方法先根据关键字搜索相关的代码元素,再根据代码元素的语义信息和调用关系搜索到一个与特征相关的代码元素调用依赖图。该依赖图将作为最后的结果提供给开发者,开发者在获取到依赖图后,不仅能够找到与特征相关的代码元素,还能够快速了解代码元素间的调用关系,以辅助他们理解代码实现过程。
本发明的技术方案如下:
本发明的方法流程如图1所示。在对某个项目进行特征定位之前,先要进行一些预处理过程来获取方法中所需的信息。首先使用静态分析技术对源代码进行预处理,获取到源代码中代码元素间的调用关系,并根据调用关系构建代码元素间的调用依赖图。然后使弗洛伊德算法处理调用依赖图,得到图中任意两点间的最短路径。至此,预处理过程结束,得到的代码元素间调用依赖图和图中任意两点间最短路径即为图1中的代码元素依赖信息。这些信息将在子图搜索过程中被使用。
在进行特征定位时,开发者输入从特征描述中提取的关键字,然后本发明将会自动的根据关键字和预处理获取的信息搜索出与该特征相关的代码元素调用依赖图。
本发明中提出的特征定位方法具体分为两部分,第一部分是根据开发者的关键字,在源代码中搜索候选代码元素,第二部分是根据第一部分得到的候选代码元素和预处理得到的数据,在代码调用依赖图上搜索一个与特征对应的子图,该子图将被作为特征定位结果返回给用户。
在第一部分中,方法先使用现有的文本检索技术,在源代码中进行文本检索,找出到包含任意关键字的代码元素,然后根据公式(1)为每个搜索到的代码元素计算一个文本相似度。
(1)
公式1中,Q为开发者输入的关键字的集合,m为函数的文本段中所包含的词语的集合。与信息检索中相似度计算不同,该相似度计算结果为离散数值,对相似性的区分度更大,且便于计算;
这些计算了文本相似度的代码元素被称为候选代码元素。如图1所示,这些候选代码元素是方法第一步的输出数据。
在第二部分中,方法根据候选代码元素和预处理得到的调用依赖信息,在源代码的调用依赖图上搜索到一个子图,使得该子图具有最好的评价值。子图评价值的计算如公式(2)所示:
(2)
公式中,Q为关键字集合,G(V, E)为搜索到的程序依赖调用图上的子图,V为子图的点集合,也就是函数元素的集合;E为子图上边的集合,也就是元素间调用关系的集合。公式中Sim(Q,vi)为代码元素与输入的关键字之间的文本相似度,∣E∣为子图中边的总长度。ρ为人工设置的参数,用来调节子图的大小对评价值的限制作用。该函数很好的结合了函数与关键字的文本相似度和函数间结构关系的紧密性,保证了最终结果的准确性。
在进行子图搜索的过程中,直接使用暴力搜索来获取评价值最高的子图并不可行,其复杂度非常高,无法即时的给出特征定位结果。因此本发明中设计了一种基于贪心策略的图扩展算法。该算法不直接搜索子图,而是随机选取文本相似度最高的一个候选元素作为初始子图。然后逐步扩展子图,每次将新的候选元素连入子图,以使子图评价值得到最大提升。直到找不到任何使子图评价值提升的候选元素,或是子图中候选元素超过上限。该算使用贪心策略从随机选取的节点开始,生成一个评价值较高的子图,复杂度低。
算法的输入为:项目的依调用结构图、调用结构图上任意两点最短路径信息以及候选元素数据;算法的输出为:与特征对应的代码元素的结构依赖图
基于上述介绍,本发明提出的基于子图搜索的特征定位方法,具体步骤归纳如下:
(1)首先对软件源代码进行预处理,获取代码元素间的调用依赖关系信息;
(2)用户输入若干关键字,并通过文本检索方法在软件源代码中搜索到包含任意关键字的代码元素作为候选元素;
(3)计算一个候选元素与输入的关键字的相似度,本发明中将其称为文本相似度。具体计算方式如式(1)所示:
(4)根据代码元素与关键字的相似度和代码元素间依赖关系定义了一个评价函数,来评价调用依赖图的子图是否为较好的特征定位结果;然后在代码元素间的调用依赖图上搜索使评价函数值最高的子图作为结果;
(5)在具体搜索时,采用一种基于贪心算法的图扩展算法,获取一个评价值较高的依赖结构图作为结果。
本发明方法的最终特征定位结果为代码元素调用依赖图的子图。这种结果中包含了代码中函数间的结构关系,能够辅助用户快速理解代码的结构,并且采用图结构的结果展示方式能够很好地描绘代码元素间复杂的依赖关系。
本发明的优点和积极效果:开发者只需要输入与特征相关的关键字,方法就可以自动化的搜索到相应的特征定位结果。由于方法中有效的结合了代码的语义信息和结构信息,使得搜索的结果具有较高的准确率。同时,方法的最终结果包含了调用依赖信息,能够快速的辅助开发者理解代码的实现过程。本发明的自动化程度较高,可以让开发者快速的进行特征定位。并且,本发明返回带有调用信息的特征定位结果,与传统的特征定位结果相比,具有额外的调用结构信息,能够让开发者清晰的了解代码结构,快速理解代码的实现过程。
附图说明
图1为本发明的方法流程图。
图2为本发明特征定位结果示意图。
具体实施方式
本节将以Java代码为例,介绍用本发明进行特征定位的实施方法。
首先在进行特征定位前要对特征定位的项目进行预处理。对于Java项目,可以使用Java静态分析工具,例如Eclipse中的JDT分析工具,进行Java项目源代码的分析,获取到代码元素的信息和代码元素间的调用依赖信息。根据代码元素和元素间的调用依赖可以很容易的在内存中构建代码元素间的调用结构图。再使用弗洛伊德算法处理结构图数据就可以获取到图中任意两点间最短距离和最短路径的数据。最后,将这些数据存储到数据库中,以便在特征定位过程中,相应的数据能够被快速的查找到。
在预处理时,还可以使用文本搜索引擎,例如Lucene搜索引擎,为代码元素的代码段建立索引,以便加速特征定位过程中候选元素的查找。
在特征定位时,用户输入若干关键字开始特征定位过程。获取到关键字后,可以使用文本搜索引擎根据预处理时对源代码建立的索引,快速的搜索出包含关键字的代码元素。然后按照公式(1)为每个搜索到的代码元素计算相应的文本相似度。本发明中,计算了文本相似度的代码元素被称为候选元素。
获取到候选元素后就可以进行子图搜索过程。用任意一种编程语言实现本发明中设计的图扩展算法,然后将候选元素数据、数据库中的代码元素调用结构图数据和结构图上任意两点间最短路径数据输入到图扩展算法中,便可以获得与特征对应的代码元素调用结构图数据。
算法过程如下:
(1)设置一个空的图作为搜索子图,并从现有的候选元素中选择文本相似度最高的代码元素加入到搜索子图中。
(2)设置一个空集合作为最短边集合,并根据预处理得到的数据,将目前搜索子图中唯一的代码元素到其他候选元素的最短路径加入到最短边集合中。最短边集合为未加入搜索子图中的候选元素到子图的最短边的集合。
(3)利用公式2计算最短边集合中每条边的评价值,这个评价值可以近似的评估将该边加入搜索子图后给搜索子图带来的评价值的增益。若最短边集合为空,直接返回搜索子图。
(4)取(3)中评价值最高的边,尝试将其加入搜索子图中。若加入后,搜索子图的评价值变高,则将其加入搜索子图并将其从最短边集合中移除,若此时搜索子图中候选元素个数达到一个预设的上限值m则终止搜索,将搜索子图作为结果返回。而如果加入后搜索子图的评价值没有变高,也直接终止搜索,将搜索子图返回。
(5)根据(4)中新加入的候选元素来更新最短边集合中的边,保证最短边集合中的边为未加入搜索子图的候选元素到子图的最路径。
(6)更新最短边集合后,重复过程(3)
以上算法是一种用以搜索评价值最高子图的近似算法。这种算法并不能保证搜索到评价值最高的子图,但经过验证该算法搜索到的子图评价值较高,使特征定位结果的准确率足够好,且方法的复杂度较低,能够快速的搜索到子图,让用户及时的得到特征定位结果。
最后为了向特征定位工具的使用者展示结果,还可以使用可视化工具,例如Eclipse平台下的Zest图形展示工具,将结果展示出来。
图2 就是基于本发明实现的工具进行实际特征定位得到的结果案例图。案例所在的项目为JEdit,是一个使用Java开发的文本编辑器软件。要定位的特征描述如下:
A fullscreen mode for JEdit would be very nice. Especially onnetbooks with limited screen-size it is useful, to get rid of the title barand window-borders.
开发人员总结出的关键字为:fullscreen、mode。
使用本发明搜索到的结果图如图2所示。图中节点对应码中的函数,节点的名称为代码函数的完整函数名,包括函数代码所在包的名称、所在类的名称、函数名称和函数的参数列表(列在函数名后的括号中,并用逗号隔开)。图中名称为粗体的节点为候选代码元素对应的节点,是特征对应的代码元素;名称为斜体的节点不是特征对应的代码元素,这些元素能够通过调用关系将候选元素连接起来,有助于开发者理解代码。
Claims (2)
1.一种基于子图搜索的特征定位方法,其特征在于具体步骤如下:
(1)首先对软件源代码进行预处理,获取代码元素间的调用依赖关系信息;包括:使用静态分析技术对源代码进行预处理,获取到源代码中代码元素间的调用关系,并根据调用关系构建代码元素间的调用依赖图;然后使用弗洛伊德算法处理调用依赖图,得到图中任意两点间的最短路径;
(2)用户输入若干关键字,并将通过文本检索方法在软件源代码中搜索到包含任意关键字的代码元素作为候选元素;
(3)计算一个候选元素与输入的关键字的相似度,具体计算方式如下式:
其中,Q为用户输入的关键字的集合,m为代码元素中所包含的词语的集合;
(4)根据代码元素与关键字的相似度和代码元素间依赖关系定义一个评价函数,来评价调用依赖图的子图是否为较好的特征定位结果;然后在代码元素间的调用依赖图上搜索使评价函数值最高的子图作为结果;
(5)在具体搜索时,采用一种基于贪心算法的图扩展算法,获取一个评价值较高的依赖结构图作为结果;
所述步骤(4)中,所述评价函数为:
公式中,Q为关键字集合,G(V, E)为搜索到的程序依赖调用图上的子图,V为子图的点集合,也就是函数元素的集合;E为子图上边的集合,也就是元素间调用关系的集合,Sim(Q,vi)为代码元素与输入的关键字之间的文本相似度,∣E∣为子图中边的总长度,ρ为人工设置的参数,用来调节子图的大小对评价值的限制作用。
2.根据权利要求1所述的基于子图搜索的特征定位方法,其特点在于,步骤(5)中所述基于贪心算法的图扩展算法,是随机选取文本相似度最高的一个候选元素作为初始子图,然后逐步扩展子图,每次将新的候选元素连入子图,以使子图评价值得到最大提升;直到找不到任何使子图评价值提升的候选元素,或是子图中候选元素超过上限。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610254292.0A CN105930162B (zh) | 2016-04-24 | 2016-04-24 | 一种基于子图搜索的特征定位方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610254292.0A CN105930162B (zh) | 2016-04-24 | 2016-04-24 | 一种基于子图搜索的特征定位方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105930162A CN105930162A (zh) | 2016-09-07 |
CN105930162B true CN105930162B (zh) | 2019-05-03 |
Family
ID=56838732
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610254292.0A Active CN105930162B (zh) | 2016-04-24 | 2016-04-24 | 一种基于子图搜索的特征定位方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105930162B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110297639B (zh) * | 2019-07-01 | 2023-03-21 | 北京百度网讯科技有限公司 | 用于检测代码的方法和装置 |
CN114327375A (zh) * | 2021-12-27 | 2022-04-12 | 上海甄云信息科技有限公司 | 一种检测java代码依赖关系的方法、工具以及计算机设备 |
CN114356301A (zh) * | 2022-01-13 | 2022-04-15 | 浙江大学 | 基于Eclipse插件的编程任务上下文自动构建方法及系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102508767A (zh) * | 2011-09-30 | 2012-06-20 | 东南大学 | 一种基于形式概念分析的软件维护方法 |
EP2650780A2 (en) * | 2012-04-09 | 2013-10-16 | Accenture Global Services Limited | Component discovery from source code |
CN103744788A (zh) * | 2014-01-22 | 2014-04-23 | 扬州大学 | 基于多源软件数据分析的特征定位方法 |
-
2016
- 2016-04-24 CN CN201610254292.0A patent/CN105930162B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102508767A (zh) * | 2011-09-30 | 2012-06-20 | 东南大学 | 一种基于形式概念分析的软件维护方法 |
EP2650780A2 (en) * | 2012-04-09 | 2013-10-16 | Accenture Global Services Limited | Component discovery from source code |
CN103744788A (zh) * | 2014-01-22 | 2014-04-23 | 扬州大学 | 基于多源软件数据分析的特征定位方法 |
Non-Patent Citations (2)
Title |
---|
"Improving feature location using structural similarity and iterative graph mapping";Peng,Xin et al;《Journal of Systems and Software》;20130331;第664-676页 * |
"一种基于调用链分析的特征定位方法";付焜 等;《计算机科学》;20141105;第41卷(第11期);第36-39页 * |
Also Published As
Publication number | Publication date |
---|---|
CN105930162A (zh) | 2016-09-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11886494B2 (en) | Utilizing natural language processing automatically select objects in images | |
CN104572072B (zh) | 一种对基于mvc模式的程序的语言转换方法与设备 | |
CN106156082B (zh) | 一种本体对齐方法及装置 | |
CN102646103B (zh) | 检索词的聚类方法和装置 | |
CN110147544B (zh) | 一种基于自然语言的指令生成方法、装置以及相关设备 | |
CN108052394A (zh) | 基于sql语句运行时间的资源分配的方法及计算机设备 | |
CN110502227A (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN111949306B (zh) | 一种支持开源项目碎片化学习的推送方法和系统 | |
CN105930162B (zh) | 一种基于子图搜索的特征定位方法 | |
CN103425672A (zh) | 一种数据库索引的建立方法及装置 | |
CN106484892A (zh) | 数据操作方法及装置 | |
CN107239549A (zh) | 数据库术语检索的方法、装置及终端 | |
CN102968431B (zh) | 一种基于依存树的中文实体关系挖掘的控制装置 | |
EP3299968A1 (en) | Big data calculation method and system | |
CN106569947A (zh) | 一种从单元测试代码中提取api使用示例的方法与工具 | |
CN111078094A (zh) | 分布式机器学习可视化装置 | |
CN103678513B (zh) | 一种交互式的检索式生成方法及系统 | |
Asaduzzaman et al. | Context-sensitive code completion tool for better api usability | |
CN116776895A (zh) | 一种面向api推荐的知识引导大型语言模型查询澄清方法及系统 | |
CN106547765B (zh) | 基于sql的数据库管理方法及装置 | |
CN112199115A (zh) | 基于特征相似度匹配的跨Java字节码和源代码行关联方法 | |
CN115827715A (zh) | 基于用户行为和设计层次树的搜索推荐列表生成系统 | |
CN107992324A (zh) | 一种基于约束求解的代码搜索方法 | |
CN105930442A (zh) | 一种基于统计计算的网站搜索引擎优化方法及系统 | |
CN110309214A (zh) | 一种指令执行方法及其设备、存储介质、服务器 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |