0%

<论文>一篇关于自动生成源代码评论的报告

A Survey of Automatic Generation of SourceCode Comments_ Algorithms and Techniques综述论文阅读笔记

一篇关于自动生成源代码评论的报告

摘要

代码评论主要用于提高源码的可读性与可理解性。
第一步,大致的分析了代码评论的挑战与调查框架;第二,介绍了典型的算法分类,设计原理、以及各个算法的优缺点。本论文提供了代码评论的质量评估概述,最后总结一些关于代码评论生成和评论质量检测未来的方向。

介绍

代码评论主要是针对程序的功能与意义大致描述。不仅仅通过代码评论提高代码可理解性,有研究提出通过定义一个长的描述性的方法类名等,提示代码的用处。

之前用于代码注释的方法是机器学习或者基于信息检索技术,评论的框架大致分为三个方面:数据准备;源代码表达;文本生成
在这里插入图片描述
代码注释与注释的质量检测是相辅相成的,质量检测标注的指定是代码注释领域的一大挑战。
代码注释是软件工程与人工智能的交叉研究领域,发了好多顶会。本论文解决的问题:1.使研究人员能够访问具有代表性的算法目录,以进行自动注释生成,并使新研究人员对自动代码注释的最新算法有很好的了解; 2.总结现有研究的主要挑战和局限性
第二部分提供了自动生成评论的动机,并讨论了技术挑战。 第三节讨论了注释生成技术的核心思想,并对各种技术进行了总结。 在第四节中,我们讨论了注释的质量评估问题,并以不同研究中使用的数据集为重点,并总结了代码注释的质量评估标准。 第五节将讨论自动代码注释生成的未来方向。在第六节中,我们总结了本文

自动生成代码注释的概述

A、问题陈述
代码注释生成主要就是将程序性语言转化为自然语言的描述,不仅描述了代码的功能也体现出编程者背后的思想。简单讲就是通过代码分析,揭示出设计意图,代码逻辑、程序功能、相关参数的含义。
B、代码自动生成与研究框架的挑战
目前的研究算法工作流程大致都和图一中的一致。
自动代码评论的过程通常分为三个方向:第一,将数据收集用于构建评论生成体系的数据集。这些被用于训练、验证、测试模型,提取代码与相对应的评论,或者提取评论生成系统中所需要的特殊规则。通常通过对开源社区或者网站爬取、下载等方式获得数据集。第二、通过确定的算法评论生成。第三节具体讲解。第三、评论质量检测。有俩种流行的方法:人工检测与自动化检测。这将会在第四节讲解。

依据检测结果会有不同的进一步措施:评测结果令人满意,评论过程就会停止;否则,程序会回到第一步:准备更多的更合适的数据 或者调整源码处理算法,继续下面的过程。重复上述过程。

1.)目前的挑战

a:挑战一:代码自动注释算法
总结为三类算法;1.基于信息检索算法2.基于深度神经网络算法3.其他代码自动生成算法(详细见第三节)
源码模型:ASTs、 分析树、上下文token、CFGs、数据流等等
上述模型被分为三种目录:1.基于token的代码模型,从源码中提取关键词或者关于主题的词语,词袋模型(BoT)或者(Bow).基于信息检索的算法主要通过模型去表示源码。2.基于句法规则的模型,主要是抽象语法树,基于深度神经网络3.其他模型。
缺少可以综合表示源码各种信息的复合模型。目前的困难就是寻找一个这种综合性 的模型。
文本生成:在代码评论的项目中,必须在构建自然语言注释之前先提取出代码语言的相关信息,这是一个难点
现存的文本生成算法可以分为三种:1.基于事先设定好的规则生成2.基于解码编码生成(encoder-decoder模型)3.基于文本检索,从语料库种查询现存的相似注解

b、挑战二:注释质量检测
存在两个问题:验证测试算法需要统一的数据集评估标准的选择

统一的数据集:需要将测试的数据集做一个统一,但是,由于每个特定的注释生成算法都具有语言依赖性,因此要统一数据集进行测试就具有挑战性。

评估标准的选择:设计和制定适当的注释质量评估指标非常重要,这将促进自动代码注释生成的研究

2.)research framework
目前,关于代码注释的研究文献主要集中在注释与代码可读性之间的关系,注释与代码可理解性之间的关系,代码注释的自动编程算法和质量评估等方面。
通常我们从两个方面总结目前的代码注释与相关研究:自动程序注释技术代码注释的质量评估。我们会在本片论文种讨论分析注释的质量检测问题。另一种与代码注释相关的工作是在于引导开发者在何处进行正确的代码注释???这也能是一个方向??,旨在提高代码的可读性。
在这里插入图片描述

本文重点研究评论生成算法和评论质量评估算法。 这两条工作线相互依存,它们的关系如图2所示。

