A Novel Neural Source Code Representation based on Abstract Syntax Tree--ICSE2019
一种新型的基于源代码表示的一种方法
最新的研究表明,基于AST的神经模型可以更好地表示源代码。然而AST的规模通常较大,现有的模型容易出现长期依赖的问题。
本文提出了ASTNN,一种新的基于AST的源代码表示得到神经网络。
现有的模型是工作在整个AST上,ASTNN将每个大型的AST分割成小语句树序列,并通过捕获语句的词法和句法知识将每一个语句树都编码成一个向量。然后可以得到一个语句向量序列。然后采用双向RNN模型生成代码片段的向量表示。
ASTNN在源代码分类和克隆检测任务上取得了最优的成绩
代码表示的重要性:
为了提高软件的开发和维护水平,人们提出了许多软件工程方法,如源代码分类、代码克隆检测、缺陷预测和代码摘要。所有这些方法共同面临的一个主要挑战是如何表示源代码,以便有效地捕获源代码中嵌入的语法和语义信息。
现有的基于AST的神经模型是有效的,但是存在两个限制:
①梯度消失问题。可能会丢失长期上下文信息。
②为了简化和提高效率,这些方法要么将AST转换为完整的二叉树,要么将AST直接视作二叉树,破坏了源代码原有的语法结构,而且转换的过程会增加AST的高度,进一步削弱了神经模型捕捉更真实和复杂语义的能力。
为了克服以上两个局限性,从两个方面考虑:
①introduce explicit (long-term) control flow and data dependencies graphs(引入显示的长期依赖的控制流和数据依赖图),并采用图嵌入的技术来表示源代码。
例如:一项近期的研究考虑了由同一个变量或者函数在远处引起的长距离依赖性
②直接构造代码片段的数据流图Control Flow Graphs,CFGs。
然而精确的程序间依赖图,Program Dependency Graphs,PDGs(控制流和数据流的依赖关系),通常依赖于编译器的中间表示或者字节码,不适用于不可编译和不完整的代码片段。这种限制阻碍了代码表示在许多涉及到任意代码片段的领域中的应用。
本文中提出的方法:AST-based Neural Network,ASTNN
不需要代码可编译
在句子级别上,将一个代码片段的大的AST树分割成多个小树(语句树),并对所有的语句树执行基于树的神经嵌入。产生的语句向量可以用来表示词法词法和语句级别的语法知识。
which splits the large AST of one code fragment into a set of small trees at the statement level and performs tree-based neural embeddings on all statement trees. It produces statement vectors
which can represent the lexical and statement-level syntactical
knowledge.
We also treat MethodDeclaration as a special statement node.
第7行15行之间的代码段包含一个完整的try语句,56行代码仅包含一个变量的初始化。
对于Try语句(包括头和正文中的其他语句),拆分出try语句的头和其他所有的语句。这样,大的AST被分解为一个小的语句树序列。
使用递归神经网络(RvNN)编码语句以及语句之间的序列依赖关系。
Such a vector captures the naturalness of source code [32],
[33] and can serve as a neural source code representation.
具体来说,
①根据一个代码片段构建一棵AST,然后将整个AST拆分成小的语句树(每一个语句树都是由一个语句的AST结点组成)
②== Second, we design a recursive encoder
on multi-way statement trees to capture the statement-level
lexical and syntactical information and then represent them in
statement vectors==
③基于句级向量序列,使用一个双向RNN网络最终获取一个可以表示整段代码的向量表示。
文章的主要贡献:
①提出了一种新型的可以捕捉词法、语句级别的语法知识的源代码表示方法
②应用到两个数据集上,均有提高
如何拆分AST树
为什么选择句子粒度
选择语句树是因为语句是承载源代码语义的基本单元
也选择了node级别(token级别,捕获较少量的语法知识)和完整的AST树(梯度消失)作为对比
实验结果也证明,语句级粒度在ST树的大小和语法信息的丰富性上有一个很好的折中。
Encoding Statement on Multi-way ST-tree
给定ST-trees,我们设计一个基于RvNN的语句编码器来学习语句的向量表示。
实验
两个任务:程序分类、克隆代码检测
数据集
程序分类
baseline
源代码分类:我们在OJ数据集上进行了广泛的实验。
除了最新的模型TBCNN[2]之外,我们还考虑了传统的和其他基于神经网络的方法,包括具有统计特征的支持向量机、TextCNN[50]、LSTM[51]、LSCNN[52]和基于PDG的图嵌入方法。
我们使用线性支持向量机与传统的红外方法。用TF-IDF、N-gram和LDA提取文本特征。语料库是从源代码文件中提取的标记。对于N-gram,我们将grams的数量设置为2,max的特征数量设置为20000。LDA的主题数是300。•
TextCNN和LSTM。这两种模型广泛应用于自然语言处理中的句子分类。将代码片段视为纯文本,我们使用token序列对它们进行了调整。对于TextCNN,内核大小设置为3,过滤器数量为100。对于LSTM,隐藏状态的维度设置为100。•LSCNN。LSCNN最初是为错误定位而提出的[52],它用CNN提取程序特征进行语句嵌入,用LSTM进行语句序列处理。
•基于PDG的图形嵌入。最近一些研究[25]、[26]通过考虑控制流和数据流的依赖关系来构造程序图,并采用HOPE[24]和Gated图神经网络(GGNN)[53]等图嵌入技术来表示代码。在PDG的基础上,我们用HOPE[26]中语句的数字ID表示PDG的节点,平均每个PDG节点中所有令牌的嵌入量作为其在GGNN6中的初始嵌入量[25]。在图嵌入之后,我们在pdg的所有节点上添加一个最大池层,以获得最终的代码表示。
尽管OJ数据集中的原始代码片段不完整且不可编译,但是可以通过添加标准C头文件和第三方库来手动补充它们,并且我们使用开放源代码
评价指标
精确度
可以看到
①传统的方法,如支持向量机,在实验中表现不佳。
这些方法主要依靠标记的token或程序的浅层语义特征来区分代码功能,但OJ数据集中使用的token大多是任意的。例如,标识符的名称通常是a、i、j等,因此大多数token献很小。
②神经模型,TextCNN和LSTM的结果优于上面基于token的方法,因为它们能够捕捉到一些局部函数特征。例如,短scanf语句的语义可以通过TextCNN的滑动窗口或LSTM中的记忆单元单元来捕获。
TBCNN是一个基于整个ASTs的神经网络,利用卷积滑动窗口来捕获AST的结构特征,从而大大提高了算法的精度
LSCNN(CNN捕捉代码特征,LSTM进行处理)在现有的神经网络模型中具有相对的竞争性能。由此可以推断,语句的序列信息确实有助于功能的识别,但由于无法捕捉到丰富的结构语义,其识别精度仍然低于TBCNN。
③基于图的方法,包括基于PDGs的HOPE和GGNN,在上述方法中表现不佳。特别地,HOPE的PDG仅获得4.2%的准确度,因为它们忽略了词法知识,只关注高抽象级别(26)中的显式依赖信息。带有GGNN的PDG使用令牌进行节点嵌入,有一定的改进,但仍然缺乏语法信息。
④在所有的方法中,我们的模型达到了最好的精度。
具体来说,我们的模型将TBCNN提高了4.2%。
因为我们的ASTNN模型在比原始ASTs小得多的ST树上执行RvNN。与现有的神经模型不同,我们的模型不使用滑动窗口和二叉树信息,它捕获AST的语句知识以及语句之间的序列依赖信息。
代码克隆检测
克隆类型(级别)
级别1:除了空白区域、整体布局与注释上有差异意外,其他方面完全一致
级别2:在级别1差异的基础上,还在变量名和文字值上具有差异
级别3:在级别2的差异的基础上,还会有语句片段的添加、删除与修改
级别4:两个相似代码片段具有不同的语法结构之外,实现的功能是一样的
对于BCB,克隆对的相似性定义为行line-based和token-based的度量的平均结果[47]。
1型和2型片段的相似性为1。3型又分为强3型和中等3型,其相似性分别在[0.7,1]和[0.5,0.7]范围内。4型的相似性在[0,0.5]范围内,其克隆对占所有克隆类型的98%以上。
在OJ中,同一问题的两个程序形成未知类型的克隆对。
如表1所示,与前面的工作[6]类似,我们从OJ的前15个编程问题中选择500个程序,即OJClone。它将产生2800多万个克隆对,这是非常耗时的比较,因此我们随机选择50000个样本代替。同样,我们从BCB解析了近600万对真克隆对和26万对假克隆对。
我们比较我们的方法与现有的最先进的神经模型克隆检测,包括RAE(5)和CDLH〔6〕。
对于RAE,程序的无监督向量由作者的开源工具7获得,并用于有监督训练,即RAE+。它的配置是根据他们的论文设置的。CDLH并没有被作者公开,所以我们直接引用他们在论文中的结果,因为他们的实验与我们共享相同的数据集。
由于在RAE和CDLH中比较了decard[55]等传统克隆检测方法和doc2V-ec8等常见神经模型,我们在实验中忽略了它们。类似于代码分类的实验,我们还将两种基于PDG的图嵌入方法在OJClone中进行了比较。
然而,BCB主要包含不完整和不可编译的方法级代码片段,无法得到它们的pdg。
评价指标
由于代码克隆检测可以表示为二元分类问题(克隆与否),因此我们选择常用的精度(P)、召回率(R)和F1测度(F1)作为评价指标。
实验设置
我们在OJClone和BCB数据集上进行了实验。从OJClone中,我们抽取了5万对克隆对进行实验。在BCB中,我们首先抽取2万对假克隆对作为阴性样本。对于类型1到强类型3,我们将属于该类型的所有真正克隆对作为正样本获取,因为它们的数目小于20000。对于其他类型,我们抽样2万对真实克隆。然后我们把它们分成五组来检测每种类型。
实验结果
我们首先讨论了RAE+、CDLH和ASTNN模型在BCB上的性能。
显然,这三种方法对于识别类型1和类型2中两个代码片段的相似性都非常有效,因为除了不同的标识符名称、注释等之外,这两个代码片段几乎是相同的。而对于其他类型的BCB,RAE+由于没有类似于CDLH和ASTNN中的LSTM或GRU的记忆历史信息的机制,其性能比其他两种方法差得多。比较CDLH和我们的方法,我们可以看到ASTNN在F1度量方面优于CDLH,特别是在4型。在BCB类型4中,假克隆对也具有相同的语法相似性,被证实是很难区分的,这表明我们的ASTNN模型可以克服第三节描述的限制,捕捉语句的顺序自然性,从而获得比CDLH更微妙的语法差异和复杂的语义
在OJClone中,RAE+和我们的模型可以观察到类似的结果。然而,CDLH的表现比BCB差得多。与BCB不同的是,==OJClone中的程序变量名通常是没有意义的,因此CDLH可能会丢失大量的词汇信息,并且只能捕获一些语法信息。==相比之下,我们的ASTNN模型可以通过学习更多的局部语法知识和语句之间的全局序列自然度来进一步度量功能相似性。类似于代码分类,我们还比较了基于PDG的图嵌入技术HOPE和GGNN。由于上一个研究问题中提到的事实,它们的性能比我们的ASTNN模型差。
AST拆分粒度
RQ3:不同的设计选择对所提出的模型有什么影响?我们通过实验研究了不同的设计选择对ASTNN模型在两个任务中的性能的影响。如表5所示,我们考虑以下设计选择:ASTs的分离粒度。给定一个大的AST,有很多方法可以将其分割成不同序列的不重叠的小树。这两种极端的方法是将原始的完整AST看作一个特殊的子树(AST full),或者将AST的所有节点提取为特殊的“树”(ASTNode)。除了语句级拆分之外,另一种可能的方法(AST Block)是根据块(在同一对大括号中包含多个语句的复合语句)拆分AST。分割后的后续编码和双向GRU处理与ASTNN相同。我们可以看到,AST块和ASTNN的性能都优于AST Full和AST Node的极限分裂方法。正如第三节所分析的,我们的ASTNN模型取得了最好的性能,这是因为它在ST树的大小和语法信息的丰富性之间有一个很好的折衷
Pooling。在我们的ASTNN模型中,我们使用语句编码器中ST树上的最大池(poolig-I)和第三节中描述的递归层(poolig-II)之后的语句序列上的最大池层(max pooling layer)。我们研究这两个池组件是否通过删除它们并直接使用隐藏的最后一层来影响性能
从表中可以看出,语句序列上的池提供了相对显著的性能提升,而ST树上的池则无关紧要。这表明相同代码片段的不同语句实际上具有不同的权重
批处理的效率
RQ4:所提出的动态批处理算法在多大程度上提高了效率?如第三节所述,我们的语句编码器可以接受具有任意树结构的批处理样本作为输入,从而加快训练速度。然而,这一算法的效率如何仍然是个未知数。为了测试和验证该模型的性能,我们使用算法1中的动态批处理算法(DBA)对模型进行了三种不同的训练:完全不批处理(TWB)、仅在递归层批处理(PBR)、在递归层批处理和编码层批处理。具体来说,TWB意味着每次计算一个样本;PBR接受批样本,但每次只编码一个ST树,并通过填充ST树向量的序列在递归层上执行批处理;DBA一次编码ST树的所有批样本,然后像PBR那样处理ST树序列。实验是针对任务1进行的,时间成本是每个阶段训练和测试的平均运行时间。
A Novel Neural Source Code Representation based on Abstract Syntax Tree--ICSE2019相关推荐
- A Transformer-based Approach for Source code Summarization 翻译
A Transformer-based Approach for Source Code Summarization 全文翻译 本文最佳阅读方式:读完一段中文内容快速阅读对应的英文部分 欢迎关注我的公 ...
- 【论文笔记】 Reinforcement-Learning-Guided Source Code Summarization using Hierarchical Attention
1 INTRODUCTION 软件维护blablabla--代码注释blablabla-- 好的代码注释应具有以下特征:(1) 正确性,正确地阐明代码的意图:(2) 流利,使维护者易于阅读和理解:(3 ...
- Cannot find source code based button in SE24
When you are logging on to customer system for incident handling, you want to switch to source code ...
- Cannot find source code based button in SE24 - modification assistant
Created by Jerry Wang, last modified on Apr 02, 2014 当打开一个class时,发现toolbar里并没有期望出现的source code based ...
- 论文中文翻译——Automated Vulnerability Detection in Source Code Using Deep Representation Learning
本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--Automated Vulnerability Detection in Source Code Using Deep R ...
- Source Code Collection for Reproducible Research
Source Code Collection for Reproducible Research [ http://www.csee.wvu.edu/~xinl/source.html] " ...
- 【综述笔记】 A survey of automatic generation of source code comments Algorithms and techniques
A survey of automatic generation of source code comments Algorithms and techniques ABSTRACT 代码注释存在问题 ...
- Understanding The React Source Code
Understanding The React Source Code - Initial Rendering (Simple Component) I UI updating, in its ess ...
- Chrome View Source Code 那些事
原文:How to View HTML Source in Chrome and Why 您网站的源代码是您网站的"动力". 它决定了您网页的感觉.外观和功能,帮助您实现出色的用户 ...
最新文章
- TypeScript 的 ?: 、两个问号、?. 分别是什么意思?
- 深度学习笔记七:循环神经网络RNN(基本理论)
- java css_JavaWeb中基本的CSS的使用
- vue控制多行文字展开收起
- linux read nchars,Linux常用命令--read
- javaserver_集成Spring和JavaServer Faces:改进的模板
- 深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET调用Web Services方法...
- Vue笔记-Ant Design Vue的使用(Vue3)
- bash 将二进制转换为十进制_用‘栈的思想编写一个十进制转换二进制、八进制或十六进制的程序...
- 【Linux开发】linux设备驱动归纳总结(四):3.抢占和上下文切换
- JAVA并发编程实践-中文-高清-带书签-完整版
- matlab插值函数 外插,Matlab数据插值-内插、外插
- 申请CSDN博客专家认证成功
- matlab将z域变为s域,时域、S域、Z域转换
- 喜马拉雅产品分析报告
- 指纹特征提取及描述(附Python代码)
- 【Java中实现微信公众号模板消息推送】
- N70 (葵花宝典)
- plink质控及转换文件、admixture软件学习记录
- c# 导出excel 数字太长而显示为科学计数法的解决方法