lisp代码编写地物符号_Aroma:通过结构代码搜索推荐代码

58a821be7406b867e86c37d7b9f8ab58.png

1 引用

Sifei Luan and Di Yang and Celeste Barnaby and Koushik Sen and Satish Chandra. Aroma: code recommendation via structura* code search. Proceedings of the ACM on Programming Languages, 2019, 3(OOPSLA):152:1--152:28

2 摘要

程序员经常编写与在某处编写的现有代码具有相似性的代码。可以帮助程序员搜索此类相似代码的工具将非常有用。这样的工具可以帮助程序员扩展部分编写的代码段,以完整实现必要的功能,可以帮助发现部分代码的扩展,这些扩展通常在其他程序员代码中已经被包含,可以帮助对其他程序员编写的类似代码进行交叉检查,或者帮助添加额外的代码,以解决常见的错误。我们提出 Aroma,一种通过结构化代码搜索进行代码推荐的工具和技术。Aroma 索引了包含数千个开源项目的庞大代码库,将部分代码段作为输入,在该库中搜索包含该部分代码段的方法主体,并将搜索结果进行聚类和交叉,以推荐一小组简洁的代码段,这些代码段既包含查询段,又作为语料库中几种方法的一部分出现。我们用从语料库中随机选择的 2000 条查询以及从 Stack Overflow (一个讨论代码的流行网站)获得的代码段派生的 64 条查询对 Aroma 进行了评估。我们为 4 种不同的语言实现了 Aroma,并为 Aroma 开发了一个 IDE 插件。此外,我们进行了一项研究,要求 12 位程序员使用 Aroma 完成编程任务,并收集他们的反馈。我们的结果表明,Aroma 能够有效地检索和推荐相关的代码片段。

3 算法

图 1 展示了 Aroma 的总体架构。为了生成代码推荐,Aroma 必须首先对代码语料库进行特征化。为此,Aroma 解析语料库中每个方法的主体并创建其解析树。它从每个解析树中提取一组结构特征。然后,给定一个查询代码片段,Aroma 运行以下图 1 流程来创建建议。

7636fa812cbdc0fd128c4b82d28db360.png

图 1 AROMA 代码推荐流程

接下来,我们将使用图 2 所示的代码片段作为运行示例来描述每个步骤的详细信息。

654d07403f1f4bf5898ec0364a103580.png

图 2 从 Stack Overflow 上获取的代码片段

3.1 定义

在本节中,我们将介绍几个用于计算代码段特性的符号和定义。这些术语和符号也用于正式描述 AROMA。

定义 1(关键词 token):这是编程语言中所有标识的集合,其值作为语言的一部分固定。如 while、if、else 等关键字和 {,},,,+,* 等符号。

定义 2(非关键词 token):变量名、方法名、字段名和文本。

定义 3(简单解析树):一个非空列表,列表中的元素可以是:

  • 非关键词 token
  • 关键词 token
  • 简单解析树

简单解析树不能是仅包含一个简单解析树元素的列表

定义 4(简单解析树的标签):简化解析树的标签是通过将表示该树的列表的所有元素连接起来获得的,如下所示:

  • 如果元素是关键字 token,则该 token 的值用于连接
  • 如果元素是非关键字 token 或一个简单解析树,则特殊符号 # 用于连接。

例如,简化解析树 [“x”、“>”、[“y”、“”、“,”f“]] 的标签是“#>#”。

2f5b5ef57c9c78d1ea24a1ba233a5c95.png

图 3 为图 2 中代码的简单解析树表示形式。在叶的关键字标识被省略以避免混乱。 变量节点以双圆圈突出显示。

给定一个简单解析树 t,我们使用以下约定符号表示。 所有示例均参考图 3 。

0b669c0ceb53b459e11d207aae9a839a.png
a49e93564a648d6d02b764f25d67f97d.png

3.2 特征化

现在,我们正式描述 Aroma 如何特征化一段代码段。 给定一个简单解析树,我们为树所代表的程序中的每个非关键字标识 n 提取四种特征:

(1)Token Feature:如果 n 是局部变量,那么我们用特殊标记 #VAR 替换 n。我们想忽略局部变量名称,因为我们认为查询代码片段和推荐的代码片段是相似的,即使它们在变量的命名方面有所不同。

(2)形式为 (n, i1, L(t1)),(n, i2, L(t2)) 和 (n, i3, L(t3)) 的 Parent Feature:这里 n 是 t1 的第 i1 个孩子,t1 是 t2 的第 i2 个孩子,t2 是 t3 的第 i3 个孩子。和之前一样,如果 n 是局部变量,那么我们用 #VAR 替换 n。请注意,在每个特征中,我们均未指定特征中的第三个元素是父级,祖父母级还是曾祖父级。这有助于 AROMA 容忍其他相似代码段中的某些非相似性。

(3)形式为 (n, Next(n)) 和 (Prev(n), n) 的 Sibling Feature:如果 n, Next(n), Prev(n) 是局部变量,则用 #VAR 替换