3.)代码注释技术领域的发展趋势
2010-2014大多数采用信息检索的方法;
近五年大多采用深度神经网络技术。
为了研究从最近十年发表的59篇论文中选出32篇代表性的论文阅读文献。
在这里插入图片描述
图3显示了多年来根据论文中使用的算法类型分配的论文,本图印证了上面关于技术趋势的总结(信息检索和深度神经网络)。图3表明最近的研究主要集中在基于深度神经网络的评论技术上

代码注释的算法

本节主要展示代码注释的相关算法的分类:
A、算法分类
三类:如图
在这里插入图片描述
B、基于信息检索的评论生成算法
给一个无注释的源码以及一个拥有注释的源码数据集,基于信息检索的算法可以计算出无注释源码与数据集的相关性,并精确的预测出无注释源码的相应注释。
基于信息检索技术的注释算法通常利用基于向量空间模型(VSM),潜在语义索引(LSI)和潜在狄利克雷分配(LDA)的技术或其他相关技术,例如代码克隆检测(代码查重)。信息检索(IR)技术在软件工程领域的早期应用之一是关于代码和注释之间的可追溯性。

2003年,Marcusand Maletic [45]利用潜在语义索引(LSI)技术,对源代码和外部文档进行分析,以从程序和文档中提取语义信息,并进一步恢复了文档和源代码之间的链接。 尽管研究本身并不涉及自动注释生成的问题,但该方法可以应用于代码注释。在现有文献中,相似性比较不是直接以源代码文本的形式进行的。
大多数注释系统将源代码转换为解析树(parse tree)或抽象语法树(AST)的形式,然后将目标代码与数据集中的其他源代码进行比较,根据比较结果返回响应的matched代码。采用启发式规则对匹配码的对应注释进行过滤。最后获得最匹配的对应代码注释作为输入无注释源码的注释。总的来说,这些算法通常通过搜索或设计规则来生成评论文本。

1)基于VSM/LSI 的代码注释生成算法

VSM(基于向量空间模型)/LSI (潜在语义索引)

当我们使用VSM和/或LSI为源代码生成注释时,源代码文本或查询文本通常表示为向量,矩阵或元组。向量中的每个元素表示文档中单词的权重。在VSM中,有很多计算项权重的方法,而项频逆文档频率(tf-idf)是使用最广泛的加权方法。LSI利用奇异值分解(SVD),识别术语和概念之间的术语相关性,并提取文本的概念性主题。注释系统根据每个术语的权重值确定该术语是否应出现在源代码注释中,或计算查询文本向量与源代码文本之间的文本相似度。具有较高相似性的术语表示与代码段或查询主题相关性更高。基于查询的代码注释系统便根据这些高相关性的关键词组成目标源码的注释。
这些技术用于挖掘代码文本,并在源代码文本中找出关键字,以将自然语言描述构造为代码注释。这些注释常用于描述功能、特征或者源码的变量,例如类、方法、代码块等等。
Haiduc的应用:采用VSM和LSI 的方法分析源码文本产生源码类或者方法的自然语言总结。首先,他们将源代码文档和程序包转换为文档集,称为语料库。 然后,他们将标识符名称中包含的术语以及来自源代码和文档的注释以矩阵形式表示出来。使用VSM生成源代码的摘要时,将根据选择的权重选择源代码文档中最相关的术语,同时还使用LSI技术计算语料库中每个术语的向量与向量之间的余弦相似度 源代码文档的摘要,然后生成高度相似的术语,这些术语不会出现在要概述的方法或类中,而是出现在语料库中。这样,他们分析了Java项目中的方法和类源代码,并为其生成了简短,准确的文本描述。Haiducet等人做出了另一种贡献, 仅利用LSI为开放源代码存储库中的Java类代码生成摘要注释
Vassalloet等人利用相同的方法。 使用VSM模型来表示Stack Overflow上的问与答(Q&A)中的源代码文本和开发人员讨论文本为矢量,并计算目标源代码文本和讨论文本之间的余弦相似度以查找映射。 推荐使用高度相似的段落文本作为目标源代码的注释。 结果,他们挖掘了众包知识以推荐评论方法。
同样,Panichellaet等人[57] 使用启发式和向量空间模型来处理和分析开发人员通信以进行方法描述。 开发人员交流主要是指与类,方法和参数有关的电子邮件和错误报告。 他们提取可追溯到源代码方法的段落文本,并通过计算文本段落和每种跟踪方法的文本之间的文本相似度(即余弦相似度)来识别相关段落这句话没有明白)。 建议使用相似度高的相关段落作为方法说明。
这种技术的缺点在于,它仅考虑语料库或源代码文档中出现的术语,而不考虑源代码文档中包含的其他信息,例如程序调用,数据依赖性,源代码中的单词序列 。 因此,这些系统难以进一步提高所生成评论的准确性。(有较高的局限性。目前的应用层面依旧在数据挖掘中,个人猜测)

