论文部分内容阅读
代码补全推荐是软件工程领域的热门研究,可以提升软件开发效率。现有的代码补全推荐算法大都是针对关键词与语句粒度的,这种粒度的推荐所能提供的代码信息量较小,因此存在效率不高的问题,而现代软件开发更需要若干代码行(称之为代码块)这样大粒度的代码推荐以提升代码推荐效率。为了实现大粒度代码补全推荐,需要在代码库中搜索出与待补全代码相似的代码,但由于待补全代码的不完整造成与完整代码有较大的差异,从而导致难以搜索出相似代码。近期一种新的能发现大差异(Large-gap)代码克隆的算法CCAligner被提出,使代码块粒度的代码补全推荐成为了可能。本文基于差异代码克隆算法改造,以及对现有大量的、高质量源码库的利用,提出了一种全新的代码块补全推荐算法。论文的主要工作和贡献如下:(1)差异代码克隆技术研究及改造本文通过使用大差异代码克隆算法在代码库中搜索出与待补全代码块相似的候选代码块,但由于大差异代码克隆算法是用于在一个代码集合中去发现彼此是克隆的所有差异代码对,而本文是在代码集合中搜索出与某个待补全代码块相似的差异代码块,两者对算法搜索的要求不同,因此需要进行改造以降低计算成本和提升针对性。针对上述问题,我们将大差异代码克隆算法的查找模式从多对多改为一对多,增加预处理将与待补全代码块无关的代码块全部过滤,并通过计算实验选取优化的算法参数。实验结果表明,改造后的算法在5M行的代码库中的相似代码检测时间只有原算法的10.7%;对于滑动窗口数为5、误配数为1、相似度阈值为0.5的算法参数,可以将原算法参数的F值提升10%以上。(2)代码块补全推荐算法设计与实现在上面的工作基础上,我们进一步对搜索结果中候选代码块进行补全推荐算法设计。由于代码库中存在大量重复代码,为防止相同或相近的候选代码被重复推荐,因此本文通过对搜索出的结果(候选代码)进行聚类使得相同或相近的代码块作为一类推荐。此外,为保证推荐代码的有用性,需要对聚类后的候选代码块进行打分排序,让相关性高的候选代码块优先被推荐。本文根据问题特点选取DBSCAN作为聚类算法对搜索结果进行聚类,聚类后我们从每个类别中选取一个代码块作为代表,然后从代码出现的频率、代码的语法与语义相似度三个方面对代码块进行相关性打分,并按照得分顺序对代码进行补全推荐。实验结果表明,在收集的Android Social Network数据集上本文方法进行了放回和不放回计算实验,Top-3准确率分别达到93.75%和68.75%;本文方法相对于仅能尾部代码块补全推荐方法进行了比较,Top-1准确率提升了20%至30%。