(4)形式为 (C(PrevUse(n)), C(n)) and (C(n), C(NextUse(n))) 的 Variable Usage Features:只有当 n 是本地变量的时候,我们才添加这些特征。

3.3 推荐算法

阶段一:轻量级搜索。在这个阶段,Aroma 获取一个查询代码片段,并输出与查询重叠最多的前几个(例如 1000 个)方法的列表。为此,Aroma 从查询和语料库中的每个方法中提取自定义的特征。Aroma 将查询的一组特征与每个方法体相交,并使用相交的基数计算查询代码段与方法体之间的重叠程度。为了提高计算效率,Aroma 将代码片段的特征集表示为稀疏向量,并执行矩阵乘法来计算所有方法与查询代码的重叠程度。

阶段二:修剪和重新排列。在这个阶段,Aroma 使用一个更精确但昂贵的计算相似度的算法重新排列从上一阶段检索到的方法体列表。

阶段三:聚类和交叉。在最后一个阶段,Aroma 对前一个阶段重新排序的代码片段列表进行聚类。聚类是基于方法体的相似性。聚类还需要满足确保推荐具有高质量的约束条件。因此,我们设计了一个考虑约束的自定义聚类算法。然后,Aroma 将每个集群中的代码片段交叉起来,生成推荐的代码片段。这种聚类和交叉的方法有助于创建一组简洁而多样的推荐意见。

4 搜索召回情况的评估

4.1 修剪和重新排列阶段中的召回分析

Recal* @ n 定义为在重新排序的搜索结果列表的前 n 个方法中找到原始方法主体的查询代码段的百分比。 除了 Recal* @ 1 之外,我们还考虑了 Recal* @ 100,因为在聚类阶段使用了重新排序列表中的前 100 个方法来创建推荐的代码。

4.2 与克隆检测器和常规搜索技术的比较

AROMA 的搜索和修剪阶段与克隆检测和常规代码搜索有些相关。原则上,AROMA 可以使用克隆检测器或常规代码搜索技术来首先检索包含查询代码段的方法列表,然后对方法进行聚类和相交以获得建议。我们在相同的微基准数据集上测试了这些替代设置的搜索调用。

如表 1 所示,两种常规搜索技术的召回率都大大低于 AROMA。我们观察到,在很多情况下,尽管原始方法出现在前 100 个结果中,但它并不是最佳结果,因为由于功能或关键字的重叠,还有其他方法的相似度得分较高。如果不进行修剪,则无法确定方法包含查询代码段的程度。此实验表明,修剪对于创建精确排序的搜索结果列表至关重要。

b2c74b11b1a35ccca5566191e2500e0c.png

表 1 克隆检测器,常规搜索技术和 AROMA 之间的召回率比较

5 本文主要贡献

我们介绍了 AROMA,这是一种通过结构代码搜索进行代码推荐的新工具。AROMA 首先通过索引大型代码语料库来工作。它以一个代码段作为输入,从语料库中汇编包含该代码段的方法主体的列表,然后对这些方法主体进行聚类和相交以提供一些简洁的代码建议。

为了评估 AROMA,我们用超过 200 万的 Java 方法对一个代码语料库进行了索引,并使用从 android 标记中的 500 个最流行的 Stack Overflow 问题中选择的代码片段进行了 AROMA 搜索。我们观察到 AROMA 为其中的大多数片段提供了有用的建议。此外,当我们使用代码片段的一半作为查询时,AROMA 准确地建议了 50 个案例中的 37 个代码片段的后一半。

此外,我们进行了大规模的自动化评估,以测试 AROMA 搜索结果的准确性。我们从语料库中的现有方法主体中提取了部分代码片段,并使用这些片段作为查询执行了 AROMA 搜索。我们发现,对于 99.1% 的连续查询和 98.3% 的非连续查询,AROMA 都将原始方法检索为排名最高的结果。我们还表明,与传统的代码搜索技术相比,AROMA 的搜索和修剪算法在查找包含代码片段的方法方面明显更胜一筹。

最后,我们进行了一个案例研究,以研究程序员如何与 AROMA 进行交互,其中参与者使用和不使用 AROMA 完成了两项简短的编程任务。我们发现,许多参与者成功地使用 AROMA 来识别他们不熟悉的库的一些常见模式。在后续调查中,大多数参与者表示,他们认为 AROMA 对于完成任务很有帮助。

我们正在进行的工作表明,AROMA 有潜力成为强大的开发人员工具。尽管新代码通常与存储库中的现有代码相似,但是当前可用的代码搜索工具并未利用此相似代码来帮助程序员添加或改进其代码。AROMA 通过识别对输入代码段的常见添加或修改,并以简洁,方便的方式将其呈现给程序员,解决了该问题。

致谢

感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!

本文由南京大学软件工程系 2018 级硕士生韩奇翻译转述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值