code summarization 学习小结

本文主要是代码注释自动生成方法综述这篇论文的缩减版本,用于学习代码注释相关工作以及完成课程作业。


摘要

代码注释自动生成问题是当前程序理解研究领域的一个研究热点,本文主要对基于深度学习的代码注释生成方法进行了分析和点评,并对未来值得关注的研究方向进行了展望。

关键词: 代码注释自动生成;深度学习;机器翻译


1. 研究背景

代码注释就是在编写程序时,给语句、程序段、函数等添加的解释或提示。如果将代码比作诗句,那么代码注释就如同诗句的注解,好的注解常常能够帮助我们快速理解诗人想要表达的情感,而好的代码注释也能大大节约理解代码的时间。然而编写高质量的注释是一件很费时费力的事情,已经写好的注释也可能随着程序的迭代更新而过时,于是,研究人员开始了代码注释自动生成技术的研究。

代码注释自动生成是一个比较新颖的研究方向,关于代码注释和程序可读性的研究最早可以追溯到1980年代,而代码注释自动生成的历史才刚刚开始于近十年。图1 [1] 统计了每年发表的相关论文总数,不难看出代码注释自动生成问题是近年来的一个研究热点。

在这里插入图片描述
图1 相关论文每年累计发表的论文数

现有的注释生成方法可以分为基于模板的生成方法、基于信息检索的生成方法和基于深度学习的生成方法三个类别,这些方法通常由三部分组成,一是准备数据,比如搜集大量的开源代码以及对应的注释作为数据集;二是提取源代码的特征表示,其目的是捕获源代码的结构和语义等信息;三是生成文本,根据从源代码中提取的信息生成自然语言句子。2010年,Haiduc等人 [2] [3] 首次借助信息检索技术,尝试为代码自动生成文本摘要。在2016年之前,研究人员大多集中于基于模板的生成方法和基于信息检索的生成方法,借助启发式规则从代码内提取关键信息,并合成基于自然语言描述的注释。随着深度学习技术的迅猛发展和更多代码注释语料库的逐步共享,基于深度学习的方法有效提升了自动生成注释的质量,并成为该问题的一个主流研究方向。2016年,Iyer等人[4]基于深度学习中的序列到序列模型(sequence to sequence model),提出了CODE-NN方法,后续的相关研究基本上都集中于利用神经机器翻译领域的最新研究成果来解决该问题,重点研究代码结构信息和自然语言描述间的隐含关系,并且取得了较好的注释生成效果。

当然,在研究代码注释自动生成问题时,研究人员也面临着诸多挑战:首先,高质量的代码注释离不开对代码结构和语义的高质量分析,而代码语义分析在当前的软件工程领域仍然是一个富有挑战性的问题。其次,如果仅分析代码本身,有时候并不足以生成高质量的代码注释,因此还需要研究如何利用项目缺陷跟踪系统和版本控制系统内的领域知识,以及来自Stack Overflow和Github的众包知识。最后,目前的研究在对生成的代码注释进行质量评估时,主要采用的是手工评估方法和自动评估方法,然而,使用手工评估方法打分时,由于受限于专家对编程语言和领域知识的熟悉程度,容易存在主观性较强的问题;自动评估方法一般使用来自机器翻译研究领域的评测指标,但是代码与自然语言存在许多差异,代码注释自动生成问题也不等同于机器翻译问题,而且训练注释生成模型时所使用的数据集通常来源于网络,注释质量难免参差不齐,使用机器翻译的指标来计算原注释与模型生成注释的相似度,然后用该相似度来代表生成注释的质量,显然是不合适的。

前面我们提到,现有的注释生成方法可以分为三个类别:基于模板的生成方法、基于信息检索的生成方法和基于深度学习的生成方法,由于篇幅限制,本文将着重介绍基于深度学习的生成方法。


2. 基于深度学习的生成方法

基于深度学习的生成方法主要基于代码的naturalness假设[6][7],该假设由Hindle等人在2012年首次提出,他们认为软件的代码是由开发人员编写的,因此具有一些可预测的统计特征,这些统计特征是可以被语言模型所捕获的,就像自然语言那样。该方法目前主要将代码注释自动生成问题建模为神经机器翻译(neural machine translation,简称NMT)问题[8]。

2.1 基于经典编码器-解码器模型的方法

