Page 208 - 《软件学报》2021年第7期
P. 208

2126                                     Journal of Software  软件学报 Vol.32, No.7,  July 2021

                 人 [39] 借助正则表达式匹配方法,从缺陷跟踪系统和邮件清单中抽取与方法相关的描述.他们基于两个开源项目
                 (即 Lucene 和 Eclipse)对所提方法的有效性进行了评估,最终结果表明:在 Lucene 和 Eclipse 项目内,分别有 36%
                 和 7%的方法,可以在项目的缺陷报告和邮件清单中找到与方法代码相关的描述信息.
                    一些研究人员借助信息检索方法,利用来自 Stack Overflow 和 Github 的众包知识来辅助生成代码注释.例
                 如,在开发人员问答网站 Stack Overflow 中,用户经常会贴出一段含有缺陷的代码和所需要实现的功能,随后,其
                 他用户会围绕这段缺陷代码展开讨论,并给出可能的缺陷修复方案.这些讨论经常会包含一些有价值的信息,并
                 可以辅助对上述代码的理解.同样,由于代码重复在大规模代码库(例如 Github)内是一种常见现象.因此可以使
                 用代码克隆(code clone)检测方法来尝试检索出与目标代码相似的代码段,并基于这些相似代码段的注释来生
                 成目标代码的注释.
                    Rahman 等人  [40] 首先针对这类方法进行了探索性研究,通过分析来自 Stack Overflow 的 9 016 个问题贴和
                 接受答案以及对应的讨论,他们发现 22%的评论是有用的.上述探索性研究的结论表明,可以借助来自 Stack
                 Overflow 的众包知识来辅助生成代码注释.随后,他们提出了基于启发式(例如,帖子的流行度、相关度、评论评
                 分、包含的单词数和情感等)的方法,通过挖掘 Stack Overflow 来获取有用的注释.最后,他们基于 292 个来自
                 Stack Overflow 的代码段和对应的 5 039 个讨论,验证了所提方法的有效性.
                    Wong 等人  [41] 提出了 AutoComment 方法.他们借助爬虫技术,首先从 Stack Overflow 社区中爬取了大量代码
                 片段和对应的描述.随后基于代码-描述映射对(code-description mapping)来构建语料库,当给定目标代码时,从
                 语料库中检索出相似代码并将其描述作为代码注释.他们通过分析与 Java 和 Android 标签相关的帖子,总共抽
                 取了 132 767 对代码-描述映射.最后通过将该方法应用到 23 个 Java 和 Android 项目,总共生成了 102 个代码注
                 释.Vassallo 等人 [42] 开发了 CODES 工具,该工具从 Stack Overflow 的讨论中提取方法的候选注释并生成基于
                 JavaDoc 的描述.他们发现:在 Lucene 和 Hibernate 项目中,分别有 20%和 28%的方法可以从 Stack Overflow 中抽
                 取出相关描述.
                    Wong 等人  [43] 随后提出了 CloCom 方法.他们基于代码克隆方法,尝试着从 Github 网站中搜索出相似的代码
                 段,并基于这些相似代码段的注释来描述目标代码.他们主要使用自然语言处理技术.该方法的输入是用于抽取
                 注释的软件项目和需要生成注释的软件项目,输出是一系列自动生成的代码注释.具体来说,首先对用于抽取注
                 释的项目进行代码克隆检测,随后从检测出的代码克隆中移除掉不具有语义相似性的代码,最后抽取相关代码克
                 隆的注释、移除其中的无关注释并进行排序.他们分析了来自 1 005 个 Java 项目的 4 200 万行代码,并最终生成了
                 359 个注释.通过进一步的人工分析后,他们发现其中 23.7%的注释具有较高的质量.Badihi 和 Heydarnoori                  [44] 使用
                 众包(crowdsourcing)方法来搜集代码-描述映射对.他们通过设计游戏来激励用户为给定的代码段编写注释.同
                 时,该游戏也支持用户对其他用户编写的注释按照质量进行排序.随后,他们使用自然语言处理技术来处理这些
                 代码-描述映射对,并通过为目标代码段查找最为相似的代码来生成注释.
                    同样,也有研究人员尝试基于信息检索的生成方法,通过分析代码变更来生成提交消息.Huang 等人                               [45] 通过
                 挖掘版本控制系统来搜集代码变更和对应的提交消息,并构建语料库.对于目标代码变更,他们会从已搜集的语
                 料库中检索出最为相似的代码变更,并使用对应的提交消息来生成目标代码变更的注释.在评估代码变更相似
                 度时,他们综合考虑了 4 种相似度,其中后语法和语义相似度是衡量修改后代码段间的相似度,而前语法和语义
                 相似度是衡量修改前代码段间的相似度.他们基于 7 个开源项目对所提方法的有效性进行了评估,实验结果表
                 明:在生成的提交消息中,9.1%的提交消息是高质量的,27.7%的提交消息需要进行小幅度的修改,而剩余的
                 63.2%的提交消息则难以令人满意,他们对具体的原因也给出了深入的分析.
                    Liu 等人 [14] 对 Jiang 等人 [46] 提出的基于深度学习的方法进行了重新审视.他们对 Jiang 等人提出的方法能够
                 取得良好性能的背后原因进行了深入分析.首先他们发现,在测试集中的代码变更若能生成高质量的提交消息,
                 是因为在训练集中含有相似的代码变更.其次他们发现,在 Jiang 等人搜集并共享的语料库中,大约有 16%的代
                 码变更含有噪音(即这些代码变更的提交消息是由持续集成工具自动生成的).通过移除这些噪音代码变更,Liu
                 等人发现,基于深度学习方法的性能并不理想,因此他们提出了一种基于最近邻的简单方法 NNGen.具体来说,
   203   204   205   206   207   208   209   210   211   212   213