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的语句编码器来学习语句的向量表示。