当前基于深度学习的生成方法主要使用编码器-解码器结构(encode-decoder structure),有时又被称为序列到序列模型(sequence to sequence model)。具体来说,编码器的作用是将源代码编码为固定长度的向量表示,解码器的作用是将源代码的向量表示进行解码,并生成代码注释。不同的编码器-解码器的主要区别在于代码的输入形式和神经网络的结构。常见的神经网络结构包括:CNN(Convolutional Neural Network)和RNN(Recurrent Neural Network)。LSTM(long short term memory)是最常见的一种RNN网络,他考虑了三个门控,即输入门控、遗忘门控和输出门控,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸的问题。GRU(gated recurrent unit)是LSTM的一种优化算法,他缓解了LSTM中存在的结构复杂和实现复杂等问题,并可以有效减少训练模型所需的时间。GRU仅考虑了两个门控,即更新门控和重置门控。同时,研究人员还在RNN的基础上进一步考虑了注意力机制(attention mechanism),他为编码器或解码器的相关序列中高相关度的词素赋予了更高的权重,进一步缓解了长序列的训练过程中存在的相关问题。

Iyer等人[4]首次对这类方法展开研究,并提出CODE-NN方法,在编码和解码的时候均基于LSTM和注意力机制。在Allamanis等人[9]提出的方法中,编码器使用CNN和注意力机制,解码器使用GRU。Zheng等人[10]提出一种新颖的注意力机制,即代码注意力(code attention)机制,该机制通过利用代码段的领域特征(例如symbols和标识符)来理解代码结构,通过这些领域特征,代码注意力机制可以更好地理解代码段的结构信息。Liang和Zhu[11]基于Code-RNN进行编码,在解码的时候使用Code-GRU。Ahmad等人[14]利用Transformer模型来生成代码注释。Transformer模型是一种基于多头自注意力的序列到序列模型,可以有效捕获长程依赖(long-range dependencies)。

Hu等人[12]提出了DeepCom方法,该方法通过抽象语法树(abstract syntax tree,简称AST)来分析Java方法的结构信息及语义信息,并将AST转换成序列。为了更好地表示AST所包含的结构信息,并且确保转换后的序列没有歧义,他们提出了一种新的AST遍历方法——SBT(structure-based traversal)。SBT将节点包含的子树囊括在一对括号之内。借助括号,不仅可以有效地表示出AST的结构,而且能够无歧义地将转换后的序列恢复成转换前的AST。此外,为了进一步解决OOV(out of vocabulary)问题,避免AST序列中包含大量的< UNK >标签,他们提出了一种表示未知词素的新方法,该方法使用未知词素的类型来代替之前使用的通用词素值< UNK >。基于DeepCom方法,Hu等人进一步提出了Hybrid-DeepCom方法[13],该方法主要做了三方面的改进:首先,Hybrid-DeepCom综合使用了代码信息和AST转换后的序列信息;其次,基于驼峰命名规范,Hybrid-DeepCom将标识符进一步划分为多个单词来缓解OOV(out of vocabulary)问题;最后,该方法使用束搜索(beam search)来生成代码注释。

考虑到代码会随着程序的迭代更新而产生变更,研究人员也提出了针对代码变更生成提交消息的方法。已有的方法生成的提交消息仅包含代码变更的内容以及变更发生的位置,生成的提交消息也比较冗长,此外,这些方法较少关注代码变更的提交原因,而这一类信息可以通过分析已有的代码变更来获取。Loyola等人[15]初步证实了这种类型方法的可行性。Jiang等人[17][16]将该问题视为NMT问题,其编码器和解码器均基于RNN。此外,他们还实现了质量保证过滤器,该过滤器可以识别难以生成高质量提交消息的代码变更,并返回警告信息。进一步地,Jiang等人[19]又从数据集质量入手,借助代码语义分析方法对数据集进行了预处理,有效提升了已有方法[17]的性能。Xu等人[18]考虑了代码结构信息和OOV问题,提出了CODISUM方法。Liu等人[20]提出ATOM方法,基于AST,该方法首先对代码变更进行编码,随后使用一个混合排序模块,以迭代的方式从已生成的或已检索的提交消息中选出最为相关的提交消息。Liu等人[21]针对Pull Request(PR)来生成代码注释。该方法主要基于PR内的提交消息和新增的代码注释,针对ROUGE指标进行优化,并且借助指针生成网络(pointer generator network)来缓解OOV问题。

2.2 综合使用其他类型的学习算法

除了上述经典的基于编码器-解码器模型的方法,研究人员最近也尝试综合使用其他类型的学习算法来进一步提升性能,例如图神经网络、强化学习和对偶学习等。

