图神经网络代码_一种基于抽象语法树的新型神经源代码表示

26e1343538dfd574ef153032439df83e.png

引用

Zhang J, Wang X, Zhang H, et al. A novel neural source code representation based on abstract syntax tree[C]//2019 IEEE/ACM 41st International Conference on Software Engineering (ICSE). IEEE, 2019: 783-794.

摘要

近年来,关于利用机器学习技术的进行程序分析的研究已引起学术界的广泛关注。该领域的一个关键问题是如何适当地定义代码片段的表示形式,以支撑后续的程序分析工作。基于传统信息检索的方法通常将程序视为自然语言文本,而这种方法通常可能会导致源代码中部分重要语义信息的丢失。最近,一项最新的研究表明:基于抽象语法树(Abstract Syntax Tree,AST)的神经模型可以更好地表示源代码。但是,这种方法生成的 AST 通常规模巨大,且现有模型容易出现长期依赖性问题(Long-term Dependency Problem)。本文提出了一种新颖的、基于 AST 的神经网络(ASTNN)的源代码表示。与现有的模型不同,ASTNN 不会将整个 AST 一次性考虑在内,而是将每个大型 AST 切分成一系列小型语句树,并通过捕获语句的词法和语法信息将语句树分别编码为向量。在语句向量的基础上,本文采用了一种双向 RNN 模型,能够对语句自身的性质加以利用,并最终生成代码片段的向量表示。在本文中,作者团队将 ASTNN 应用于两种常见的程序理解任务:代码分类以及克隆检测。实验结果表明:ASTNN 的性能要优于现存的最新方法。

关键词:抽象语法树;源码表示;神经网络;代码分类;克隆检验

1 引言

为了改善软件开发和软件维护的技术格局,学术界和工业界提出了许多有效的软件工程方法,例如:代码分类(Code Classification)、克隆检测(Clone Detection)、缺陷预测(Defect Prediction)、代码摘要(Code Summarization)等。这些软件工程方法都以源代码为主要研究对象。因此,如何适当地对源代码进行表示,以便能够有效地捕获到源代码中存在的语义和语法信息,是这些软件工程方法需要共同面对的技术挑战。

诸如信息检索(Information Retrieval,IR)之类的传统方法通常将代码片段视为自然语言文本,并基于令牌(Token)对目标代码片段进行建模。许多研究人员还使用潜在语义索引(Latent Semantic Indexing, LSI)技术或潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)技术进行源代码分析。以上的这些方法都存在一个共性问题,即:它们都假定代码相关技术(或方法)面向的基础语料库(即源代码)是由自然语言文本构成的。然而,虽然代码片段与纯文本之间存在一定的相似性,但由于源代码贮藏了更丰富、更明确的结构化信息,因此不应当简单地使用面向自然文本的方法(即基于文本或基于令牌的方法)对源代码进行处理。

最近的一些研究工作证明了源代码中贮藏的语法信息的重要性。这些研究表明:源代码中存在语法信息可以在源代码建模的过程中发挥巨大作用,能够得到比传统的、基于令牌的方法更优质的源代码表示形式。这些方法将抽象语法树(AST)与递归神经网络(Recursive Neural Network,RvNN)相结合,采用基于树的 CNN(Tree-based CNN)或 Tree-LSTM(Long-Short Term Memory)技术来捕获源代码中存在的词法(即 AST 的叶子节点,例如程序中的标识符)和语法(即 AST 的非叶子节点,例如语法结构 WhileStatement)信息。这些基于 AST 的神经模型是有效的,但仍然存在两个主要缺陷:① 首先,类似自然语言处理(Nature Language Processing,NLP)中的长文本问题,这些基于树的神经模型也容易受到梯度消失问题的影响。在训练过程中,梯度往往会逐渐消失,尤其是当生成的 AST 规模庞大、节点很深时。作者团队通过实验发现:对于一些由 C 或者 Java 编写的常见代码片段,它们对应的 AST 的最大节点数/最大深度分别为 7027/76 和 15217/192。当使用自上而下的方式或滑动窗口(Sliding Window)技术对这种规模的 AST 进行遍历和编码时可能会丢失一些长期上下文(Long-term Context)信息;② 其次,这些方法通常将 AST 视为完全二叉树的形式,因此一般会选择将 AST 转化为完全二叉树以简化分析流程、提高分析效率。这种方式往往会破坏源代码的原始语法结构,导致生成的 AST 更加庞大、节点更加深入,会进一步削弱了神经模型捕获真实和复杂语义的能力。

为了解决基于 AST 神经网络的代码表示中存在的问题,研

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值