代码更改的自动识别的制作方法

文档序号:28207170发布日期:2021-12-28 19:03阅读:190来源:国知局
代码更改的自动识别的制作方法
代码更改的自动识别


背景技术:

1.软件系统建立在源代码“库(base)”之上,其通常依赖和/或结合许多独立的软件技术,诸如编程语言(例如java、python、c++)、框架、共享库、运行时环境等。每种软件技术可能以其自己的速度发展,并且可能包括其自己的分支和/或版本。每种软件技术还可能依赖于各种其他技术。因此,大型软件系统的源代码库可以用复杂的依赖图来表示。
2.使软件技术保持最新是有好处的。较新的版本可以包含修复安全漏洞和/或错误的关键改进,以及包含新特征。不幸的是,有时保持这些软件技术新近所需的资源量可能非常大,尤其是作为特定软件系统代码库的一部分。因此,许多软件系统没有尽可能频繁地更新。过时的软件技术可能导致无数问题,诸如错误、安全漏洞、缺乏持续支持等。


技术实现要素:

3.文描述了用于基于先前对其他相似遗留代码库做出的更新来自动识别、推荐和/或自动实现对遗留源代码库的更改的技术。直观上,可以分析复杂软件系统代码库的多个先前“迁移”或大量更新以识别所做出的更改。在一些实施方式中,可以使用机器学习和潜在空间嵌入来保存这些更改的知识。当要更新与先前更新的代码库中的一个或多个相似的新软件系统代码库时,可以使用机器学习和先前提到的潜在空间嵌入来识别这些先前实施的更改。一旦被识别,这些更改就可以被自动识别、推荐和/或实现。通过自动识别、推荐和/或实现这些更改,可以减少或甚至消除手动更改大量源代码片段以正确反映对依赖图上相关软件技术的更改的时间和费用。
4.在一些实施方式中,可以训练一个或多个机器学习模型,诸如图神经网络(“gnn”)或序列到序列模型(例如,编码器

解码器网络等),以基于源代码片段生成嵌入。这些嵌入可以捕获源代码片段的语义和/或语法属性,以及部署这些片段的上下文。在某些实施方式中,这些嵌入可以采用“参考”嵌入的形式,“参考”嵌入表示在源代码库的先前迁移期间对源代码片段所做出的先前更改。换句话说,这些参考嵌入将先前的代码库更改映射或投射到潜在空间。然后,可以使用这些参考嵌入来识别用于新的源代码库的新迁移的更改候选。
5.作为可以如何训练以本公开的选择的方面配置的机器学习模型的非限制性示例,在一些实施方式中,可以使用第一版本源代码片段(例如,版本1.1.1)来生成诸如抽象语法树(“ast”)的数据结构。ast可以表示出现在第一版本源代码片段中的结构,诸如变量、对象、函数等,以及这些分量之间的语法关系。可以针对第二版本源代码片段(例如,1.1.2)生成另一ast,第二版本源代码片段可以是第一版本源代码片段的下一版本或“迭代”。然后,这两个ast可以用于生成一个或多个数据结构,诸如一个或多个更改图,其表示将源代码片段从第一版本更新到第二版本而做出的一个或多个更改。在一些实施方式中,可以针对在源代码片段从第一版本到第二版本的演变期间对源代码片段的每个更改生成一个更改图。
6.一旦创建了(一个或多个)更改图,它们就可以用作用于训练机器学习模型的训练示例。在一些实施方式中,可以使用机器学习(例如,gnn或序列到序列)模型处理(一个或多个)更改图以生成对应的参考嵌入。在一些实施方式中,(一个或多个)更改图可以用诸如更
改类型的信息来标记,该信息用于将更改映射到潜在空间中的相应区域。例如,标签“更改变量名称”可以应用于一个更改,另一标签“更改api签名”可以应用于另一更改,以此类推。
7.随着在机器学习模型上输入更多更改图,这些标签可以用作确定可比较更改是否在潜在空间中正确地聚类在一起的损失函数的一部分。如果从特定更改类型(例如,“更改变量名称”)的更改生成的嵌入与相同更改类型的其他嵌入不够接近(例如,更接近其他更改类型的嵌入),则可以例如使用诸如梯度下降和反向传播的技术来训练机器学习模型。这个训练过程可以在大量训练示例上重复,直到机器学习模型能够准确地将更改图,并且更一般地,表示源代码片段的数据结构,映射到潜在空间中接近其他语法/语义上相似的数据结构的区域为止。
8.一旦机器学习模型被训练,它就可以在待更新的软件系统代码库的更新期间使用,以识别并且在一些情况下自动实现代码库中的各种源代码片段的更改。在一些实施方式中,与待更新的代码库的第一版本代码片段关联的数据可以被应用作为经训练机器学习模型上的输入以生成嵌入。如在训练期间一样,与第一版本源代码片段关联的数据可以是诸如ast的数据结构。然而,与在训练期间不同,第一版本源代码片段尚未被更新到下一版本。因此,没有第二版本源代码片段,并且没有更改图。
9.尽管如此,当使用机器学习(例如,gnn或序列到序列)模型处理从第一版本源代码片段生成的ast或其他数据结构时,后续源代码嵌入可以接近于潜在空间中的(一个或多个)参考嵌入,其表示在先前代码库迁移期间对相似(或甚至相同)源代码片段所做出的(一个或多个)更改。换句话说,第一版本源代码片段被映射到潜在空间,以识别过去在相似情况下对相似源代码所做出的更改。然后可以推荐和/或自动实现这些(一个或多个)更改,以便将第一版本源代码片段更新为第二版本源代码片段。
10.在一些实施方式中,潜在空间中源代码嵌入和表示(一个或多个)过去源代码更改的(一个或多个)参考嵌入之间的距离可以用于确定如何继续,例如,是否推荐更改、自动实现更改,或者甚至是否不推荐更改。潜在空间中的这些空间关系(其可以与相似性对应)可以通过各种方式确定,诸如使用点积、余弦相似性等。作为示例,如果参考嵌入在源代码嵌入的潜在空间中的第一半径内,则由该嵌入表示的更改可以自动实现,例如无需用户确认。如果参考嵌入在源代码嵌入的第一半径之外但在源代码嵌入的第二半径内,则可以向用户推荐由该嵌入表示的更改,但可能需要用户确认,以此类推。在一些实施方式中,可以基于候选更改距源代码嵌入的距离将分数分配给候选更改,并且可以将该分数呈现给用户,例如,作为百分比匹配或置信度分数,其帮助用户确定是否应当实现更改。
11.在源代码嵌入相似地接近多个参考嵌入的一些实施方式中,由多个嵌入表示的更改可以作为候选更改呈现给用户(例如,软件工程师)。在多个更改彼此不冲突的一些情况下,可以简单地自动实施多个更改。
12.虽然前面提到了将更改类型作为训练数据的潜在标签,但这并不意味着是限制性的。除了更改类型之外或代替更改类型,可以将指示其他特性的标签分配给训练示例。例如,在一些实施方式中,除了更改类型之外或代替更改类型,更改图(或表示源代码版本之间更改的其他数据结构)可以被标记为“好”更改、“坏”更改、“不必要”更改、“重复”更改、匹配或不匹配优选编解码风格等。这些标签可以除了更改类型或其他类型标签之外或替代更改类型或其他类型标签用于进一步映射潜在空间。稍后,当新的源代码嵌入被生成并被发
现接近标记为“坏”的参考嵌入时,可以不实施或推荐由参考嵌入表示的更改。
13.在一些实施方式中,提供了一种由一个或多个处理器执行的方法,该方法包括:应用与第一版本源代码片段关联的数据作为在一个或多个机器学习模型上的输入以生成潜在空间中的新源代码嵌入;基于潜在空间中一个或多个参考嵌入和新源代码嵌入之间的一个或多个距离来识别潜在空间中的一个或多个参考嵌入,其中,一个或多个参考嵌入中的每一个通过应用指示对参考第一版本源代码片段做出以产生参考第二版本源代码片段的更改的数据,作为在机器学习模型中的一个或多个上的输入而生成;并且基于识别的一个或多个参考嵌入,识别要对第一版本源代码片段做出以创建第二版本源代码片段的一个或多个更改。
14.在各种实施方式中,与第一版本源代码片段关联的数据包括从第一版本源代码片段生成的抽象语法树(“ast”)。在各种实施方式中,机器学习模型中的一个或多个包括图神经网络(“括图神经)。在各种实施方式中,基于与一个或多个参考嵌入关联的一个或多个查找表来识别一个或多个更改。
15.在各种实施方式中,该方法还包括生成要在一个或多个计算设备上呈现的输出,其中,该输出在被呈现时推荐针对第一版本源代码片段考虑一个或多个更改。在各种实施方式中,该方法还包括在第一版本源代码片段中自动实现一个或多个更改。在各种实施方式中,第一版本源代码片段包括源代码文件。
16.在另一方面,一种使用一个或多个处理器实现的方法可以包括:获得指示第一版本源代码片段和第二版本源代码片段之间的更改的数据;用更改类型标记指示更改的数据;应用指示更改的数据作为在机器学习模型上的输入,以在潜在空间中生成新嵌入;确定潜在空间中新嵌入和潜在空间中与相同更改类型关联的先前嵌入之间的距离;和至少部分地基于距离来训练机器学习模型。
17.此外,一些实施方式包括一个或多个计算设备的一个或多个处理器,其中,该一个或多个处理器可操作以执行存储在关联的存储器中的指令,并且其中,该指令被配置为引起任何前述方法的执行。一些实施方式还包括一个或多个非暂时性计算机可读存储介质,其存储一个或多个处理器可执行以执行任何前述方法的计算机指令。
18.应当理解,上述构思和本文更详细地描述的附加构思的所有组合都被设想为本文公开的主题的一部分。例如,出现在本公开末尾的要求保护的主题的所有组合被设想为是本文公开的主题的一部分。
附图说明
19.图1示意性地描绘了根据各种实施方式的可以在其中实现本公开的选择的方面的示例环境。
20.图2是示例过程流的框图。
21.图3示意性地展示了如何在推断阶段使用本文描述的机器学习模型生成潜在空间嵌入的一个示例。
22.图4示意性地展示了如何在训练阶段使用本文描述的机器学习模型生成潜在空间嵌入的一个示例。
23.图5描绘了示出根据本文公开的实施方式的示例方法的流程图。
24.图6描绘了示出根据本文公开的实施方式的另一示例方法的流程图。
25.图7示出了计算设备的示例架构。
具体实施方式
26.图1示意性地描绘了根据各种实施方式的可以在其中实现本公开的选择的方面的示例环境。图1或附图中其他地方描绘的任何计算设备可以包括逻辑,诸如一个或多个微处理器(例如,中央处理单元或“cpu”,图形处理单元或“gpu”),其执行存储在存储器中的计算机可读指令;或其他类型的逻辑,诸如专用集成电路(“asic”)、现场可编程门阵列(“fpga”)等。图1中描绘的系统中的一些,诸如代码知识系统102,可以使用形成有时被称为“云基础设施”的一个或多个服务器计算设备来实现,尽管这不是必需的。
27.代码知识系统102可以被配置为执行本公开的选择的方面以便帮助一个或多个客户端1101‑
p
更新一个或多个对应的遗留代码库1121‑
p
。每个客户端110可以是例如实体或组织,诸如企业(例如,金融机构、银行等)、非营利组织、俱乐部、大学、政府机关或操作一个或多个软件系统的任何其他组织。例如,银行可以操作一个或多个软件系统来管理其控制下的货币,包括跟踪存款和取款、跟踪贷款、跟踪投资等。航空公司可以操作一个或多个软件系统来预订/取消/重新预订航班预订、管理航班延误或取消、管理与航班关联的人员(诸如乘客、机组人员和地勤人员)、管理机场机位等。
28.许多这些实体的软件系统可能是任务关键的。即使是最少量的停止时间或故障,对实体以及在某些情况下其客户的安全两者可能是高度破坏性或者甚至灾难性的。此外,给定的遗留代码库112可能相对较大,具有复杂的依赖图。因此,运行软件系统的实体110的部分经常不情愿更新其遗留代码库112。
29.代码知识系统102可以被配置为利用过去代码库更新或“迁移”的知识,以便提高更新实体软件系统底层的遗留代码库的过程的效率。例如,代码知识系统102可以被配置为推荐对各种源代码片段的特定更改作为迁移的一部分。在一些实施方式中,代码知识系统102甚至可以自动地实现源代码更改,例如,如果对提议的源代码更改有足够的置信度。
30.在各种实施方式中,代码知识系统102可以包括机器学习(图1中的“ml”)数据库104,其包括指示一个或多个经训练机器学习模型1061‑
n
的数据。这些经训练机器学习模型1061‑
n
可以采用以下将更详细地描述的各种形式,包括但不限于图神经网络、序列到序列模型(诸如各种风格的循环神经网络(例如,长短期记忆或“lstm”、门循环单元或“gru”等))或编码器

