首页 / 专利库 / 电信 / 节点 / 基于单个样例的代码转换推导方法和装置

基于单个样例的代码转换推导方法和装置

阅读:741发布:2024-01-23

专利汇可以提供基于单个样例的代码转换推导方法和装置专利检索,专利查询,专利分析的服务。并且本 发明 涉及一种基于单个样例的代码转换推导方法和装置。该方法包括:基于 修改 前和修改后的样例代码 片段 ,提取代码超图;基于修改前和修改后的样例代码片段,提取代码修改的操作序列;依据代码修改的操作序列,并通过统计分析开源项目代码中的属性 频率 ,对代码超图进行化简,由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板;给定待修改的代码片段并提取其代码超图,然后通过与代码转换模板进行匹配得到修改后的代码片段。本发明可以仅通过一个代码修改的例子来推导出、提取出一般化的代码转换,有效避免了必须依赖于使用大量的相关代码修改来进行推导,可以更有效地推导出合理的代码转换,适用于多种应用场景。,下面是基于单个样例的代码转换推导方法和装置专利的具体信息内容。

1.一种基于单个样例的代码转换推导方法,其特征在于,包括以下步骤:
基于修改前和修改后的样例代码片段,提取代码超图;
基于修改前和修改后的样例代码片段,提取代码修改的操作序列;
依据代码修改的操作序列,并通过统计分析开源项目代码中的属性频率,对代码超图进行化简,由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板;
给定待修改的代码片段并提取其代码超图,然后通过与代码转换模板进行匹配得到修改后的代码片段。
2.根据权利要求1所述的方法,其特征在于,所述提取代码超图,包括:
以函数为单位,通过解析代码的抽象语法树结构来获取代码元素;
对获取的代码元素的不同属性进行赋值,同时构建不同代码元素之间的关系;
基于类型分析来获取代码中表达式和参数的类型,对代码元素的属性进行扩充和细化;
基于过程内流非敏感的define-use静态分析来提取数据依赖关系,对代码元素之间的关系进行补充和细化;
根据提取的代码元素以及代码元素之间的关系,构成代码超图;对修改前和修改后的样例代码片段分别得到代码超图。
3.根据权利要求1或2所述的方法,其特征在于,所述代码超图是一个二元组,其中E是代码元素的集合,R是超边的集合;每条超边为一个二元组,其中rname代表关系名称,r是关系集合, 其中E^k表示集合E的k元笛卡尔积;
所述代码元素定义为一个二元组,其中id为元素的标号,attrs为属性的集合;每个属性为一个二元组,其中name表示属性名,value表示该属性的值。
4.根据权利要求3所述的方法,其特征在于,采用以下方式定义元素匹配和超图匹配:
元素匹配:代码元素能够匹配代码元素,当且仅当对于任意∈attrs有∈attrs’;
超图匹配:代码超图能够匹配代码超图,当且仅当存在一个映射Match:
E->E’,对于任意e∈E,e能够匹配e’=match(e)且对于任意∈R存在∈R’满足rname=rname’且 其中,match(e)表示e在映射Match中对应的象。
5.根据权利要求1所述的方法,其特征在于,所述提取代码修改的操作序列,包括:
将修改前和修改后的样例代码片段解析成抽象语法树的表示形式;
根据树的自顶向下方向比较两个语法树的对应节点,采用贪心的方式记录所有可能的匹配节点对;
根据树的自底向上的方向再次比较两个语法树的对应节点,同样采用贪心的方式记录所有的匹配节点对;
处理匹配结果中的冲突匹配,使得同一颗语法树中的不同节点要满足正确的结构关系。
6.根据权利要求1所述的方法,其特征在于,所述对代码超图进行化简,包括:根据统计的开源项目源代码中对应的属性频率,以及人工指定的属性频率阈值,决定每个代码元素和属性的保留和删除。
7.根据权利要求6所述的方法,其特征在于,如果一个代码元素的所有属性都被删除,则在代码超图中将该代码元素删除,否则保留该代码元素。
8.根据权利要求1所述的方法,其特征在于,所述与代码转换模板进行匹配,包括:
给定一个代码转换模板pattern=,以及一个待修改的代码片段;其中H是代码超图,seqM是代码修改的操作序列;
提取待修改的代码片段的代码超图M,如果代码超图H成功匹配代码超图M,则将代码转换模板pattern中的代码修改的操作序列seqM应用在代码超图M上,从而得到修改之后的目标超图M’。
9.一种基于单个样例的代码转换推导装置,其特征在于,包括:
代码超图提取模,负责基于修改前和修改后的样例代码片段,提取代码超图;
操作序列提取模块,负责基于修改前和修改后的样例代码片段,提取代码修改的操作序列;
代码转换模板生成模块,负责依据代码修改的操作序列,并通过统计分析开源项目代码中的属性频率,对代码超图进行化简,由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板;
匹配模块,给定待修改的代码片段并提取其代码超图,然后通过与代码转换模板进行匹配得到修改后的代码片段。
10.一种计算机,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行权利要求1-8中任一权利要求所述方法的指令。

