(1969-), 女, 硕士, 讲师, CCF专业会员, 主要研究领域为智能软件开发
(1979-), 男, 博士, 教授, 博士生导师, CCF高级会员, 主要研究领域为群体智能,智能软件工程, 分布式系统
源代码的摘要可以帮助软件开发人员快速地理解代码, 帮助维护人员更快地完成维护任务. 但是, 手工编写摘要代价高、效率低, 因此人们试图利用计算机自动地为源代码生成摘要. 近年来, 基于神经网络的代码摘要技术成为自动源代码摘要研究的主流技术和软件工程领域的研究热点. 首先阐述了代码摘要的概念和自动代码摘要的定义, 回顾了自动代码摘要技术的发展历程, 并介绍了生成式摘要的质量评估方法和评估指标; 然后分析了神经代码摘要算法的通用结构、工作流程和面临的主要挑战; 给出了代表性算法的分类, 并对每类算法的设计原理、特点和限制条件进行了分析. 最后, 讨论并展望了未来神经代码摘要技术的发展趋势和研究方向.
Source code summaries can help software developers comprehend programs faster and better, and assist maintenance developers in accomplishing their tasks efficiently. Since writing summaries by programmers is of high cost and low efficiency, researchers have tried to summarize source code automatically. In recent years, the technologies of neural network-based automatic summarization of source code have become the mainstream techniques of automatic source code summarization, and it is a hot research topic in the domain of intelligent software engineering. Firstly, this paper describes the concept of source code summarization and the definition of automatic source code summarization, presents its development history, and reviews the methods and metrics of the quality evaluation of the generated summaries. Then, it analyzes the general framework and the main challenges of neural network-based automatic code summarization algorithms. In addition, it focuses on the classification of representative algorithms, the design principle, characteristics, and restrictions of each category of algorithms. Finally, it discusses and looks forward to the trends on techniques of neural network-based source code summarization in future.
在软件工程领域软件人员面对数目众多的大规模软件和复杂系统需要快速、准确地读懂代码, 高效地完成软件变更和维护等任务. 源代码摘要(source code summary)可以帮助开发和维护人员更快地读懂源代码, 更好地理解代码背后的设计思想和代码的行为. 因此, 代码摘要可以大大地节省开发人员和维护人员的宝贵时间, 提高工作效率[
代码摘要研究是在自然语言处理技术(如机器翻译和自动文本摘要技术)的基础上发展起来的[
自动代码摘要研究开始于2010年, 在最初的研究中主要采用信息检索技术[
目前已有学者对自动代码摘要的研究成果进行了总结[
本文第2节对基于神经网络的自动源代码摘要研究进行概述. 先介绍代码摘要和自动代码摘要的定义, 然后对自动代码摘要研究的起源、发展和现状进行描述, 并对生成式摘要的质量评估方法和评估指标进行总结. 第3节对基于神经网络的代码摘要架构和工作流程进行描述, 引出该领域的主要挑战. 第4节介绍神经代码摘要算法的分类, 重点说明每类算法的设计原理和研究成果. 第5节总结基于深度神经网络的代码摘要技术的局限性, 并探讨未来值得关注的研究方向. 第6节总结全文.
在这部分, 首先阐述代码摘要的问题定义, 简要描述自动代码摘要研究的发展历史和研究现状, 然后总结代码摘要质量评估技术, 最后对文献的收集和整理情况进行介绍和说明.
摘要是对文档或口头演示的一种客观、概括的表示[
自动代码摘要是指用计算机自动地为源代码文件或代码片段生成简明的文本描述, 使软件人员获得完成特定任务所需要的信息[
自动源代码摘要任务可以形式化为有监督机器学习问题. 假设
在基于神经网络的自动代码摘要研究中, 代码摘要的任务经常被看作是一种机器翻译任务, 仍然可以用上式表示.
基于深度神经网络的代码摘要技术是近五年自动源代码摘要研究中的主流技术. 自动源代码摘要研究主要借用自然语言处理领域的两条研究路线: 一是文本摘要[
早期的代码摘要研究采用了文本摘要技术, 自动文本摘要研究迄今已经有50多年的历史[
另一条研究路线是借用自然语言翻译技术, 在2016年Iyer等人[
从2010年至今自动代码摘要技术经历了两个发展阶段. 第1阶段(2010–2015年)主要采用信息检索技术[
近些年, 虽然自动代码摘要研究有很多, 但是对摘要质量评估的研究很少. 生成式摘要质量的好坏是评价代码摘要算法优劣的重要依据, 因此做好代码摘要质量的评估对代码摘要技术的发展非常重要. 我们将从评估方法、评估指标和评估数据集3个方面对代码摘要质量评估进行总结.
从评估方法看, 现有两种评估方法, 一种是人工评估, 另一种是自动评估. 人工评估指有经验的开发人员逐个阅读、并从语义上分析生成的摘要与参考标准之间的相似性, 根据预先设定的问题为其打分. 这些设定的问题是围绕摘要质量评估指标提出的, 各研究设定的具体问题不同. 常用的人工评估指标有: 有用性、可读性和简洁性等. 尽管人工评估策略避免了特征选择和评估算法设计的复杂性, 但非常耗时且成本很高, 一般会从测试集中随机抽取一定数量的代码片段, 对所生成的摘要进行人工评估. 另一类是自动评估, 指借用自然语言的机器翻译评估特性和工具, 自动地评价生成摘要与参考标准之间的文本相似性. 这也是代码摘要质量评估常用的方法.
通常, 自动评估采用两类评估指标. 一类是机器翻译评估指标BLEU、METEOR, 也有使用ROUGE和CIDER进行评价的, 另一类是采用统计评估指标精确率(precision)、召回率(recall), 也有采用综合指标F1(调和平均值)等进行评价. 接下来, 对常用机器翻译的评估指标进行简要的说明.
(1) BLEU
BLEU (bilingual evaluation understudy)[
对于生成式摘要
其中,
以上是BLEU的标准定义, 在实际的使用中, 由于不同的平滑方式、n-gram匹配数的不同统计范围以及数据集中数据的不同分词方式, BLEU出现了不同的变种[
总的来说, BLEU是最常用的代码摘要质量评估指标. 由于它在自然语言翻译质量评估上, 评估结果非常接近人的评估结果而被广泛使用. 在深度神经代码摘要研究中, 现阶段仍没有专门用于生成式摘要的质量评估指标, 因此, 很多研究使用BLEU作为评估指标. 但Gros等人[
(2) METEOR
METEOR[
对于生成式摘要
其中,
(3) ROUGE
ROUGE[
(4) CIDER
CIDER[
注意, 以上评估指标中, BLEU、METEOR和ROUGE-L的取值范围是[0, 1], 也可以取对应的百分数形式, 而CIDER常取实数值.
在已有的基于深度神经网络的代码摘要研究中大多使用机器翻译评估指标进行生成式摘要质量的评估. 统计评估指标使用较少. 除了评估指标的选择对摘要算法的性能评价有很大的影响外, 评估数据集对摘要算法优劣的评价也非常重要[
从评估数据集来说, 评估数据集对代码摘要评估的结果有很大影响. 不同的评估数据集会使评估结果上下变动达33%[
为了系统地总结神经代码摘要研究的主流技术, 准确地描述本领域的最新进展, 我们认真地收集了关于深度神经网络的代码摘要技术论文, 仔细地研读. 最终, 从2016年1月到2020年12月间发表的81篇相关文献中挑选出了42篇有代表性的工作. 这些文献包含了基于深度神经网络的代码摘要技术的主要研究成果, 能够反映本领域发展的最新趋势.
在论文收集过程中, 我们首先进行了两类论文的搜索.
(1)在ACM DL、IEEE Xplore DL、DBLP、Google Scholar、Microsoft Scholar和arXiv.org中使用关键词“code+summary+deep learning”“summary”“code+summarization+deep neural network”“summarization+deep neural network”和“source code document generation”等在论文的标题、摘要和索引词中进行了检索, 并人工阅读摘要, 筛选到18篇论文.
(2)在软件工程和人工智能的会议PLDI、IEEE ICSE、IEEE FSE、IEEE/ACM ASE、ICPC、SANER、ICSME、ACM TOSEM、EMSE、AAAI、IJCAI、MSR和ICLR的论文集以及TSE、JSS和IST期刊中, 我们通过人工逐一查看标题、阅读摘要内容甚至全文, 共查找到论文16篇.
然后, 经过逐一阅读, 筛选出近5年有代表性的使用深度神经网络技术进行代码摘要研究的34篇论文. 为了更进一步收集更多相关的论文, 我们还进行了引用分析, 查找到8篇论文. 经过认真研读, 最终确定了有代表性的基于深度神经网络的自动代码摘要文献42篇(其中41篇提出了新的神经代码摘要算法, 另外1篇关注了代码摘要研究中的数据、评估指标、基线和评估中存在的问题), 这些论文的详细来源和分布情况见
Distribution of Studies, Publication Channels and Occurrences
参考文献的出版来源和分布情况
出版物名称 | 类型 | 论文篇数 | 引用编号 |
ASE | Conference | 6 | [ |
AAAI | Conference | 2 | [ |
ACL | Conference | 5 | [ |
ESE | Conference | 1 | [ |
ESEC/SIGSOFT FSE | Conference | 1 | [ |
ICPC | Conference | 2 | [ |
ICSE | Conference | 2 | [ |
ICSME | Conference | 1 | [ |
ICLR | Conference | 3 | [ |
ICML | Conference | 1 | [ |
IJCAI | Conference | 1 | [ |
IJCNN | Conference | 1 | [ |
Internetware | Conference | 1 | [ |
MSR | Conference | 1 | [ |
NeurIPS | Conference | 1 | [ |
OOPSLA | Conference | 2 | [ |
PLDI | Conference | 1 | [ |
POPL | Conference | 1 | [ |
SANER | Conference | 1 | [ |
WWW | Conference | 1 | [ |
其他会议 | Conference | 1 | [ |
Front.Comp.Sci | Journal | 1 | [ |
IST | Journal | 1 | [ |
JSS | Journal | 2 | [ |
SPE | Journal | 1 | [ |
TSE | Journal | 1 | [ |
这42篇论文随时间的分布情况如
Distribution of the selected 42 research papers over publication years
选定的42篇研究论文随出版年份分布图
本节首先描述神经代码摘要的工作流程, 接着总结和说明神经代码摘要算法的通用结构, 而后引出该技术存在的问题和挑战.
在近5年的研究中, 人们设计出了不同的基于神经网络的代码摘要系统, 这些系统采用了不同的代码表征方式和不同的神经网络内部结构, 但它们普遍使用端到端(end-to-end), 或称为序列到序列(sequence to sequence, Seq2Seq)[
The Framework of Deep Neural Network based Source Code Summarization
基于深度神经网络的代码摘要算法框架
这一阶段主要任务是对收集的源代码语料(source code corpus)进行处理, 抽取源代码和摘要, 分别进行处理, 嵌入表示为矢量, 并构建数据集, 以便训练和测试神经摘要模型. 源代码语料通常从一些开源社区, 如GitHub或Stack Overflow问答网站, 爬取高质量的开源项目构建而成. 选择这些开源项目主要是因为它们包含了高质量的源代码和更多的摘要信息.
神经代码摘要系统采用不同的方法分别处理开源项目源代码文件里的源代码及摘要. 第一, 对源代码的处理. 具体步骤是先按不同的粒度, 如方法级、类级、子程序等, 抽取源代码片段, 然后对代码片段进行相应的处理, 即对源代码进行相应的变换, 构建源代码词汇表, 然后将其嵌入(code embedding)表示为矢量. 第二, 对摘要的处理. 将源代码文件中的文本摘要抽取出来, 进行文本预处理, 如去除停用词、分词等, 构建摘要词汇表, 将摘要嵌入表示为摘要矢量. 最后用 〈代码矢量, 相应的摘要矢量〉 对构建训练数据集. 有的摘要系统[
源代码的表示是指将源代码表示为代码矢量. 它是数据处理阶段的核心任务, 下面对源代码的表示进行描述. 由于源代码中不仅包含丰富的语义信息(这一点与自然语言相同), 而且还具有明显的分层特点和嵌套结构, 以及程序内部隐含的数据流、控制流和调用依赖信息等[
不同的源代码模型采用不同的代码嵌入技术. 代码嵌入技术是代码摘要生成中的重要技术[
现有的代码嵌入方法(按应用于软件工程领域的时间顺序)有: ① one-hot词向量, 这种方法将单词表示成词典的索引, 每一个单词被表示成一个词典中该单词对应位置为1, 而其他位置为0的稀疏向量. 这种方法的缺点是无法表示词语间的语义相似度. 在神经代码摘要研究的早期有系统[
要准确、全面地表示源代码中的语义信息还与源代码词汇表有紧密关系[
模型训练阶段的主要任务[
在已有的神经代码摘要模型[
(1) 编码器
编码器的作用是利用神经网络结构将数据处理阶段得到的代码矢量进行再次编码, 以神经网络的隐态输出[
在神经代码摘要中, 编码器多采用循环神经网络(RNN)的变种, 长短期记忆模型LSTM (long short term memory)和门控循环单元GRU (gated recurrent unit)作为内部组成. 卷积神经网络CNN有时也被用于提取代码的结构信息[
(2)注意力机制
注意力机制连接编码器和解码器, 主要作用是找出系统的输入(源代码)和输出(对应的摘要)之间的关联关系, 对编码器各时刻的输出矢量进行权重的调整, 帮助解码器输出更准确的序列单词[
现有多种注意力机制[
总之, 注意力机制的作用是调整编码器输出矢量的权重帮助解码器更准确地生成摘要. 具体是计算出上下文矢量输入到解码器.
(3) 解码器
解码器是另一个神经网络, 它主要完成摘要生成任务, 即逐字生成给定代码的自然语言摘要. 它利用神经网络、在上下文矢量的指导下, 将输入进行反向解码, 即根据当前时刻上下文矢量、前一时刻解码器输出(生成的单词)和解码器当前的隐态顺序地预期下一个单词的条件概率, 逐字生成摘要[
综上所述, 在训练期间, 编码器以训练集中的代码矢量为输入, 并对其再次编码, 然后以编码器隐态形式输入到解码器和注意力机制. 接着, 在注意力机制的帮助下, 解码器以训练集中相应的摘要矢量为预期输出, 通过反向传播或随机梯度下降方法以损失函数最小为目标对摘要模型参数进行优化调整, 获得代码摘要模型的参数矩阵. 这样, 经过训练得到神经代码摘要模型.
这里的损失函数常选用负对数似然函数(negative log likelihood, NLL)[
另外, 在神经摘要模型训练过程中, 训练集规模的大小也会影响摘要模型参数的训练, 进而影响生成式摘要的准确性, 因此, 增加训练集中的数据量在一定程度上可以提升神经摘要模型的性能[
测试阶段的任务是用新的源代码文件(一般是测试数据集中的代码矢量)输入到已训练好的代码摘要模型中, 由编码器/解码器和注意力机制联合起来完成摘要生成任务, 生成相应的文本摘要. 然后按照预先设计的评估方法和选定的摘要质量评估指标以及参考摘要, 评估生成式摘要的质量, 从而评估神经代码摘要算法的性能.
在摘要模型性能评价时, 测试数据集的选择、摘要质量评估指标的选择都是非常重要的. 正如第2.3节所述, 不同的测试数据集以及对数据的不同预处理方法都会直接影响摘要模型的评估结果. 而建立统一、标准的测试数据集会对神经摘要算法的发展起积极的推动作用.
综上所述, 神经代码摘要任务的完成需要经过数据处理、模型训练和模型测试3个阶段. 从神经代码摘要处理内部来说, 关键步骤是源代码的表示和摘要生成. 由于技术的限制, 现有的代码摘要研究中还存在着很多问题和不足. 下面将对神经代码摘要研究中遇到的问题进行分析.
如前所述, 在神经代码摘要模型生成代码摘要的过程中, 首先进行源代码的表示, 即将源代码中丰富的词汇、句法和语义信息以及程序结构、数据依赖、函数调用和数据流、控制流等信息准确的表示出来, 然后, 将代码表示的结果输入训练好的神经网络模型中生成摘要. 最后, 评估生成的摘要. 现有的神经代码摘要研究做了很多的探索和尝试, 但目前生成摘要的准确率仍不高, 尚存在很大的改进空间. 在现有技术条件下, 神经代码摘要研究中存在3个主要挑战, 一是源代码的表示, 二是摘要生成, 三是测试集的统一.
挑战1. 源代码的表示
在神经代码摘要算法中源代码的表示非常重要. 源代码的表示也被称为源代码模型. 不同的源代码模型将直接影响抽取信息的质量以及抽取方法, 从而影响生成摘要的质量. 因此, 源代码模型是代码摘要算法的核心问题之一. 现有代码摘要研究中的源代码模型分为4类[
(1)基于token的源代码模型. 在这类模型中, 源代码被看作普通文本, 源代码文件被看作纯文本(plain text), 表示为源代码中token的集合(bag of tokens, BoT). 这里的token指源代码的标识符、变量名和方法名中包含的词语. 这类模型主要是从源代码中抽取关键字、主题等, 如, 文献[
(2)基于抽象语法树的源代码模型. 这类模型用抽象语法树AST的节点序列或者其子树[
(3)基于图的源代码表示模型. 它是指利用图结构表征程序的AST、解析树或控制流图(CFG)中的数据流、控制流等信息[
(4)组合的源代码模型. 在已有的代码摘要系统中, 多项研究[
由此可见, 不同的源代码模型可以表示源代码中不同类型的信息, 在基于深度神经网络的代码摘要系统中, 多数采用第2类、第3类或者组合模型表示源代码[
如前所述, 从基于token的源代码模型到基于抽象语法树的源代码模型, 再到基于图的源代码模型, 越来越适合表示源代码的结构信息. 但它们仍然不能完全地表示源代码中的结构等信息, 这样, 在代码摘要生成中就不能充分地利用代码中的这些信息. 而源代码模型能表示的源代码信息越多, 则生成摘要的质量越高. 因此, 设计一种适合于表示源代码的结构等信息的模型仍然面临很大挑战.
挑战2. 摘要生成
在神经代码摘要算法中, 摘要生成也是一个关键问题. 摘要生成组件是由
已有的神经代码摘要研究中, 摘要生成主要采用两种方式. 一种是直接利用Seq2Seq中的解码器逐字生成摘要文本. 早期的神经代码摘要研究[
挑战3. 测试数据集的统一
缺少统一、标准的数据集是影响代码摘要研究快速发展的一个主要障碍[
面对这些挑战, 现有研究进行了积极的探索, 在源代码的表示和摘要生成方面提出了各种改进, 但是, 离大幅改进摘要的准确度还有很长一段路要走.
神经代码摘要算法根据所采用的神经网络内部结构的不同分为两大类, 一类是基于RNN的摘要算法, 另一类是基于其他神经网络的摘要算法. 基于RNN的代码摘要算法根据编码器的数目又可分为基于单编码器的代码摘要算法和基于多编码器的代码摘要算法. 具体分类情况和参考文献见
通常根据内部结构的不同, 将神经网络分为3种: 卷积神经网络CNN, 循环神经网络RNN和递归神经网络(recursive neural network, RvNN)[
The Classification of Deep Neural Network based Automatic Source Code Summarization Algorithms
基于深度神经网络代码摘要算法的分类
总体上, 基于深度神经网络的代码摘要算法属于有监督机器学习算法, 因此, 需要高质量的数据集来训练神经网络模型. 通常, 用GitHub等网站的高质量开源项目的代码文件构建数据集. 数据集是为训练、确认和测试摘要算法提供数据. 这类摘要算法常采用基于抽象语法树AST的源代码模型, 即将源代码转化为AST形式、AST的token序列或者其他适合后续处理的形式作为编码层的输入, 训练集中的自然语言摘要作为摘要系统的预期输出, 经过参数训练的模型能够为目标代码生成摘要.
下面, 先总结和描述基于RNN的代码摘要算法的研究, 再讨论基于其他神经网络的代码摘要算法. 如
在基于单编码器的代码摘要算法中, 端到端框架中仅使用一个编码器. 这是一种标准的编码器-解码器结构在代码摘要任务中的应用. 在深度神经网络应用于自动代码摘要研究的早期, 主要采用这种单编码器的代码摘要算法.
在2016年首次使用LSTM神经网络和注意力机制进行代码摘要研究[
Iyer等人[
Zheng等人[
在另一项研究中, Hu等人[
由于递归神经网络RvNN可以处理自然语言句子的解析树, Liang等人[
不同于其他代码摘要系统, Lu等人[
Liu等人[
另外, 考虑到自动代码摘要与自动代码生成任务的相关性, Wei和Li[
Jiang等人[
Ciurumelea等人[
Sui等人[
Aghamohammadi等人[
总之, 在单编码器代码摘要算法中都采用了带注意力的端到端框架, 各算法采用的源代码模型不完全相同, 采用的代码嵌入方法不同, 采用的神经网络结构不相同. 虽然, 各系统在构成神经摘要系统的两个核心部件——代码表示和摘要生成上各有改进, 但综合分析可以得出, 如果从源代码中抽取的结构、语义和调用及依赖关系等信息越多, 则生成的代码摘要越准确[
基于多编码器的代码摘要算法是指在端到端框架中使用多个编码器的代码摘要方法. 因为每个编码器可以表示和抽取源代码中的一类信息, 所以, 在多个编码器的帮助下这些代码摘要生成算法可以为给定代码生成更准确的摘要. 因为摘要系统中有多个编码器, 选择何种编码器以及多个编码器的组合策略会影响整个代码摘要系统的性能. 如, 文献[
Hu等人[
2019年, Hu和Li等人又扩展了之前的DeepCom[
与上一项研究相似, 在LeClair等人[
Haque等人[
强化学习是一种通过奖励信号从真实环境中学习优化策略的方法. 在代码摘要研究中如果把摘要质量评价指标值作为奖励机制则可以帮助摘要系统生成高质量的摘要. 基于这种设想, Wan和Zhao[
在上面研究的基础上, Wang等人[
同样利用强化学习, Huang等人[
Alon等人[
源代码中包含的调用依赖信息也是代码中语义信息的重要组成部分. 它提供了代码间的调用信息, 这些信息有助于提高代码摘要的性能. 因此, 在Liu等人[
与Wei和Li的研究[
与其他代码摘要研究不同, Fernandes等人[
与文献[
Chen和Zhou[
另外, 除了以上直接利用给定源代码生成摘要的工作外, 还有一类特殊的代码摘要研究, 这类研究[
Panthaplackel等人[
总之, 在基于多编码器的代码摘要研究中, 通常会采用多个编码器对源代码的不同形式进行编码, 通过这种方法试图抽取源代码中的多种信息, 如结构信息、语义信息、调用依赖信息、API知识等. 在这种采用多编码器的摘要研究中, 源代码模型可以看作是一种混合模型. 若能设计更适合表示源代码结构的模型, 则能改进自动代码摘要的性能. 在本节总结的工作中, 基于图的神经源代码模型更适合表示源代码中的结构信息, 因此成为目前软件工程和自动代码摘要研究的热点.
尽管Seq2Seq模型通常使用RNN构造编码器和解码器, 但是在自然语言翻译任务中卷积神经网络CNN模型也可以构造编码器-解码器结构. CNN编码器-解码器结构的优点是, 在训练期间, 对所有输入元素的计算全部可以并行完成, 而且还可以实现参数共享, 这样可以更好地利用GPU硬件. 因此, 在神经代码摘要研究中, 经过精心设计的卷积神经网络也可以表示源代码中的语法、语义和结构信息, 而且它可以分层地表示输入序列. 因此, 在端到端框架下CNN也可以完成代码摘要任务[
Allamanis等人[
在另一项研究中, Mou等人[
在实践中, 研究人员发现神经网络难于解决的低频词问题可以用其他技术解决. 因此, Wei等人[
同样, 为了解决低频词问题, Zhang等人[
不同于其他基于神经网络的代码摘要模型, Ahmad等人[
2019年, Alon等人[
Allamanis等人[
Wang和Su[
Liu等人[
Zhou等人[
为了克服现有图神经网络表示源代码AST或解析树等大图时精确性差、消息传递时资源消耗大等弱点, Wang等人[
为了更多地利用源代码中的信息, Cai和Liang等人[
在现有的文献中RNN和CNN都可以用来建模源代码. 因为RNN中的GRU和LSTM擅长表示长输入序列中的远距离特性, 所以在编码器-解码器结构中常采用LSTM或其变种作为编码器和解码器的构成单元. CNN则利用卷积注意力或者是卷积层来编码源代码的结构特性和位置模型.
总之, 在基于深度学习的代码摘要算法中常采用RNN、LSTM、GRU或CNN建模源代码, 完成生成/预测/更新代码摘要的任务. 而且注意力机制已经成为端到端神经代码摘要模型中重要的组成部分, 它改进了生成摘要的准确度, 提高了摘要系统的性能. 尽管基于深度神经网络的摘要生成算法, 取得了较好的效果, 但是他们仍然难于同时建模源代码中多类复杂的信息, 这也是神经代码摘要研究很难有突破性进展的主要原因之一. 因此, 未来组合源代码模型的设计和改进将是一个流行的研究方向
前文详细地总结了3类基于深度神经网络的代码摘要生成算法, 后文将对神经代码摘要生成算法的局限性进行归纳讨论, 并探讨未来的研究方向.
基于深度神经网络的代码摘要算法利用神经机器翻译(neural machine translation, NMT)技术在前一个生成词的帮助下, 依据最大相似性原则从语料库中选出相应的词语逐字生成摘要. 这种算法主要是利用经典的编码器-解码器框架对序列数据的良好转换能力, 它可以将源语言序列转换为目标语言序列. 虽然这种经典的结构在自然语言翻译中取得了很好的翻译效果, 但是, 由于编程语言具有明显的结构性和分层等特性, 所以当神经机器翻译方法运用到代码摘要生成时, 将源代码看作一种普通文本进行处理, 这样势必会造成源代码结构的缺失, 使神经代码摘要算法的摘要效果变差. 总体来看, 基于神经网络的自动代码摘要系统生成摘要的准确率不高.
归纳起来, 神经代码摘要算法存在两个局限性, 一是编码器-解码器结构只考虑了代码的序列信息而未考虑代码中的结构信息等隐含语义, 二是基于最大相似性的神经代码摘要模型在测试时会遇到训练数据中的低频词或未登录词不能正确生成的问题. 这样, 即使训练数据集足够大、质量足够好, 仍不能正确地生成低频词; 而且当摘要模型应用到一个不同领域的代码文件时, 还会因遇到训练集中没有的词语而无法生成准确的摘要. 这两类问题是神经代码摘要算法的主要问题.
针对神经代码摘要的上述局限性, 现有的研究正在通过各种改进、增强和融合等方案(如第4部分所讨论的), 努力消除这种影响. 但是, 由于源代码内部的复杂性和现有神经网络技术的限制, 目前神经代码摘要技术仍处于研究探索阶段, 距离真正应用到软件工程实践中还有很长一段路要走, 还需要很多努力. 归纳起来, 未来基于深度神经网络的自动代码摘要研究有以下3个方向.
(1)设计更适合表示代码结构的源代码模型. 由于端到端神经网络不能表示源代码的结构等信息, 所以与代码表示相关的源代码模型显得尤为重要, 而多个源代码模型的组合更适合于解决代码的表示问题. 因此, 多个源代码模型的恰当融合将是未来的研究方向. 另外源代码词汇表的合理设计也是未来神经代码摘要的研究方向之一.
(2)探究多种方法融合的神经代码摘要生成技术. 现在, 深度神经网络技术已经成为解决代码摘要自动生成的主流技术, 并且取得了一些进展. 但是, 现有的神经代码摘要算法在遇到低频词问题时, 摘要模型无法正确地生成摘要, 而其他非神经代码摘要方法则可以较好地解决低频词问题, 如基于信息检索技术的代码摘要方法、基于模板的代码摘要方法等都可以较好地解决这个问题. 因此, 探究深度神经网络与其他摘要算法的融合是一个可行的方案, 具有开放的研究前景.
(3)统一测试数据集. 如前所述, 没有统一的测试数据集会使摘要算法评估结果无法比较, 使代码摘要研究发展缓慢. 但因数据集中数据不同的处理方法和编程语言的独立性, 测试数据集无法统一和标准化. 同时, 测试数据集的规模和质量也直接影响神经摘要算法的评估结果. 目前, 设计一个统一、标准的测试数据集也是未来的一个重要研究方向.
归纳起来, 为了提高自动代码摘要系统的性能可以从3方面努力, 一是设计更适合抽取源代码结构信息的源代码模型; 二是探究多种方法融合的神经摘要生成技术; 三是测试数据集的统一.
另外, 在文献[
深度神经网络是实现自动代码摘要的主流方法, 也是当前软件工程领域的研究热点. 针对基于神经网络的自动代码摘要这一研究主题, 本文对近年来在重要国际会议和期刊上发表的相关文献进行全面检索和深入分析, 对相关算法进行了系统性的总结和梳理. 我们描述了代码摘要的定义, 简述了代码摘要研究的发展历史及摘要质量评估, 对神经代码摘要系统的工作流程和面临的挑战进行了分析, 重点探究了3类基于深度神经网络的代码摘要算法: 基于RNN单编码器的代码摘要算法、基于RNN多编码器的代码摘要算法和基于其他神经网络的代码摘要算法. 通过总结和分析神经代码摘要生成算法的局限性, 探讨了神经代码摘要研究的未来发展方向.
Nazar N, Hu Y, Jiang H. Summarizing software artifacts: A literature review. Journal of Computer Science and Technology, 2016, 31(5): 883–909.
10.1109/SCAM.2015.7335404]]]>
10.1145/2491411.2494587]]]>
Nazar N, Jiang H, Gao GJ, Zhang T, Li XC, Ren ZL. Source code fragment summarization with small-scale crowdsourcing based features. Frontiers of Computer Science, 2016, 10(3): 504–517.
10.1109/ASE.2013.6693113]]]>
10.1109/SANER.2015.7081848]]]>
Fowkes J, Chanthirasegaran P, Ranca R, Allamanis M, Lapata M, Sutton C. Autofolding for source code summarization. IEEE Trans. on Software Engineering, 2017, 43(12): 1095–1109.
10.1145/3238147.3238190]]]>
10.1109/MSR.2015.49]]]>
10.1145/2597008.2597793]]]>
10.1109/ICSE-C.2017.169]]]>
10.1109/ICSE.2012.6227135]]]>
10.1145/1810295.1810335]]]>
https://wiki.eecs.yorku.ca/course_archive/2010-11/F/6390/_media/vector_space_model.pdf]]>
http://scholarpedia.org/article/Latent_semantic_analysis]]>
Blei DM, Ng AY, Jordan MI. Latent dirichlet allocation. Journal of Machine Learning Research, 2003, 3: 993–1022.
Song XT, Sun HL, Wang X, Yan JF. A survey of automatic generation of source code comments: Algorithms and techniques. IEEE Access, 2019, 7: 111411–111428.
https://groups.niso.org/apps/group_public/download.php/14601/Z39-14-1997_r2015.pdf]]>
10.1109/ICPC.2013.6613829]]]>
10.1109/WCRE.2010.13]]]>
10.1145/1858996.1859006]]]>
10.1145/3361242.3362774]]]>
Badihi S, Heydarnoori A. CrowdSummarizer: Automated generation of code summaries for java programs through crowdsourcing. IEEE Software, 2017, 34(2): 71–80.
10.1109/IJCNN.2019.8851751]]]>
10.1145/3387904.3389268]]]>
10.1007/978-981-15-0310-8_1]]]>
10.1109/ICPC.2013.6613830]]]>
10.1109/ICPC.2013.6613855]]]>
10.1109/ICICCT.2018.8473199]]]>
10.1109/ICSE.2019.00087]]]>
10.1145/3379597.3387449]]]>
10.1145/3338906.3338971]]]>
10.1145/3238147.3238206]]]>
10.475/123_4]]]>
10.1109/ICSM.2013.65]]]>
10.18653/v1/P16-1195]]]>
Zheng WH, Zhou HY, Li M, Wu JX. CodeAttention: Translating source code to comments by exploiting the code constructs. Frontiers of Computer Science, 2019, 13(3): 565–578.
10.1109/ASE.2015.36]]]>
10.3115/1073083.1073135]]]>
10.1145/3324884.3416546]]]>
10.1109/CVPR.2015.7299087]]]>
10.18653/v1/N19-1394]]]>
10.1145/3238147.3240471]]]>
10.1109/ASE.2017.8115626]]]>
10.1145/3324884.3416581]]]>
10.1145/3324884.3416578]]]>
10.5555/3015812.3016002]]]>
10.18653/v1/P17-2045]]]>
10.18653/v1/2020.acl-main.449]]]>
10.18653/v1/2020.acl-main.168]]]>
10.18653/v1/2020.acl-main.27]]]>
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.
10.1145/3368089.3417926]]]>
10.1145/3377811.3380383]]]>
10.1109/ICSME46990.2020.00114]]]>
10.24963/ijcai.2018/314]]]>
10.1145/3428301]]]>
10.1145/3428205]]]>
10.1145/3385412.3385999]]]>
10.1145/3290353]]]>
10.1109/SANER48275.2020.9054866]]]>
10.1145/3366423.3380295]]]>
Huang Y, Huang SH, Chen HC, Chen XP, Zheng ZB, Luo XP, Jia N, Hu XY, Zhou XC. Towards automatically generating block comments for code snippets. Information and Software Technology, 2020, 127: 106373.
Liu F, Zhang L, Jin Z. Modeling programs hierarchically with stack-augmented LSTM. Journal of Systems and Software, 2020, 164: 110547.
Aghamohammadi A, Izadi M, Heydarnoori A. Generating summaries for methods of event-driven programs: An Android case study. Journal of Systems and Software, 2020, 170: 110800.
Zhou ZY, Yu HQ, Fan GS. Effective approaches to combining lexical and syntactical information for code summarization. Software: Practice and Experience, 2020, 50(12): 2313–2336.
10.1109/TSE.2020.2979701]]]>
10.5555/2969033.2969173]]]>
10.1109/ICSE.2019.00086]]]>
10.18653/v1/D16-1162]]]>
10.1145/3106237.3106290]]]>
10.5555/3295222.3295349]]]>
10.18653/v1/D15-1166]]]>
10.5555/3045118.3045336]]]>
10.1109/ICPC.2012.6240510]]]>
10.1145/2597008.2597149]]]>
10.1109/ICPC.2011.28]]]>
McBurney PW, Collin McMillan. Automatic source code summarization of context for java methods. IEEE Trans. on Software Engineering, 2016, 42(2): 103–119.
Pouyanfar S, Sadiq S, Yan YL, Tian HM, Tao YD, Reyes MP, Shyu ML, Chen SC, Iyengar SS. A survey on deep learning: Algorithms, techniques, and applications. ACM Computing Surveys, 2019, 51(5): 1–36.
10.5555/3305381.3305510]]]>
10.3115/v1/P14-1062]]]>
10.3115/v1/D14-1179]]]>
Allen FE. Control flow analysis. ACM SIGPLAN Notices, 1970, 5(7): 1–19.