2)基于代码克隆检测的注释生成算法
wong的案例: 提出一种基于编码克隆检测技术的方法,该方法可从大型编程问答网站(Q&A)挖掘评论。来自Q&A的关于Stack Overflow的帖子,包含代码片段以及相应的文本描述,被称为代码描述映射(即为代码和相应的文本描述是一一对应的),这种对应关系被提取出来作为数据库,然后找最大对应子字符串。。。。够狠!!这种办法生成的注释的数量和质量在很大程度上取决于为注释系统构建的数据集的规模和质量。

这种方法的缺点是生成的评论数量少得多。 原因是生成的注释的数量很大程度上取决于数据库或GitHub的开源软件项目中包含的信息。 例如,如果从未在任何帖子中讨论过代码段,则评论系统将根本无法推荐任何评论。
3)基于LDA的注释生成算法

基于LDA的注释生成算法涉及使用LDA模型构建源代码模型并为目标源代码生成注释。 换句话说,LDA可以提取源代码的特定功能。
另外,Movshovitz-Attias和Cohen [52]使用主题模型,LDA和n-gram模型来预测Java源代码的注释。 他们分别从多个训练数据集中,在相同的源代码文档上训练n-gram模型和LDA模型。 然后他们将文档视为具有两种实体类型(代码和文本令牌)的混合成员,并在文档上训练链接LDA模型。使用受过训练的模型,他们计算文档主题的后验概率,并进一步推断注释令牌的概率。 最后,建议将高概率的注释标记作为源代码文件的注释。
Rahmanet等人使用LDA [61]。 分析来自Stack Overflow问答站点的讨论,以为开源项目推荐有见地的评论。 他们利用不同于Wonget等人的基于启发式的技术[83]来挖掘众包知识以对开源项目发表评论。 生成的注释主要描述了源代码的不足,质量和范围,以改进源代码,并可以帮助维护工程师执行维护任务

4) 其他的基于信息检索的注释生成算法

暂略

C、基于深度神经网络的注释生成算法重点部分!!!)

代码注释生成可以被当作是一种翻译工作(程序语言与自然语言之间)

主要由两个方向:基于循环神经网络算法与基于其他神经网络算法。深度神经网络分为三种:卷积神经网络(CNN),循环神经网络(RNN)和递归神经网络(RvNN??不确定是啥。。)[60]。
卷积神经网络适合用于NLP,图像识别和语音处理等方向中。RNN常用于处理和预测顺序数据,在NLP和语音处理中应用较好;RNN和RvNN均可用于本论文场景–代码注释生成。

  • 两个重要的结构:encoder-decoder结构attention机制

a、encoder-decoder结构

在编码器-解码器的结构中,编码器起到将源代码编码为固定大小的矢量的作用; 解码器负责对源代码矢量进行解码并预测源代码的注释。各种编码器/解码器结构之间的差异在于输入形式和神经网络的类型。通常,编码器/解码器的内部结构可以选择RNN,CNN 和RNN的变体,例如门控循环单元(GRU)和长期短期记忆模型(LSTM)。

b、attention机制

它负责将较高的权重值动态分配给解码器输入序列中每个单词的更相关的标记。对于长序列情况下性能不佳的问题,这是一个很好的解决方案。由于基于深度神经网络的注释生成算法属于机器学习的类别,因此基于深度神经网络的注释生成系统需要包含代码和注释的高质量数据集来训练神经网络。数据集可以满足系统的所有数据需求,还提供用于训练以及验证和测试评论算法的数据,一集多用。。。

1)基于RNN的注释生成算法

RNN的另外两个重要变体是长期短期记忆模型(LSTM)门控循环单元(GRU)
LSTM的特点是它具有三门控制器结构并构造了可控制的记忆神经元,可解决传统RNN中的梯度下降和梯度爆炸。
与LSTM相比,GRU结构简单,克服了LSTM的缺点:结构复杂,实现复杂,执行效率低。GRU仅使用两个门:一个是更新门,另一个是复位门。
根据编码器中使用的RNN数量,将基于RNN的注释生成算法分为两类:基于单编码器的注释算法基于多编码器的注释算法
a、基于单编码器的注释算法

编码器由一个RNN组成。这是一个典型的用于代码注释生成的编码解码结构。

*一篇比较先进的论文: RvNN ,parse tree,encoder-decoder(GRU based),attention:Y.Liang and K. Q. Zhu, ‘‘Automatic generation of text descriptive com-ments for code blocks,’’ *

b.基于多编码器的注释生成算法

RNN利用GRU或LSTM表示长输入序列之间的长距离特征。 CNN利用卷积注意或卷积层来收集和表示源代码的功能和位置模型