Paper
来自ICLR2019
Abstract
来自神经机器翻译(NMT)领域的Seq2seq模型已经在该领域的很多任务上取得了SOTA的结果,本文提出Code2seq模型,利用编程语言中的语法结构对源代码进行编码。该模型在代码片段的AST种提取一部分路径,进行LSTM编码后利用Attention生成目标序列。该模型在2个任务、2种编程语言、4个数据集上进行实验,取得了比之前的模型都好的效果,验证了模型的有效性。
Motivation
目前有许多针对源代码和自然语言之间的关系建模的任务,比如代码归纳,代码分类,代码检索,代码生成等等。这篇工作考虑从源代码生成自然语言序列的问题。对于这种问题之前的做法不能很好的提取语法信息,因此本工作利用对代码片段AST的采样进行encoding的方式来更好的提取语法信息。
Contribution
该模型有效的提取了代码片段的语法特征,是第一个直接使用AST路径的端到端的序列生成模型。该模型的有效性在以下两个任务上得到了验证: 1)代码归纳:根据java方法体预测方法名字(下图左侧a图),2)代码captioning:预测一条自然语言语句来描述C#的代码片段(下图右侧b图)。
Background: About AST
抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。AST存在的原因是,它不依赖于具体的文法,不依赖于语言的细节,我们可以对其进行各种各样的操作,在编译器中可以为后端提供稳定、统一的接口,极大的提高了编译器的可维护性。
AST的叶子结点常常是一些用户定义的名字或标识符,非叶子结点是一些循环,变量声明,表达式等结构。例如下图中c是a的AST,名字(num)和类型(int)等等是叶子节点,