在强化学习方面,Wan等人[22]提出Hybrid-DRL方法,该方法同时考虑了混合代码表示和深度强化学习。在混合代码表示中,他们综合使用了基于序列的LSTM和基于AST的LSTM这两类LSTM,以更好地表示目标代码。随后,他们进一步使用深度强化学习框架(即actor-critic network)来解决解码时面临的曝光偏差(exposure bias)问题,以获取更好的性能,其中演员网络(actor network)可以根据当前状态给出预测出下一个单词的置信度,可以视为局部指导,而评论者网络(critic network)可以根据当前状态的所有可能扩展对奖励价值进行评估,可以视为全局指导。为了更加有效地训练这两个网络,他们使用标准的有监督学习和交叉熵损失来预训练演员网络,同时使用均方损失来预训练评论者网络,然后基于BLEU评测指标的优势奖励(advantage reward)和策略梯度(policy gradient)来训练这两个网络。Wang等人[23]对上述方法进行了扩展:首先使用类型增强的AST序列来对代码进行表示,其次使用分层注意力网络(hierarchical attention network)来对序列进行编码。

2.3 考虑其他信息来源

除了上述研究工作,一些研究人员尝试利用其他信息(例如API序列信息、与目标代码相似的代码段、方法的上下文信息等)来进一步提升生成的注释质量,由于篇幅限制,这里不再赘述。


3. 总结与展望

代码注释自动生成任务是当前程序理解研究领域的一个重要应用场景,针对该问题的研究具有丰富的理论研究价值和工业应用前景。本文主要对基于深度学习的生成方法的经典工作进行了介绍和评点。虽然研究人员针对代码注释自动问题已经取得了一系列高质量的研究成果,但该问题仍有很多研究点值得研究人员进一步关注。

(1)搭建统一的实验平台以集成更多的语料库、评测指标和基准方法等。虽然研究人员陆续共享了多个代码注释语料库,但目前还没有一个大家都普遍认可的统一语料库。在后续研究工作中,亟需搭建一个统一的实验平台,以支持基于更多编程语言的语料库。此外,希望能够基于该实验平台,使用统一的深度学习框架来实现已有的经典方法和目前主流的评测指标,从而避免编程细节的不同对实证研究结论造成影响。

(2)注释自动生成插件的开发和代码注释的自动补全。研究人员在后续研究中需要针对主流的集成开发环境,开发相关的注释自动生成插件,在选定关注的代码段后,插件可以直接生成对应的代码注释,以方便开发人员后续对代码注释作进一步的完善。除此之外,已有研究表明直接生成高质量的代码注释比较困难,一种可行的方法是在用户编写代码注释的时候,自动给出注释补全建议。该解决方案一方面可以减少编写代码注释的代价,另一方面也可以协助开发人员写出更多的代码注释。

(3)自动化的评估方法。大部分工作在注释质量评估时都考虑了人工评估的方法,但这种评估方法较为主观,与参与评估的人员的编程经验和对项目所在领域知识的了解密切相关。在基于深度学习的生成方法中,大部分研究人员直接使用机器翻译领域中的评价指标,但代码注释生成问题与机器翻译问题仍存在一定的区别:首先,代码注释和代码的长度并不相当,通常来讲,代码注释的长度要远小于代码的长度;其次,代码注释自动生成任务面临OOV(out of vocabulary)问题,即需要生成的注释可能含有未曾在代码中出现过的单词;最后,目前语料库中代码对应的注释质量并不乐观,因此基于语料库中注释计算出的评测指标值,并不一定能够真实反映出代码注释的质量,难免会对不同方法间的性能比较结论的有效性产生影响。因此,如何寻找更加客观的评估代码注释质量的评测指标仍是一个富有挑战性的问题,也是现有研究成果应用到实际开发过程中的一个重要阻碍。

(4)从挖掘众包知识网站、分析相关软件制品和学习优秀注释风格等角度,来进一步提升生成的代码注释质量。首先,一方面需要充分利用来自Stack Overflow和Github平台上的众包知识,另一方面,也可以充分利用项目内的相关知识,例如考虑项目软件仓库内的其他类型文档,来进一步提升注释的生成质量。其次,在已有的生成代码注释基础上,我们还可以进一步尝试优秀代码注释风格的学习。最后,可以考虑面向特定领域的项目的代码注释生成,因为特定领域会有特定的术语,因此可以为这个领域构建一个知识图谱,并且将知识图谱内的知识融合到模型的训练过程中。

若能针对上述挑战提出有效的解决方案,开发人员在代码注释的编写上将节约大量的时间,同时自动生成的高质量的注释也可以为项目的后续维护提供重要的保障。


参考文献