解码器以及可以用于促进本公开的选择的方面的任何其他类型的机器学习模型。
31.在一些实施方式中,代码知识系统102还可以访问一个或多个最新的代码库1081‑
m
。在一些实施方式中,这些最新的代码库1081‑
m
可以用于例如训练机器学习模型1061‑
n
中的一个或多个。在一些这样的实施方式中,并且如下文将进一步详细描述的,最新的代码库1081‑
m
可以与其他数据组合使用以训练机器学习模型1061‑
n
,诸如已被更新以产生最新的代码库1081‑
m
的非最新的代码库(未描绘)。如本文使用的“最新”并不意味着要求代码库中的所有源代码都是绝对最后的版本。而是,“最新”可以指代码库的期望状态,无论该期望状态是最近版本代码库、被认为“稳定”的代码库的最近版本、满足某个其他标准的代码库的最近版本(例如,取决于特定库,满足某个安全协议或标准)等。
32.在各种实施方式中,希望更新其遗留代码库112的客户端110可以建立与托管代码
知识系统102的实体(图1中未描绘)的关系。在一些实施方式中,托管知识系统102然后可以例如通过一个或多个网络114(诸如因特网)获得客户端的遗留源代码库112的全部或部分,并将指示推荐的更改或甚至更新的源代码的数据返回给客户端110。在其他实施方式中,例如,在客户端的被更新的遗留代码库112很大情况下,托管代码知识系统102的实体的一个或多个代表可以前往客户端的(一个或多个)场地以执行更新和/或进行建议。
33.图2是在训练机器学习模型1061‑
n
期间和/或在使用这些模型(“推断”)以预测应当/能够对遗留代码库112做出什么更改期间可以全部或部分地由代码知识系统102实现的(一个或多个)示例过程流的框图。将首先讨论训练,然后是推断。除非另有说明,否则图2中的各种组件可以使用硬件和计算机可读指令的任何组合来实现。
34.从左上部分开始,代码库216可以包括一个或多个类型的一个或多个源代码片段2181‑
q
。例如,在一些情况下,第一源代码片段2181可以用python编写,另一源代码片段2182可以用java编写,另一源代码片段2183可以用c/c++编写,等等。附加地或替代地,要素2181‑
q
中的每一个可以表示来自特定库、实体和/或应用编程接口(“api”)的一个或多个源代码片段。取决于情况,每个源代码片段218可以包括源代码文件的子集或整个源代码文件。例如,特别大的源代码文件可以被分解成较小的片段(例如,划分为函数、对象等),而相对短的源代码文件可以在整个处理过程中保持完整。
35.代码库112的源代码片段2181‑
q
中的至少一些可以被转换成替代形式,诸如图或树形式,以便使它们经受附加处理。例如,在图2中,源代码片段2181‑
q
被处理以生成抽象语法树(“ast”)2221‑
r
。q和r两者可以是正整数,它们彼此可以相等也可以不相等。如前所述,ast可以表示出现在给定源代码片段中的结构,诸如变量、对象、函数等,以及这些分量之间的语法关系。在一些实施方式中,在训练期间,ast 220可以包括针对源代码片段的第一版本(例如,“待更新”版本)的第一ast、针对源代码片段的第二版本(例如,“目标版本”)的另一ast和传达第一源代码片段和第二源代码片段之间的(一个或多个)差异的第三ast。
36.可以使用硬件和机器可读指令的任何组合实现的数据集构建器224可以接收ast 2221‑
r
作为输入并生成可以用于下游处理中的各种目的的各种不同类型的数据作为输出。例如,在图2中,数据集构建器224生成更改图228、ast