说明书全文

基于单个样例的代码转换推导方法和装置

技术领域

[0001] 本发明属于计算机科学技术中的软件工程领域,具体涉及一种基于单个样例的代码转换推导方法和装置。

背景技术

[0002] 软件开发中重复修改较常发生,从已有修改中推导出代码转换可以帮助开发者自动化实现这些代码修改,具体场景有系统性修改、对重复出现的程序缺陷的修复、API适配、代码迁移、代码重构等等。
[0003] 所属技术领域内的现有工作中,一种典型的方法是从多个修改例子中进行学习来抽象出修改的模式,另一种方法是人工预先定义规则来对修改进行固定的抽象。
[0004] 所属技术领域内的现有工作中,一方面,对于依赖于使用大量的相关代码修改来推导代码转换的方法,如Gensis(F.Long,P.Amidon,and M.Rinard,“Automatic inference of code transforms for patch generation,”in ESEC/FSE,2017,pp.727–739.),其特点为需要大量相同类型的修改去产生代码转换的模板,但这在现实场景中并不一定适用,尤其是对于一些项目特定的代码修改,往往已有的修改例子数量非常少。另一方面,对于人工预先定义抽象规则的方法,如SYDIT(N.Meng,M.Kim,and K.S.McKinley,“Systematic editing:Generating program transformations from an example,”in Proceedings of the 32Nd ACM  SIGPLAN Conference on Programming  Language Design and Implementation,ser.PLDI’11.ACM,2011,pp.329–342.),由于其抽象依赖于固定的规则,往往对于复杂多变的情况不能得到期望的正确修改。

发明内容