[1] 代码注释自动生成方法综述。 陈翔,杨光,崔展齐,孟国柱,王赞 软件学报。2021。
[2] Haiduc S, Aponte J, Moreno L, Marcus A. On the use of automated text summarization techniques for summarizing source code. In:Proceedings of the 2010 17th Working Conference on Reverse Engineering, 2010. 35-44.
[3] Haiduc S , Aponte J, Marcus A. Supporting program comprehension with source code summarization. In: Proceedings of the2010 ACM/IEEE32nd international conference on software engineering, 2010. 223-226.
[4] Iyer S, Konstas I, Cheung A, Zettlemoyer L. Summarizing source code using a neural attention model. In:Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics, 2016. 2073-2083.
[5] Haiduc S, Aponte J, Moreno L, Marcus A. On the use of automated text summarization techniques for summarizing source code. In:Proceedings of the 2010 17th Working Conference on Reverse Engineering, 2010. 35-44.
[6]Allamanis M, Barr ET, Devanbu P, Sutton C. A survey of machine learning for big code and naturalness. ACM Computing Surveys, 2018, 51(4), 1-37.
[7]Hindle A, Barr ET, Su Z, Gabel M, Devanbu P. On the naturalness of software. In: Proceedings of the2012 34th International Conference on Software Engineering, 2012. 837-847.
[8]Li YC, Xiong DY, Zhang M. A survey of neural machine translation. Chinese Journal of Computers. 2018, 41(12):2734-2755
[9]Allamanis M, Peng H, Sutton C. A convolutional attention network for extreme summarization of source code. In: Proceedings of the International conference on machine learning, 2016. 2091-2100.
[10]Zheng W, Zhou HY, Li M, Wu J. Code attention: Translating code to comments by exploiting domain features, 2017. arXiv preprint arXiv:1709.07642, 2017.
[11]Liang Y, Zhu K. Q. Automatic generation of text descriptive comments for code blocks. In: Proceedings of Thirty-Second AAAI Conference on Artificial Intelligence, 2018.
[12]Hu X, Li G, Xia X, Lo D, Jin Z. Deep code comment generation. In: Proceedings of 2018 IEEE/ACM 26th International Conference on Program Comprehension, 2018. 200-20010.
[13]Hu X, Li G, Xia X, Lo D, Jin Z. Deep code comment generation with hybrid lexical and syntactical information. Empirical Software Engineering, 2020, 25(3): 2179-2217
[14]Ahmad WU, Chakraborty S, Ray B, Chang KW. A Transformer-based Approach for Source Code Summarization. arXiv preprint arXiv:2005.00653. 2020 May 1.
[15]Loyola P, Marrese-Taylor E, Matsuo Y. A neural architecture for generating natural language descriptions from source code changes, 2017. arXiv preprint arXiv:1704.04856.
[16]Jiang S, McMillan C. Towards automatic generation of short summaries of commits. In: Proceedings of the2017 IEEE/ACM 25th International Conference on Program Comprehension, 2017. 320-323.
[17]Jiang S, Armaly A, McMillan C. Automatically generating commit messages from diffs using neural machine translation. In: Proceedings of the 2017 32nd IEEE/ACM International Conference on Automated Software Engineering, 2017. 135-146
[18]Xu S, Yao Y,Xu F, Gu T, Tong H, Lu J. Commit Message Generation for Source Code Changes. In:Proceedings of the Twenty-Seventh International Joint Conference on Artificial Intelligence.2019. 3975-3981
[19]Jiang S. Boosting neural commit message generation with code semantic analysis. In: Proceedings of the 2019 34th IEEE/ACM International Conference on Automated Software Engineering, 2019. 1280-1282.
[20]Liu S, Gao C, Chen S, Nie LY, Liu Y. ATOM: Commit Message Generation Based on Abstract Syntax Tree and Hybrid Ranking.IEEE Transactions on Software Engineering, 2020
[21]Liu Z, Xia X, Treude C, Lo D, Li S. Automatic generation of pull request descriptions. In: Proceedings of the 2019 34th IEEE/ACM International Conference on Automated Software Engineering, 2019. 176-188
[22]Wan Y, Zhao Z, Yang M, Xu G, Ying H, Wu J, Yu PS. Improving automatic source code summarization via deep reinforcement learning. In:Proceedings of the 33rd ACM/IEEE International Conference on Automated Software Engineering, 2018. 397-407.
[23]Wang W, Zhang Y, Sui Y, Wan Y, Zhao Z, WuJ, … Xu G. Reinforcement-Learning-Guided Source Code Summarization via Hierarchical Attention. IEEE Transactions on Software Engineering, 2020.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值