Page 42 - 《软件学报》2021年第11期
P. 42
3368 Journal of Software 软件学报 Vol.32, No.11, November 2021
好.Rahman 等人 [33] 提出一个代码搜索工具 RACK,首先把自然语言的查询通过众智扩展的方式转换成对应的
API 序列,而后以这些序列作为输入,从 GitHub 中搜索相关的项目段并推荐给用户.
(2) 代码生成
计算机自动生成代码是近年来软件工程的研究热点之一.Reed 等人 [34] 提出了神经程序解释器方法,该方法
由一种基于循环神经网络的组合神经网络构建,由一个任务无关的循环神经网络内核、一个用于保存键值对的
程序存储器和一个与应用领域相关的编码器组成,能够完成加法、排序和图形旋转等简单程序的执行.在神经
程序解释器方法的基础上,Li 等人 [35] 提出一种 NPL 方法,该方法也是基于大粒度的高层计算机程序通常由小粒
度低层子程序组合而成这一基本原理进行探索.该方法在小规模训练数据集上具有较高的准确率.代码补全任
务是较成熟的程序生成应用,传统方法通过对代码静态分析来进行 API 调用、常见代码块的补全.近年来,许多
研究者提出利用概率模型对大量的代码片段进行学习,从而实现代码补全.常用的模型有 N-gram 模型和神经网
络等.Asaduzzaman 等人 [36] 利用一种新的上下文敏感代码补全(CSCC)技术来进行 API 补全,以提高 API 方法调
用补全工作的性能.Allamanis 等人 [37] 提出利用 Log-Bilinear 的模型进行代码补全,他们利用该模型学习代码片
段,并且为该代码段推荐更加合理的方法名和类名,这对于代码风格的规范是有意义的.随着深度学习在自然语
言处理等领域的成功应用,最近的许多研究都关注于深度学习方法在源代码中的使用,尝试将深度学习引入代
码生成和补全中.在代码生成中,使用深度学习模型比较常见.比如,Mou 等人 [38] 提出使用 RNN 编码-解码模型来
从自然语言输入中获取用户企图,进而生成用户想要的代码.他们的实验显示了在大规模数据集上进行代码生
成的可能性.深度学习也可以用于做代码补全任务 [36,37] .比如,White 等人 [22] 提出将 RNN 语言模型用到源码文件
中,并展现了在预测软件分词方面的有效性.
(3) 代码推荐
有关代码推荐的研究一般主要关注代码段 [34,38] 或者 API 的推荐 [7,39] .Tu 等人 [39] 基于图的代码模型提出了
RecRank.它利用了 API 的路径使用特征,应用一种新的基于排序的判别算法来实现 API 推荐.Wang 等人 [40] 利用
信息检索和有监督学习推荐代码片段,引入机器学习之后,代码段推荐效果比简单的文本匹配更好.为了优化推
荐结果列表,需要对初始的推荐列表进行重排.Wang 等人 [40] 从推荐结果入手,采取半自动相关反馈方法对推荐
的代码段列表进行评价,算法根据人工的评价对推荐结果进行重新排序,把相关的结果尽量排到推荐结果更加
靠前的位置.Ishihara 等人 [41] 提出:在推荐代码段时不仅要考虑到查询与代码段之间的文本相似度,还要考虑代
码段的受欢迎程度.某个代码段的重用次数越多,表示其受欢迎程度越高.Ponzanelli 等人 [42] 提出一种代码推荐
系统,该系统通过实时查看开发者在浏览器和开发环境中的行为,判断开发者的搜索意图和偏好,进而对推荐结
果进行重排,将更好的推荐结果呈现到开发者面前.API 在软件复用以及软件开发平台中占有重要的技术地位,
已经成为开发人员完成开发任务时的核心关注点.API 推荐的主要目的是找到满足开发任务需要的 API 或 API
使用代码.为此,研究人员将信息检索和程序分析技术相结合,提出了一系列 API 搜索方法和技术.Stylos 等人 [43]
开发了一个用于搜索 API 类和方法以及 API 使用样例的网页搜索工具.从发发展趋势看,API 的研究已经从帮
[7]
助开发人员找到合适的 API 发展到帮助他们正确地使用 API.Gu 等人 针对用户输入的自然语言查询,推荐实
现查询功能所需的 API 序列.Xu 等人 [44] 不仅推荐 API,而且找出这些 API 方法最可能被使用的位置,具有更好的
实用性.
7 结 论
本文将深度学习方法应用到编程现场的代码行的推荐使用中,具体来说:首先收集编程现场的信息,包括编
程现场任务数据和代码行上下文数据;然后对数据格式进行处理,并将得到具有统一形式的数据存储.模型训练
过程就是利用循环神经网络编码-解码模型对编程现场的代码行上下文使用模式进行深度学习,并根据已有的
编程现场上下文对当前代码行进行推荐.学习使用的数据就是已经统一化格式的源码数据.能够对代码行上下
文使用模式进行深度学习的先决条件是,获取大规模代码行上下文数据集,并进行统一化的处理.
在推荐过程中,开发现场数据采集模块自动采集用户已经输入的代码行数据,经由现场数据清洗模块清洗