[0005] 本发明针对上述问题,提供一种基于单个样例的代码转换推导方法和装置,能够从单一的代码修改例子中推导出、提取出一般化的代码转换。
[0006] 本发明采用的技术方案如下:
[0007] 一种基于单个样例的代码转换推导方法,包括以下步骤:
[0008] 基于修改前和修改后的样例代码片段,提取代码超图;
[0009] 基于修改前和修改后的样例代码片段,提取代码修改的操作序列;
[0010] 依据代码修改的操作序列,并通过统计分析开源项目代码中的属性频率,对代码超图进行化简,由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板;
[0011] 给定待修改的代码片段并提取其代码超图,然后通过与代码转换模板进行匹配得到修改后的代码片段。
[0012] 进一步地,所述提取代码超图,包括:
[0013] 以函数为单位,通过解析代码的抽象语法树结构来获取代码元素;
[0014] 对获取的代码元素的不同属性进行赋值,同时构建不同代码元素之间的关系;
[0015] 基于类型分析来获取代码中表达式和参数的类型,对代码元素的属性进行扩充和细化;
[0016] 基于过程内流非敏感的define-use静态分析来提取数据依赖关系,对代码元素之间的关系进行补充和细化;
[0017] 根据提取的代码元素以及代码元素之间的关系,构成代码超图;对修改前和修改后的样例代码片段分别得到代码超图。
[0018] 进一步地,所述代码超图是一个二元组,其中E是代码元素的集合,R是超边的集合;每条超边为一个二元组,其中rname代表关系名称,r是关系集合,其中E^k表示集合E的k元笛卡尔积;
[0019] 所述代码元素定义为一个二元组,其中id为元素的标号,attrs为属性的集合;每个属性为一个二元组,其中name表示属性名,value表示该属性的值。
[0020] 进一步地,采用以下方式定义元素匹配和超图匹配:
[0021] 元素匹配:代码元素能够匹配代码元素,当且仅当对于任意∈attrs有∈attrs’;
[0022] 超图匹配:代码超图能够匹配代码超图,当且仅当存在一个映射Match:E->E’,对于任意e∈E,e能够匹配e’=match(e)且对于任意∈R存在∈R’满足rname=rname’且 其中,match(e)表示e在映射Match中对应的象。
[0023] 进一步地,所述提取代码修改的操作序列,包括:
[0024] 将修改前和修改后的样例代码片段解析成抽象语法树的表示形式;
[0025] 根据树的自顶向下方向比较两个语法树的对应节点,采用贪心的方式记录所有可能的匹配节点对;
[0026] 根据树的自底向上的方向再次比较两个语法树的对应节点,同样采用贪心的方式记录所有的匹配节点对;
[0027] 处理匹配结果中的冲突匹配,使得同一颗语法树中的不同节点要满足正确的结构关系。
[0028] 进一步地,所述对代码超图进行化简,包括:根据统计的开源项目源代码中对应的属性频率,以及人工指定的属性频率阈值,决定每个代码元素和属性的保留和删除。
[0029] 进一步地,如果一个代码元素的所有属性都被删除,则在代码超图中将该代码元素删除,否则保留该代码元素。
[0030] 进一步地,所述与代码转换模板进行匹配,包括:
[0031] 给定一个代码转换模板pattern=,以及一个待修改的代码片段;其中H是代码超图,seqM是代码修改的操作序列;
[0032] 提取待修改的代码片段的代码超图M,如果代码超图H成功匹配代码超图M,则将代码转换模板pattern中的代码修改的操作序列seqM应用在代码超图M上,从而得到修改之后的目标超图M’。
[0033] 一种基于单个样例的代码转换推导装置,其包括:
[0034] 代码超图提取模,负责基于修改前和修改后的样例代码片段,提取代码超图;
[0035] 操作序列提取模块,负责基于修改前和修改后的样例代码片段,提取代码修改的操作序列;
[0036] 代码转换模板生成模块,负责依据代码修改的操作序列,并通过统计分析开源项目代码中的属性频率,对代码超图进行化简,由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板;
[0037] 匹配模块,给定待修改的代码片段并提取其代码超图,然后通过与代码转换模板进行匹配得到修改后的代码片段。
[0038] 一种计算机,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明的基于单个样例的代码转换推导方法的指令。
[0039] 本发明的关键改进点是:
[0040] 1、通过单一的代码修改例子来进行一般化的代码转换的推导;
[0041] 2、利用海量代码的统计信息来指导推导过程;
[0042] 3、该技术具有一定的通用性,适用于多个应用场景:如系统性编辑、程序缺陷修复等。
[0043] 对比现有技术,本发明的有益效果如下:
[0044] 本发明提出的技术可以仅通过一个代码修改的例子来推导出、提取出一般化的代码转换,有效避免了必须依赖于使用大量的相关代码修改来进行推导。同时,本发明利用海量代码的统计信息来指导推导,基于代码上下文和对已有的海量代码的统计信息来定义选取的规则,可以更有效地推导出合理的代码转换。并且,该技术具有一定的通用性,适用于多个应用场景:如系统性编辑、代码缺陷修复。附图说明
[0045] 图1是本发明方法的步骤流程图
[0046] 图2是修改前后样例代码片段的一个例子。
[0047] 图3对应于图2的例子的代码转换模板示意图。
[0048] 图4是采用图3的代码转换模板进行匹配的示意图。

