赞
踩
最新的研究表明,基于AST的神经模型可以更好地表示源代码。然而AST的规模通常较大,现有的模型容易出现长期依赖的问题。
本文提出了ASTNN,一种新的基于AST的源代码表示得到神经网络。
现有的模型是工作在整个AST上,ASTNN将每个大型的AST分割成小语句树序列,并通过捕获语句的词法和句法知识将每一个语句树都编码成一个向量。然后可以得到一个语句向量序列。然后采用双向RNN模型生成代码片段的向量表示。
ASTNN在源代码分类和克隆检测任务上取得了最优的成绩
为了提高软件的开发和维护水平,人们提出了许多软件工程方法,如源代码分类、代码克隆检测、缺陷预测和代码摘要。所有这些方法共同面临的一个主要挑战是如何表示源代码,以便有效地捕获源代码中嵌入的语法和语义信息。
①梯度消失问题。可能会丢失长期上下文信息。
②为了简化和提高效率,这些方法要么将AST转换为完整的二叉树,要么将AST直接视作二叉树,破坏了源代码原有的语法结构,而且转换的过程会增加AST的高度,进一步削弱了神经模型捕捉更真实和复杂语义的能力。
①introduce explicit (long-term) control flow and data dependencies graphs(引入显示的长期依赖的控制流和数据依赖图),并采用图嵌入的技术来表示源代码。
例如:一项近期的研究考虑了由同一个变量或者函数在远处引起的长距离依赖性
②直接构造代码片段的数据流图Control Flow Graphs,CFGs。
然而精确的程序间依赖图,Program Dependency Graphs,PDGs(控制流和数据流的依赖关系),通常依赖于编译器的中间表示或者字节码,不适用于不可编译和不完整的代码片段。这种限制阻碍了代码表示在许多涉及到任意代码片段的领域中的应用。
不需要代码可编译
在句子级别上,将一个代码片段的大的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 naturalnes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。