当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于对象类型的API补全方法技术

技术编号:29155864 阅读:27 留言:0更新日期:2021-07-06 22:54
本发明专利技术公开了一种基于对象类型的API补全方法,包括以下步骤:基于Github代码托管平台生成Java代码数据集;基于Java代码数据集,使用eclipseAST的API解析抽象语法树,再遍历抽象语法树,生成GROUM,构建一个Java JDK的API调用序列数据集;基于LSTM和注意力机制搭建深度学习训练模型;开发一个基于本发明专利技术模型的IDEA插件;借助插件客户端对当前代码分析后获取API序列和空缺位置,传给服务器,服务器中模型解析结果并返回API补全推荐列表。本发明专利技术旨在为程序开发者在实际编程过程中,提供切实可用的API补全方案,实现了一个基于对象类型的深度学习模型以及IDEA插件用于API补全推荐,提高了API补全的准确性与易用性。

【技术实现步骤摘要】
一种基于对象类型的API补全方法
本专利技术涉及一种API补全方法,具体涉及一种基于对象类型的API补全方法,属于软件工程和深度学习领域。
技术介绍
在软件开发过程中,为了避免重复工作,提高软件开发效率,软件开发者通常会使用一些第三方的API,即应用编程接口,来协助完成软件的功能。这些第三方库的API通过提供对象、方法以及变量来让软件开发者调用,借以实现一系列特定需求或功能。通过调用这些API,软件开发者可以实现某种功能而无需关注其内部的复杂细节;减少代码出错的概率;提高软件开发效率以及更加便捷地复用代码。然而,学会正确地使用这些API需要耗费软件开发者大量地时间。由于这些第三方库也在不断地迭代更新,其中相当一部分缺少API说明文档。有些即使提供API说明文档的,也有可能存在一些错误。在这种情况下,软件开发者不得不去技术论坛、博客或者Github上寻求帮助,有时甚至需要阅读源代码来寻找这些API的正确使用方法。由于第三方库的庞大数量,即使是使用过的API,比如JDK,最新版本中类已经达到3000多个,一段时间后,软件开发者也很难清晰记住对应API的名称和用法。微软的一项研究表明,67.6%的受访者提到在学习API的过程中受到了资源不足的困扰。软件开发者往往需要多次重复学习过程,极大地影响软件开发的效率。为了帮助软件开发者正确且快捷地使用这些第三方API,一系列API方法补全工具应运而生。API方法补全是指当程序员已经拼写出一个对象名之后,通过查询这个对象所属类别列出所有的方法供程序员选择。一个在IDEA中智能提示API方法的例子,在集成开发环境中这些智能提示只是将所有可能的API按照使用频率从高到低排列。通过这种方式推荐的API许多是与当前方法块毫不相关的,开发者仍需要在众多的候选API中挑选出正确的API。为解决这种问题,有研究者提出使用数据挖掘算法挖掘API使用模式进行推荐。这些算法通常是从大量的源代码中抽取出API调用序列,以模式识别或者传统序列模型的方法来研究API的使用模式,进而实现API自动补全。还有一些工作使用深度学习模型来实现API补全任务。长短期记忆模型LSTM是一种时间循环神经网络,被广泛应用于文本处理。它是为了解决传统时间循环网络中存在的长期依赖问题而被专门设计出来的。传统循环网络在利用BP反向传播时,误差会逐级减少。这导致计算过程中,梯度会随着时间序列的增长而指数下降,导致网络权重更新缓慢,LSTM采用门控机制来解决这个问题。注意力机制是由Chorowski等人为机器翻译提出的,其动机来源于人类阅读文本时,会对某些重要的词信息给予额外的关注。它首先被应用于Encoder-Decoder模型,即当需要翻译某个词时,对源语言中的某些词进行特殊关注。在API补全任务中,通过使用注意力机制,模型可以动态地关注有助于执行当前任务的输入的某些部分,将这种相关性概念结合起来。除了可以帮助任务提升性能外,注意力机制还可以提高模型的可解释性,在一定程度上克服循环神经网络中的一些挑战,例如随着输入长度的增加造成的性能下降,以及输入顺序不合理导致的计算效率低下。为了满足开发人员实际编程需要,提供切实可用的API方法补全,主要研究目标在于设计和实现一个考虑对象特征的API补全方法,同时实现一个支持离线和在线的集成开发环境插件,提供API方法补全服务。
技术实现思路
本专利技术是一种基于对象类型的API补全方法,提供一种API调用序列提取方法,包括静态分析源代码,获取对应抽象语法树,以及以方法块为单位构建每个方法块对应的控制流图的技术,从提取出控制流图的数据依赖路径,并针对代码实际结构表征训练深度学习模型,通过LSTM与注意力机制构建为分类任务,结合数据集训练模型进行API补全推荐。该方法能有效锁定API补全候选集,让模型在使用较低内存占用的同时,获得了最快的预测速度。基于对象的API补全模型受到补全位置和对象个数的影响比较小,模型较好适应用户实际使用场景。基于对象类型的API补全模型使用的是深度学习模型来学习代码库中的API用法,因此与基于搜索查询的方法不同,预测时不需要依赖代码库来给出判断。这使得模型可以在用户本地给出推荐,更适合嵌入到集成开发环境中。本专利技术所述的一种基于对象类型的API补全方法,其特征在于包含以下步骤:步骤1:基于Github代码托管平台生成Java代码数据集。步骤2:基于Java代码数据集构建一个JavvaJDK的API调用序列数据集。步骤3:构建一个基于对象类型的API补全模型。步骤4:基于API补全模型与数据集训练一个可供用户使用的模型。步骤5:输出推荐的API补全。2.根据权利要求1所述的一种基于对象类型的API补全方法,其特征在于步骤1:中基于Github代码托管平台生成Java代码数据集,具体子步骤包括:步骤1.1:调用Github提供的接口,搜索按star数排序的前15000个使用Java项目地址。步骤1.2:使用生产者消费者模型下载代码数据集。3.根据权利要求1所述的一种基于对象类型的API补全方法,其特征在于步骤2:中基于Java代码数据集构建一个JavaJDK的API调用序列数据集,具体子步骤包括:步骤2.1:利用eclipseAST的API将每个源代码文件解析成抽象语法树。步骤2.2:遍历抽象语法树,生成Groum有向无环图。步骤2.3:基于源代码对应的控制流图,设计一个算法获取API调用序列。首先初始化一个栈,遍历一遍控制流图,将入度为0的节点存入栈中。然后依次取出栈中的节点,将节点放入输出列表中。接着判断该节点的所有子节点入度在减去1之后是否为0,如果为0,将子节点放入栈。循环该过程,直到栈为空为止。接着对输出列表中的节点依次判断是否是方法调用节点,如果是,判断是否是属于JDK包中的API调用。对输出列表中的节点过滤出同时满足这两个条件的节点,最后输出得到API调用序列。4.根据权利要求1所述的一种基于对象类型的API补全方法,其特征在于步骤3:中构建一个基于对象类型的API补全模型,具体子步骤包括:步骤3.1:对每个API调用进行编码。使用了两个词嵌入矩阵和用来分别对应对象类型和API的嵌入层,分别对对象类型和API进行编码,然后将这两个词向量表示拼接在一起,得到时间t的输入,显式地告知模型同一个对象内API调用的联系,若两个API调用属于同一个对象,那这两个API调用对应的编码前一半是一样的;步骤3.2:设计了一个层次型的网络来对API序列进行编码。根据空缺位置将API调用序列划分为三部分:空缺位置之前的API调用,空缺位以及空缺位置之后的API调用。对于空缺位置之前的API调用,先按照对象类型抽取出同属于一个对象的API调用子序列,并将每个调用子序列使用LSTM来编码对象状态。对于空缺位置及空缺位置之后的API序列,使用相同的方法得到对应的对象状态。接着,将对象状态按照其子序列中最后一个API调用在整体序列中的位置进行排序,得到本文档来自技高网
...