具体实施方式

[0049] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步详细说明。显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0050] 首先给出如下若干定义:
[0051] 定义1代码元素(Code Element)
[0052] 代码元素定义为一个二元组,其中id为元素的标号,attrs为一个属性的集合。每个属性为一个二元组,name表示属性名,value表示该属性的值。
[0053] 举例来说,属性可以是<“变量”(Variable),12345>、<“程序语句”(Statement)“,a+b”>等等。
[0054] 定义2代码超图(Code Hypergraph)
[0055] 代码超图是一个二元组,其中E是一个代码元素的集合,R是一个超边(hyperedge)的集合。每条超边为一个二元组,其中rname代表关系名称,r是一个关系集合, 其中E^k表示集合E的k元笛卡尔积。
[0056] 其中,“关系”主要包含了以下三种:在抽象语法树中的父子关系、祖先关系(父子关系的传递闭包)、过程内数据依赖。其中“过程”是本领域公知的概念。
[0057] 定义3元素匹配
[0058] 代码元素能够匹配代码元素,当且仅当对于任意∈attrs有∈attrs’。
[0059] 定义4超图匹配
[0060] 代码超图能够匹配代码超图,当且仅当存在一个映射Match:E->E’,对于任意e∈E,e能够匹配e’=match(e)且对于任意∈R存在∈R’满足rname=rname’且 其中,match(e)表示e在映射Match中对应的象。
[0061] 定义5代码转换模板
[0062] 代码转换模板是一个二元组。这里g是一个代码超图。seqM是一个代码修改的操作序列,即对于任意m∈seqM,id∈preIDs(m)且attrName∈preAttrs(m,id),存在g中一个元素满足id=id’且attrs’包含attrName。其中,preIDs(m)表示操作m中修改前的id集合,preAttrs(m,id)表示操作m中修改前的属性名称集合。
[0063] 定义6代码转换模板应用
[0064] 给定一个代码超图g’=,一个代码转换模板和一个从g到g’的匹配M,应用代码转换模板可得到一个修改序列seqM[id0\id0’,…,idn\idn’],其中,..,∈M。换句话说,在原始修改序列中的元素idn被替换成了对应匹配的元素idn’。然后就可以应用替换后的修改序列来得到修改后的代码。其中,id0\id0’表示将id0替换为id0’,而表示idn、idn’这两个在匹配M中是一个匹配对
[0065] 基于修改前后的样例代码片段,本发明通过以下步骤来实现代码转换(如图1所示):
[0066] 1)基于修改前后的样例代码片段,提取代码超图;
[0067] 2)基于修改前后的样例代码片段,提取代码修改的操作序列;
[0068] 3)推导代码转换模板:依据步骤2)得到的代码修改的操作序列以及通过统计分析大量开源项目代码中的代码的属性频率,决定步骤1)中得到的代码超图中的每一个代码元素是否保留,即进行代码超图的化简。最后由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板。
[0069] 4)给定一个新的待修改的代码片段,提取其代码超图,然后匹配并应用代码转换模板来得到应用代码转换模板后的代码片段。
[0070] 以下对于每个步骤进行详细展开说明:
[0071] 步骤1:
[0072] 本步骤提取修改前后代码的如下信息来构造代码片段的超图:
[0073] 1、以函数为单位,通过解析代码的抽象语法树结构来获取代码元素,比如变量或者函数调用等。
[0074] 2、在上一步的基础之上,对所获取的代码元素的不同属性进行赋值(比如节点的类型、节点的存储内容等),同时构建不同节点之间的关系(比如父子关系或者祖先关系等)。其中节点即是指代码元素。
[0075] 3、基于类型分析来获取代码中表达式和参数的类型,对代码元素的属性进行扩充和细化。其中“类型分析”指的是程序中的元素的数值类型进行分析,比如一个变量是“数值类型”或者是一个“字符串类型”等。
[0076] 4、基于过程内流非敏感的define-use静态分析来提取数据依赖关系,对代码元素之间的关系进行补充和细化。其中“过程内的流非敏感define-use静态分析”为本领域公知的方法。
[0077] 根据提取的上述信息(代码元素以及代码元素之间的关系),构成代码超图。针对修改前后的代码,分别执行上述的操作,可以分别得到修改前后代码片段的超图表示形式。
[0078] 步骤2:
[0079] 使用GumTree算法(Jean-Rémy Falleri,Floréal Morandat,Xavier Blanc,Matias Martinez,and Martin Monperrus.2014.Fine-grained and accurate source code differencing.In Proceedings of the 29th ACM/IEEE international conference on Automated software engineering(ASE′14).ACM,New York,NY,USA,313-324.)来提取代码修改的操作序列。其主要的步骤包含以下4步:
[0080] (1)给定两个代码片段(即修改前和修改后的样例代码片段),首先将其解析成抽象语法树的表示形式。
[0081] (2)根据树的自顶向下方向比较两个语法树的对应节点,采用贪心的方式记录所有可能的匹配节点对。
[0082] (3)根据树的自底向上的方向再次比较两个语法树的对应节点,同样采用贪心的算法记录所有的匹配节点对。
[0083] (4)处理上面的匹配结果中的冲突匹配。根据上面的匹配过程可知,一个节点可能会匹配到一个节点的集合,此步的目标是使得每个节点最多只有一个匹配的节点。该过程主要遵循的约束是满足同一颗语法树中的不同节点要满足正确的结构关系,即在语法树A中的父子节点a和b,其匹配的节点a’和b’也需要满足对应的父子关系(注意,此处的父子关系可以是祖先关系)。
[0084] 步骤3:
[0085] 元素的选取和属性的选取,从数据代码仓库中统计不同的元素和属性在其中的分布情况,然后根据人工指定的属性频率阈值来决定每个代码元素和属性的保留和删除。具体操作是,搜集大量的开源项目源代码,对其源代码采用步骤一的分析方法来抽取代码超图。然后统计这些开元项目代码中对应的属性的频率信息,比如在开源项目中变量名称为’a’的属性。然后根据该属性出现的频率以及人工设定的阈值决定是否保留。只有当其频率大于给定的阈值时,对应的属性被保留,否则删除。在本实施例中,选取了如下频率:频率=包含该元素或属性的文件数/总文件数,并设置阈值为0.005。
[0086] 根据以上的方法,给定一个代码超图,对其中的每一个代码元素的属性考虑其是否被保留和删除,如果一个代码元素的所有属性都被删除,那么在代码超图中,该代码元素将被删除,否则代码元素会被保留。最后所有与被保留元素相关的“关系”被保留,而涉及代码元素不在代码超图中的“关系”会被删除。
[0087] 最终剩下的元素、属性和元素之间的关系构成一个超图H,加上代码修改的操作序列seqM,这两部分就组成了对应的代码转换模板
[0088] 步骤4:
[0089] 该步为代码转换模板的匹配过程,当给定一个代码转换模板pattern=,以及一个代码片段,首先是根据步骤1可以提取代码片段的超图M(注意此处的超图保留所有的代码元素、属性和关系)。该代码片段可以应用给定的代码转换模板当且仅当超图H匹配超图M(见定义4超图匹配)。如果超图H成功匹配超图M,则根据定义6,可以将代码转换模板pattern中的修改seqM应用在超图M上从而得到修改之后的目标超图M’。
[0090] 下面提供一个具体应用实例:
[0091] 修改前后的样例代码片段如图2所示。其中,上半部分(67-70行)是一个代码修改示意图,其中以“+”起始的行是新增加的代码,以“-”起始的行是需要删除的代码。同样的,下半部分(34-35行)是另外的一个代码修改示意图,使用的修改操作和上半部分代码的修改是一致的,目标是根据上半部分的代码可以提取一个代码修改操作,然后将该操作自动的适配到下面的代码上,使得其实现相同的修改。
[0092] 本发明具体应用于该例子如图3、图4所示。在匹配两个代码超图时,如果只考虑元素属性,可以得到如下映射match(p1)∈{n1},match{p2}∈{n2},match{p3}∈{n3},match{p4}∈{n4},match(p5)∈{n2,n3,…,n7}(其中p和n代表节点的id)。再进一步考虑元素之间的关系,会过滤掉对于p5来说的额外元素,得到一个合法的匹配:match(p1)∈{n1},match{p2}∈{n2},match{p3}∈{n3},match{p4}∈{n4},match(p5)∈{n5}。基于该匹配可以得到如下代码修改的操作序列:delete(n2,n4)。图3、图4中符号“⊥”表示该属性对该节点不适用,即不存在该属性。
[0093] 实验选取了两个场景将本发明和已有方法进行了对比。
[0094] 在系统性修改的场景中,使用了SYDIT数据集(Na Meng,Miryung Kim,and Kathryn S.McKinley.2011.Systematic editing:generating program transformations from an example.In Proceedings of the 32nd ACM SIGPLAN Conference on Programming Language Design and Implementation(PLDI′11).ACM,New York,NY,USA,329-342)和C3数据集(Patrick Kreutzer,Georg Dotzler,Matthias Ring,Bjoern M.Eskofier,and Michael Philippsen.2016.Automatic clustering of code changes.In Proceedings of the 13th International Conference on Mining Software Repositories(MSR′16).ACM,New York,NY,USA,61-72.)进行实验。表1的对比实验效果显示,本发明提出的方法的效果显著优于SYDIT。
[0095] 表1.本发明和SYDIT在系统性修改场景下的对比实验
[0096]
[0097] 其中,括号中的百分比指的是与“总程序对数”的比例。x/y表示x个语法等价和y个语义等价,比如-/40等,其中“-”表示不适用该项。对于C3数据集中的数据,为了清晰,只保留了y而省略了x。
[0098] 在程序缺陷修复的场景中,本发明提出的方法在程序缺陷修复公开数据集Defects4J(R.Just,D.Jalali,and M.D.Ernst“, Defects4j:A database of existing faults to enable controlled testing studies for java programs,”in ISSTA,2014,pp.437–440.)上成功修复了17个程序缺陷,且其中有4个是现有所有技术都未能修复的。
[0099] 基于同一发明构思,本发明的另一个实施例提供一种基于单个样例的代码转换推导装置,其包括:
[0100] 代码超图提取模块,负责基于修改前和修改后的样例代码片段,提取代码超图;
[0101] 操作序列提取模块,负责基于修改前和修改后的样例代码片段,提取代码修改的操作序列;
[0102] 代码转换模板生成模块,负责依据代码修改的操作序列,并通过统计分析开源项目代码中的属性频率,对代码超图进行化简,由化简之后的代码超图和代码修改的操作序列共同组成代码转换模板;
[0103] 匹配模块,给定待修改的代码片段并提取其代码超图,然后通过与代码转换模板进行匹配得到修改后的代码片段。
[0104] 基于同一发明构思,本发明的另一个实施例提供一种计算机/服务器,其包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行本发明方法中各步骤的指令。
[0105] 基于同一发明构思,本发明的另一个实施例提供一种计算机可读存储介质(如ROM/RAM、磁盘、光盘),所述计算机可读存储介质存储计算机程序,所述计算机程序被计算机执行时,实现本发明方法的各个步骤。
[0106] 以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的原理和范围,本发明的保护范围应以权利要求书所述为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