ast数据230和更改标签232作为“增量数据(delta data)”226。更改图228——如上所述,其本身可以呈ast的形式——可以包括从一对或多对ast生成的一个或多个更改图,该一对或多对ast从待更新/目标源代码片段的相应对生成。换言之,每个源代码片段218可以被映射到ast 222。成对的ast,对中的一个表示源代码片段的第一版本而另一个表示源代码片段的第二版本,可以被映射到更改图228。因此,每个更改图228表示将源代码片段从第一(待更新)版本更新到第二(目标)版本做出的一个或多个更改。在一些实施方式中,在源代码片段从第一版本到第二版本的演变期间,可以针对对于源代码片段的每个更改生成不同的更改图。
37.更改类型标签232可以包括为了训练目的而分配给更改图228的标签。每个标签可以指定对在所考虑的更改图底层的源代码片段做出的更改的类型。例如,更改图228中的每一个可以用更改类型标签232的相应的更改类型来标记。相应的更改类型可以用于将更改图228传达的更改映射到潜在空间中的相应区域。例如,标签“更改变量名称”可以应用于源代码片段的一个更改,另一标签“更改函数名称”可以应用于另一源代码片段的另一更改,以此类推。
38.ast2vec组件234可以被配置为从增量数据226生成一个或多个特征向量,即“潜在空间”嵌入244。例如,ast2vec组件234可以应用更改图228作为在一个或多个机器学习模型上的输入,以生成相应的潜在空间嵌入244。机器学习模型可以采用如前所述的各种形式,诸如gnn 252、序列到序列模型254(例如,编码器

解码器)等。
39.在训练期间,训练模块250可以训练诸如gnn 252或序列到序列模型254的机器学习模型以直接或间接地基于源代码片段2181‑
q
生成嵌入244。这些嵌入244可以捕获源代码片段2181‑
q
的语义和/或语法属性,以及部署这些片段的上下文。在一些实施方式中,由于在机器学习模型(特别是gnn 252)上输入多个更改图228,所以分配给它们的更改类型标签232可以用作确定可比较的更改是否在潜在空间中正确地聚类在一起的损失函数的一部分。如果从特定更改类型的更改(例如,“更改变量名称”)生成的嵌入与相同更改类型的其他嵌入不够接近(例如,更接近其他更改类型的嵌入),则可以例如使用诸如梯度下降和反向传播的技术来训练gnn 252。这个训练过程可以在许多训练示例上重复,直到gnn 252能够准确地将更改图,并且更一般地,表示源代码片段的数据结构,映射到潜在空间中接近其他语法/语义上相似的数据结构的区域为止。
40.特别是用gnn 252,增量数据226的组成ast,其回想是从源代码片段生成的并且可以包括ast形式的更改图,可以如下地被操作。可以针对ast的每个节点提取特征(其可以被手动选择或在训练期间被学习)以生成每个节点的特征向量。回想一下,ast的节点可以表示变量、对象或其他编程结构。因此,针对节点生成的特征向量的特征可以包括像变量类型(例如,整数、浮点数、字符串、指针等)、名称、作为操作数作用于变量的(一个或多个)运算符等的特征。节点在任何给定时间点的特征向量可以被视为该节点的“状态”。
41.同时,ast的每个边可以被分配机器学习模型,例如特定类型的机器学习模型或在特定数据上训练的特定机器学习模型。例如,表示“if(如果)”语句的边各自可以被分配第一神经网络。表示“else(否则)”语句的边也可以各自被分配第一神经网络。表示条件的边可以各自被分配第二神经网络。以此类推。
42.然后,对于一系列时间步长中的每个时间步长,每个节点的特征向量或状态可以沿着边/机器学习模型传播到它们的邻居节点,例如,作为到潜在空间的投影。在一些实施方式中,在每个时间步长到给定节点的传入节点状态可以被求和(这是顺序不变的),例如,彼此求和和与给定节点的当前状态求和。随着更多时间步长经过,影响ast的给定节点的邻居节点的半径增加。
43.在直观上,随着机器学习模型被迭代越来越多,关于邻居节点的知识被增量地“融入到”每个节点的状态“中”,在给定节点的状态中积累关于越来越远的邻居的更多知识。在一些实施方式中,在执行某个期望数量的迭代之后,可以达到ast的所有节点的“最终”状态。这个迭代的数量可以是gnn 252的超参数。在一些这样的实施方式中,这些最终状态可以被求和以产生ast的整体状态或嵌入(例如,244)。
44.在一些实施方式中,对于更改图228,在使用gnn 252进行处理期间,形成更改的一部分的边和/或节点可以比在底层源代码片段的版本之间保持恒定的其他边/节点更重地被加权。因此,底层源代码片段的版本之间的(一个或多个)更改可能对表示整个更改图228的结果状态或嵌入具有更大的影响。这可以促进潜在空间中从相似更改生成的嵌入的聚类,即使在这些嵌入周围的一些上下文有所不同。
45.对于序列到序列模型254,可以使用隐式标签来实现训练,该隐式标签显现在对底层源代码的更改序列中。可以使用从源代码片段的第一版本到源代码片段的第二版本的整个更改路径进行训练,而不是在源和目标ast上进行训练。例如,可以训练序列到序列模型254以基于源代码元素(例如,标记(token)、运算符等)的序列来预测表示更新的源代码片段的源代码元素的“更新”序列。在一些实施方式中,可以单独地和/或同时地采用gnn 252和序列到序列模型254两者。
46.一旦机器学习模型(例如,252

254)被充分训练,它们就可以在推断阶段被使用以帮助新客户端迁移他们尚未被更新的代码库。再次从左上部分开始,代码库216现在可以表示客户端110的遗留代码库112。与训练期间不同,在推断期间,代码库216可以仅包括待更新的遗留源代码。然而,图2中的许多其他操作与训练中类似地操作。
47.待更新的源代码片段2181‑
q
再次用于生成ast 2221‑
r
。然而,ast 2221‑
r
不是由数据集构建器224处理,它们可以简单地例如由ast2vec组件234应用作为在经训机器学习模型(例如,252、254)中的一个或多个上的输入,以生成潜在空间中的新源代码嵌入244。然后,可以例如由更改列表(“cl”)生成器246基于在潜在空间中一个或多个参考嵌入与新源代码嵌入之间的相应距离来识别潜在空间中的一个或多个参考嵌入。如上所述,一个或多个参考嵌入中的每一个可以先前已经例如,通过训练模块250,通过应用指示对参考第一版本源代码片段做出、以产生参考第二版本源代码片段的更改的数据,作为在机器学习模型(例如,252

254)中的一个或多个上的输入而被生成。
48.基于识别的一个或多个参考嵌入,cl生成器246可以识别要对(一个或多个)待更新的源代码片段做出、以创建(一个或多个)更新的源代码片段的一个或多个更改。这些推荐的代码更改(例如,从待更改的代码生成的、更改的代码)可以在框248处输出。附加地或替代地,在一些实施方式中,如果以足够的置信度度量确定代码更改推荐,则可以在没有来自用户的输入的情况下实现代码更改推荐。在再其他的实施方式中,可以响应于其他事件(诸如一个或多个通过自动代码单元测试)自动实现代码更改推荐。
49.图3展示了可以如何将源代码片段350嵌入在潜在空间352中的一个示例。使用图2的各种未描绘的组件处理源代码片段,source.cc 350,直到其ast到达ast2vec组件234。如前所述,ast2vec组件234在一个或多个机器学习模型(诸如gnn 252)上应用从source.cc 350生成的ast,以创建到潜在空间352中的嵌入(由图3中的黑圈表示)。
50.在图3的示例中,先前描述的训练过程已经被用于学习到与更改类型对应的潜在空间352的区域3541‑
t
的映射。t可以是正整数,其等于在训练期间应用于图2中的更改图228的不同更改类型标签232的数量。例如,第一区域3541可以与第一更改类型(例如“更改变量名称”)对应。从表示对源代码片段中变量名称的更改的更改图生成的参考嵌入(图3中的小圆圈)的聚类可以驻留在第一区域3541中。第二区域3542可以与第二更改类型(例如“更改函数名称”)对应。从表示对源代码片段中函数名称的更改的更改图生成的参考嵌入的另一聚类可以驻留在第二区域3542中。以此类推。这些区域354(和图4中的454)可以以各种方式定义,诸如通过使用通过特定更改类型的所有现有/已知嵌入的最大封闭圆或“凸包(convex hull)”。
51.在图3的示例中,source.cc 350是例如特定客户端110的待更新的源代码片段。从source.cc 350生成的嵌入(图3中的黑点)将在潜在空间352中接近多个不同的更改类型是
完全有可能的。这可能是因为相同或相似的源代码片段在先前被更新时包括多种类型的更改。因此,在图3的示例中,从source.cc 350生成的嵌入可以同时映射到第一区域3541、第二区域3542和第三区域3543,如由区域3511‑3的交集内的暗点位置所示。
52.为了确定做出和/或推荐哪些更改,在各种实施方式中,可以基于潜在空间352中一个或多个参考嵌入和新源代码嵌入(暗的小圆圈)之间的一个或多个距离来识别潜在空间352中的一个或多个参考嵌入(图3中的小圆圈)。这些距离或“相似性”可以以各种方式计算,诸如通过余弦相似性、点积等。在一些实施方式中,最接近新源代码嵌入的(一个或多个)参考嵌入可以被识别并被用于确定对应的源代码编辑。
53.例如,在一些实施方式中,每个参考嵌入可以例如在查找表和/或数据库中与产生该参考嵌入的一个或多个源代码更改关联。假设更改变量名称区域3541中最接近的参考嵌入与将变量名称“var1”替换为“vara”的源代码更改关联。在一些实施方式中,可以生成和呈现推荐,例如作为音频或视频输出,其推荐对于待更新源代码库采用相同的更改。在一些实施方式中,该输出可以传达要对代码做出的实际更改和/或与代码更改相关的评论。
54.在一些实施方式中,可以确定这样的更改的置信度度量,例如,新源代码嵌入与最接近参考嵌入之间的更短距离与更大置信度对应。在一些这样的实施方式中,如果置信度度量非常大,例如,满足一个或多个阈值,则可以自动实现更改,而无需首先提示用户。
55.图4描绘了可以如何使用源代码片段460来创建参考嵌入和/或训练诸如gnn 252的机器学习模型的一个示例。源代码片段460的待更新第一版本在此示例中是1.0.0。在此示例中,源代码片段460'的第二或“目标”版本是1.0.1。如图4中所示,可以分别从源代码片段460、460'的第一和第二版本生成ast 464、464'。假设对于此示例,1.0.0和1.0.1之间对源代码片段的唯一更改是变量名称的更改,如在ast 464'左下部分处添加新节点所反映的那样。
56.可以例如由数据集构建器224比较ast 464、464',以生成反映该更改的更改图228。然后可以例如由ast2vec 234使用诸如gnn 252和/或序列到序列模型254的机器学习模型来处理更改图228,以生成如箭头所示的潜在空间嵌入。在这个示例中,潜在空间嵌入落在潜在空间452的区域4541内,在其中还发现涉及变量名称更改的其他参考嵌入(在图4中再次由小圆圈表示)。
57.作为训练机器学习模型的一部分,在一些实施方式中,指示第一版本源代码片段和第二版本源代码片段之间的更改的数据,例如更改图228,可以用更改类型进行标记(用232)。然后可以例如由ast2vec组件234应用更改图228作为在机器学习模型(例如,252)上的输入以在潜在空间452中生成新嵌入。接下来,新嵌入和潜在空间中与相同更改类型关联的先前(例如,参考)嵌入之间在潜在空间中的距离可以被确定和用于训练机器学习模型。例如,如果距离太大——例如,大于新嵌入和不同更改类型的参考嵌入之间的距离——则可以应用诸如反向传播和梯度下降的技术来变更机器学习模型的(一个或多个)权重和/或参数。最终在足够的训练之后,相同更改类型的参考嵌入将在潜在空间452(其然后可以与图3中的潜在空间352对应)中聚类在一起。
58.图5是示出根据本文公开的实施方式的利用经训练机器学习模型将待更新的源代码片段映射到包含参考嵌入的潜在空间的示例方法500的流程图。为方便起见,参考执行操作的系统来描述流程图的操作。该系统可以包括各种计算机系统的各种组件,诸如代码知
识系统102的一个或多个组件。此外,虽然方法500的操作是以特定顺序示出的,但这并不意味着限制。一个或多个操作可以重新排序、省略或添加。
59.在框502处,系统可以应用与第一版本源代码片段(例如,图5中的350)关联的数据作为在一个或多个机器学习模型(例如,252)上的输入,以生成潜在空间(例如,352)中的新源代码嵌入。该与第一版本源代码片段关联的数据可以包括源代码片段本身,和/或可以包括源代码片段的另一表示,诸如ast(例如,222)。在一些实施方式中,源代码片段可以是源代码文件的一部分,或者甚至是整个源代码文件。
60.在框504处,系统可以基于潜在空间中一个或多个参考嵌入和新源代码嵌入之间的一个或多个距离来识别潜在空间中的一个或多个参考嵌入。如先前所解释的,一个或多个参考嵌入中的每一个可以已经通过应用指示对参考第一版本源代码片段(图4中的460)做出以生成参考第二版本源代码片段(图4中的460')的更改的数据(例如,228),作为在机器学习模型中的一个或多个上的输入而生成(例如,如图4所示)。并且在各种实施方式中,每个参考嵌入可以例如在查找表和/或数据库中与对参考嵌入底层的源代码做出的一个或多个更改关联。
61.在框506处,系统可以基于识别的一个或多个参考嵌入来识别要对第一版本源代码片段做出以创建第二版本源代码片段的一个或多个更改。例如,系统可以在查找表或数据库中寻找与最接近的参考嵌入关联的一个或多个更改。
62.在框508处,可以将与框506的识别关联的置信度度量与一个或多个阈值进行比较。例如,可以基于潜在空间中新源代码嵌入和最接近的参考嵌入之间的距离来确定该置信度度量。例如,在一些实施方式中,置信度度量——或更一般地,由置信度度量指示的置信度——可以与该距离逆相关。
63.如果在框508处,置信度度量满足(一个或多个)阈值,则方法可以进行到框510,在该点处可以自动实现在框506处识别的一个或多个更改。然而,在框508处,如果置信度度量未能满足(一个或多个)阈值,则在框512处,系统可以生成使例如由客户端110操作的一个或多个计算设备推荐代码更改的数据。在一些这样的实施方式中,客户端可以能够“接受”更改,例如,通过按下图形用户界面上的按钮或通过说出确认。在一些实施方式中,对推荐的代码更改的接受可以用于进一步训练本文描述的一个或多个机器学习模型,例如gnn 252或序列到序列模型254。
64.图6是示出了根据本文公开的实施方式的训练诸如gnn 252的机器学习模型以将待更新的源代码片段映射到包含参考嵌入的潜在空间的示例方法600的流程图。为方便起见,参考执行操作的系统来描述流程图的操作。该系统可以包括各种计算机系统的各种组件,诸如代码知识系统102的一个或多个组件。此外,虽然方法600的操作是以特定顺序示出的,但这并不意味着限制。一个或多个操作可以重新排序、省略或添加。
65.在框602处,系统可以获得指示第一版本源代码片段和第二版本源代码片段之间的更改的数据。例如,可以例如由数据集构建器224基于第一版本源代码片段460和第二(或“目标”)版本源代码片段460'生成更改图228。在框604处,系统例如通过数据集构建器224的方式可以用更改类型标签(例如,图2中的232)标记指示更改的数据。
66.在框606处,系统可以应用指示更改的数据(例如,更改图228)作为在机器学习模型(例如,gnn 252)上的输入,以在潜在空间(例如,452)中生成新嵌入。在框608处,系统可
以确定潜在空间中新嵌入和潜在空间中与相同和/或不同更改类型关联的(一个或多个)先前嵌入之间的(一个或多个)距离。可以使用诸如余弦相似性、点积等的技术来计算这些距离。
67.在框610处,系统可以使用损失函数和在框608处确定的(一个或多个)距离来计算误差。例如,如果具有更改类型“更改变量名称”的新嵌入比它到类型“更改变量名称”的先前嵌入更接近类型“更改函数名称”的(一个或多个)先前嵌入,则这可以意味着生成该新嵌入的机器学习模型需要被更新或训练。因此,在框612处,系统可以至少部分地基于在框610处计算的误差来训练机器学习模型。框612的训练可以涉及诸如梯度下降和/或反向传播的技术。附加地或替代地,在各种实施方式中,其他类型的标签和/或训练技术可以用于训练机器学习模型,诸如弱监督或三元组损失,其可包括对诸如相似/不相似或接近/不接近的标签的使用。
68.图7是示例计算设备710的框图,该计算设备710可以可选地用于执行本文描述的技术的一个或多个方面。计算设备710典型地包括至少一个处理器714,其经由总线子系统712与多个外围设备通信。这些外围设备可以包括存储子系统724,包括例如存储器子系统725和文件存储子系统726;用户接口输出设备720;用户接口输入设备722和网络接口子系统716。输入和输出设备允许用户与计算设备710交互。网络接口子系统716提供到外部网络的接口并联接到其他计算设备中的对应接口设备。
69.用户接口输入设备722可以包括键盘;诸如鼠标、轨迹球、触摸板或图形输入板的指向设备;扫描仪;结合到显示器中的触摸屏、诸如语音识别系统、麦克风的音频输入设备和/或其他类型的输入设备。一般而言,术语“输入设备”的使用旨在包括将信息输入到计算设备710中或通信网络上的所有可能类型的设备和方式。
70.用户接口输出设备720可以包括显示子系统、打印机、传真机或诸如音频输出设备的非视觉显示器。显示子系统可以包括阴极射线管(crt)、诸如液晶显示器(lcd)的平板设备、投影设备或用于创建可见图像的某个其他机构。显示子系统还可以提供非视觉显示,诸如经由音频输出设备。一般而言,术语“输出设备”的使用旨在包括将信息从计算设备710输出到用户或另一机器或计算设备的所有可能类型的设备和方式。
71.存储子系统724存储提供本文描述的一些或所有模块的功能的编程和数据结构。例如,存储子系统724可以包括执行图5

6的方法的选择的方面以及实现图1

2中描绘的各种组件的逻辑。
72.这些软件模块通常由处理器714单独或与其他处理器结合执行。存储子系统724中使用的存储器725可以包括多个存储器,包括用于在程序执行期间存储指令和数据的主随机存取存储器(ram)730和其中存储固定指令的只读存储器(rom)732。文件存储子系统726可以为程序和数据文件提供持久存储,并且可以包括硬盘驱动器、软盘驱动器以及关联的可移动介质、cd

rom驱动器、光驱或可移动介质盒。实现某些实施方式的功能的模块可以由文件存储子系统726存储在存储子系统724中,或者存储在(一个或多个)处理器714可访问的其他机器中。
73.总线子系统712提供了用于使计算设备710的各种组件和子系统按预期与彼此通信的机制。尽管总线子系统712被示意性地示为单个总线,但是总线子系统的替代实施方式可以使用多个总线。
74.计算设备710可以是不同类型,包括工作站、服务器、计算集群、刀片服务器、服务器群或任何其他数据处理系统或计算设备。由于计算机和网络的不断更改的性质,图7中描绘的计算设备710的描述仅旨在作为用于说明一些实施方式的目的的特定示例。具有比图7中描绘的计算设备更多或更少的组件的计算设备710的许多其他配置是可能的。
75.虽然本文已经描述和示出了若干实施方式,但是可以利用用于执行功能和/或获得结果和/或本文描述的一个或多个优点的各种其他手段和/或结构,并且每个这样的变化和/或修改被认为在本文描述的实施方式的范围内。更一般地,本文描述的所有参数、尺寸、材料和配置意在是示例性的并且实际参数、尺寸、材料和/或配置将取决于使用教导的一个或多个特定应用。本领域技术人员将认识到或能够仅使用常规实验来确定本文描述的特定实施方式的许多等效物。因此,应当理解,前述实施方式仅通过示例的方式呈现,并且在所附权利要求及其等效物的范围内,可以以不同于具体描述和要求保护的方式来实践实施方式。本公开的实施方式涉及本文描述的每个单独的特征、系统、物品、材料、套件和/或方法。此外,两个或更多个这样的特征、系统、物品、材料、套件和/或方法的任何组合,如果这样的特征、系统、物品、材料、套件和/或方法不相互矛盾,则包括在本公开的范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1