【技术保护点】
1.一种基于对象类型的API补全方法,其特征在于包含以下步骤:/n步骤1:基于Github代码托管平台生成Java代码数据集。/n步骤2:基于Java代码数据集构建一个Java JDK的API调用序列数据集。/n步骤3:构建一个基于对象类型的API补全模型。/n步骤4:基于API补全模型与数据集得到一个可供用户使用的模型。/n步骤5:输出推荐的API补全。/n

【技术特征摘要】
1.一种基于对象类型的API补全方法,其特征在于包含以下步骤:
步骤1:基于Github代码托管平台生成Java代码数据集。
步骤2:基于Java代码数据集构建一个JavaJDK的API调用序列数据集。
步骤3:构建一个基于对象类型的API补全模型。
步骤4:基于API补全模型与数据集得到一个可供用户使用的模型。
步骤5:输出推荐的API补全。


2.根据权利要求1所述的一种基于对象类型的API补全方法,其特征在于步骤1:中基于Github代码托管平台生成Java代码数据集,具体子步骤包括:
步骤1.1:调用Github提供的接口,搜索按star数排序的前15000个使用Java项目地址。
步骤1.2:使用生产者消费者模型下载代码数据集。


3.根据权利要求1所述的一种基于对象类型的API补全方法,其特征在于步骤2:中基于Java代码数据集构建一个JavaJDK的API调用序列数据集,具体子步骤包括:
步骤2.1:利用eclipseAST的API将每个源代码文件解析成抽象语法树。
步骤2.2:遍历抽象语法树,生成Groum有向无环图。
步骤2.3:基于源代码对应的控制流图,设计一个算法获取API调用序列。首先初始化一个栈,遍历一遍控制流图,将入度为0的节点存入栈中。然后依次取出栈中的节点,将节点放入输出列表中。接着判断该节点的所有子节点入度在减去1之后是否为0,如果为0,将子节点放入栈。循环该过程,直到栈为空为止。接着对输出列表中的节点依次判断是否是方法调用节点,如果是,判断是否是属于JDK包中的API调用。对输出列表中的节点过滤出同时满足这两个条件的节点,最后输出得到API调用序列。


4.根据权利要求1所述的一种基于对象类型的API补全方法,其特征在于步骤3:中构建一个基于对象类型的API补全模型,具体子步骤包括:
步骤3.1:对每个API调用进行编码。使用了两个词嵌入矩阵和用来分别对应对象类型和API的嵌入层,分别对对象类型和API进行编码,然后将这两个词向量表示拼接在一起,得到时间t的输入,显式地告知模型同一个对象内API调用的联系,若两个API调用属于同一个对象,那这两个API调用对应的编码前一半是一样的。
步骤3.2:设计了一个层次型的网络来对API序列进行编码。根据空缺位置将API调用序列划分为三部分:空缺位置之前的API调用,空缺位以及空缺位置之后的...

【专利技术属性】
技术研发人员:葛季栋李传艺唐泽陈恒
申请(专利权)人:南京大学
类型:发明
国别省市:江苏;32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1