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

陈翔  等:代码注释自动生成方法综述                                                              2135


                 Stack Overflow 和 Github 平台上的众包知识,以进一步提升注释的生成质量.具体来说,在生成代码注释时,不仅
                 要深入分析代码的文本内容和结构信息,还要额外搜索 Github 和 Stack Overflow 等平台,以有效地搜索出与目
                 标代码相关的众包知识.通过有效利用这些众包知识,进一步地提升生成的代码注释的质量.另一方面,也可以
                 充分利用项目内的相关知识.为了更好地捕获与项目相关的信息,可以在训练模型和生成注释时,考虑项目软件
                 仓库内的其他类型文档.例如,如果一个新的代码变更是为了修复缺陷,则可以去查找这次变更对应的缺陷报告
                 以获取缺陷的具体信息.其次,本文总结的 3 种类型方法各有自己的优点和不足.虽然当前基于深度学习的方法
                 是主流的研究方式,但我们仍然可以通过融合其他两种类型的方法来进一步提升生成的代码注释质量.例如:
                 Zhang 等人 [77] 在融合了基于深度学习的生成方法和基于信息检索的生成方法上进行了初步尝试,并取得了较
                 好的效果.接着,在已有的生成的代码注释的基础上,我们还可以进一步尝试优秀代码注释风格的学习.一般来
                 说,Google 共享的相关项目的代码注释质量比较高,因此可以使用深度学习,基于这些项目来学习出优秀代码注
                 释的风格,随后将该风格应用到已有方法生成的代码注释上,以进一步提升注释的质量.最后可以考虑面向特定
                 领域的项目的代码注释生成,因为特定领域会有特定的术语,因此可以为这个领域构建一个知识图谱,并将知识
                 图谱内的知识融合到模型的训练过程中.
                    (3)  针对其他软件制品来生成注释.该综述重点分析了传统代码(例如 Java、Python 等)的注释自动生成问
                 题,但在当前软件开发和维护过程中,除了传统软件代码外,开发人员还会创建其他类型的软件制品.结合这些
                 软件制品特征来生成对应的高质量注释,同样具有研究意义并存在一定的研究挑战性.虽然研究人员在这个方
                 向上进行了一些探索.例如,Kamimura 等人         [92] 和 Li 等人 [93] 针对单元测试用例生成代码注释.Moreno 等人        [94] 提
                 出 ARENA 方法,可以针对新部署的软件产品自动生成发行说明(release note).发行说明一般包含在软件发行包
                 内,其重点描述与上一版本相比,当前版本增加的功能、修复的缺陷、对发布项目相关许可证的修改等.Gao 等
                 人 [95] 针对 App 的评论,尝试着自动生成针对该评论的回应.但不难看出,针对上述软件制品的研究工作仍然较
                 少,并有很多值得进一步关注的研究点.以单元测试用例这一软件制品为例,在生成代码注释时,除了需要考虑
                 测试用例代码本身的信息外,还需要额外考虑该测试用例覆盖的具体代码信息.除此之外,深度学习系统和智能
                 合约是当前软件工程研究领域关注较多的两类软件制品,如何针对这两类软件制品自动地生成高质量的注释
                 是未来值得关注的研究问题.
                    (4)  辅助其他软件工程任务.除了分析代码生成对应的注释外,我们还可以利用已有的研究成果辅助其他
                 软件工程任务.例如:通过分析方法或者类内的代码来生成方法名或者类名.Allamanis 等人                          [96] 借助神经概率语
                 言模型尝试着生成方法名或者类名.Jiang 等人            [97] 对基于机器学习的方法 code2vec    [47] 进行了深入分析,给出了这
                 类方法可以取得较好/较差结果的场景.基于上述观察,他们提出了一种简单的启发式方法 HeMa,该方法可以自
                 动推荐方法名,实证研究结果表明,该方法的性能要优于 code2vec.除此之外,通过分析代码还可以额外生成伪代
                 码.Oda 等人  [98] 同样基于神经机器翻译的框架,通过分析代码可以自动生成基于日语或英语的伪代码.除了上述
                 方法名/类名的自动生成和伪代码的自动生成问题外,在后续工作中,通过为各个程序模块生成高质量的代码注
                 释,还可以尝试着提高代码搜索和基于信息检索的缺陷定位方法的效率.具体来说,针对代码搜索问题,可以针
                 对基于自然语言描述的查询语句,通过与注释进行相似度计算,搜索到更为相关的程序模块.针对基于信息检索
                 的缺陷定位问题,根据缺陷报告的描述信息,通过与被测项目内程序模块的注释进行相似度计算,以迅速定位到
                 与该缺陷报告描述相关的程序模块上.
                    (5)  注释自动生成插件的开发和代码注释的自动补全.研究人员在后续研究中需要针对主流的集成开发环
                 境,开发相关的注释自动生成插件,在选定关注的代码段后,插件可以直接生成对应的代码注释,以方便开发人
                 员后续对代码注释作进一步的完善.除此之外,已有研究结果表明,直接生成高质量的代码注释比较困难,一种
                 可行的方法是在用户编写代码注释时,自动给出注释补全建议.该解决方案的好处是,一方面可以减少编写代码
                 注释的代价,另一方面也可以协助开发人员写出更多的代码注释.Movshovitz-Attias 等人                    [99] 首次针对 Java 代码,
                 基于主题模型和 n 元模型进行了尝试,他们发现使用注释自动补全方法可以节省 47%的注释输入量.Ciurumelea
                 等人 [100] 尝试着针对 Python 代码,借助神经语言模型对 Python 的文档字符串(docstring)进行补全.在后续研究工
   212   213   214   215   216   217   218   219   220   221   222