论文部分内容阅读
近年来,软件开发者大多采用代码复用技术提高开发效率,其中API是代码复用技术中最常见的表现形式。然而,开发人员在享受API带来的开发便捷的同时,将面临另外一个问题——如何从大量的API库中找到符合需求的API。阅读大量的使用说明文档,并从中挑选符合需求的API是一个耗时且易错的过程。为了降低API的使用门槛,API推荐方法相继被提出。API推荐方法可根据开发者的开发上下文,生成一个后续可能会被调用的API列表,常见的API推荐方法包括SLANG、GraLan、APIREC等等。分析发现,这些方法的实验对象获取方式或模型训练过程均比较复杂,以Nguyen等人提出的API推荐方法APIREC为例,其使用统计学习的方法学习细粒度变更中的规律,由此生成相应的API推荐列表。虽然实验验证APIREC推荐性能优于多种基准方法,但是该方法需要挖掘项目中细粒度的变更信息,这是一个较为繁杂的过程,且需要较大的存储空间;此外训练推荐模型时也需要消耗较长时间。基于此,本文致力于寻找一个简单、有效的API推荐方法,以期望达到与复杂方法相近或更好的推荐性能。论文主要贡献如下:(1)提出了一个上下文敏感的自更新API推荐方法AUPLearner。AUPLearner认为代码上下文中单一类API使用序列以及API周围的字符列表有助于API推荐。首先,AUPLearner使用N-Gram语言模型捕捉单一类API使用序列中的顺序关系;然后使用关联规则挖掘算法挖掘每个类中API与字符间的关联规则;且在每次推荐结束后,AUPLearner使用历史API使用序列、字符列表以及开发者实际调用的API更新推荐模型。特别地,为了降低方法复杂性,AUPLearner只采用2-Gram语言模型捕捉单一类API使用序列中的顺序关系,挖掘频繁项时只挖掘其中包含API的2-频繁项集。(2)在开源Java项目中分析AUPLearner的总体推荐性能,实验结果显示AUPLearner的总体推荐准确性Accuracy@top-5值接近90%,逼近最优推荐方法;平均推荐耗时低于30ms,由此可认为AUPLearner是一个简单、有效的API推荐方法。(3)设计实验对比AUPLearner与基准方法APIREC、N-Gram的推荐性能,实验结果显示AUPLearner的推荐性能显著优于基准方法APIREC、N-Gram的推荐性能。特别地,与Nguyen等人提出的APIREC相比,项目间API(JDKAPI)的 top-1 推荐准确率Accuracy@top-1提高了约 160%(120%),项目内 API(JDK API)的 top-1 推荐准确率Accuracy@top-1提高了81%(77%)。