小言_互联网的博客

代码补全漫谈(2) - Miltos Allamanis

366人阅读  评论(0)

代码补全漫谈(2) - Miltos Allamanis

上一回我们从火到爆表的TabNine说起,介绍了OoV问题引发的论战。
在进入细节之前,我们再八卦程序语言处理领域的一个重要研究者,微软研究院的Miltos Allamanis。Allamanis的博士论文就是以《Learning Natural Coding Conventions》为题,是这个领域的专业研究人员。

上次我们介绍的重要survey文章《A Survey of Machine Learning for Big Code and Naturalness》的第一作者就是Allamanis.

从Allamanis第一作者文章看代码处理发展史

下面我们就顺着Allamanis的论文为线索,对于代码处理这一分支有个更有体感的概念。

Mining Source Code Repositories at Massive Scale Using Language Modeling(2013)

这一篇发表于2013年,那时Allamanis在爱丁堡大学师从C. Sutton教授做研究。
2012年,上文提到的加州大学戴维斯分校的Devanbu老师和其学生Hindle等人一起发表了《On the naturalness of software》,通过自然性的证明说明用NLP的方法研究代码是有效的。随后,Allamanis通过3.72亿行的github上的Java工程来构建概率语言模型。

Mining Idioms from Source Code(2014)

2014年,Allamanis的兴趣点是挖掘代码片段,就像code snippets一样,采用的方法是非参数贝叶斯概率树。树的结构如下图所示:

Learning Natural Coding Conventions(2014)

在code review中,命名规则不统一也是一个重要的审查项。Allamanis提出学习命名风格,然后给变量名等提供建议的方式来帮助程序员写的代码的命名风格的统一。

Suggesting Accurate Method and Class Names(2015)

上一篇文章解决了变量命名推荐的问题,于是再接再厉,通过上下文信息给出方法名和类名的推荐。

A Bimodal Modelling of Source Code and Natural Language(2015)

这篇文章开始将源代码和自然语言共同用来建模。

A Convolutional Attention Network for Extreme Summarization of Source Code(2016)

这篇文章开始结合了Attention技术与卷积网络去试图为源代码提取特征。
CNN加上Attention提取特征的示意图如下所示:

本文有基于theano框架写的代码:https://github.com/mast-group/convolutional-attention

SmartPaste: Learning to Adapt Source Code(2017)

SmartPaste是个很有创意的功能,在之前对于变量等推荐的基础上,现在智能粘贴功能可以自动识别所在的上下文了。我们看一个例子:

Learning Continuous Semantic Representations of Symbolic Expressions(2017)

程序语言另人纠结的一点就是本来可以用精确的语法树等方向进行推理,但是无法和神经网络很好的结合。本文就是尝试用神经网络与程序语言结合的一种尝试,一种等价网络。如下图所示:

Mining Semantic Loop Idioms from Big Code(2018)

在这篇中,Allamanis继续他的惯用法的研究,将API和数据结构等信息组合起来,识别出了大量的模式惯用法。

Learning to Represent Programs with Graphs(2018)

本文引入了图神经网络来处理源代码,以解决CNN, RNN等传统神经网络处理源代码的不足。此时,Allamanis已经到微软研究院工作了,这篇文章的代码已经发布在微软的github上了:https://github.com/Microsoft/gated-graph-neural-network-samples

The Adverse Effects of Code Duplication in Machine Learning Models of Code(2019)

今年的这篇文章,作者开始关注代码库中的大量重复给神经网络训练带来的挑战。源代码不同于自然语言,在开源代码库中有大量的复制的代码,而这在自然语言中是非常少见的。

其它研究

下面我们再看一下非第一作者的一些研究。

Deep Learning Type Inference(2018)

这篇文是后面章节的主角之一,是通过训练ts转js对js类型进行训练的方法。类型信息对于代码补全意义重大,相关研究我们在后面会详细介绍。
最终生成的结果如下图所示,

CODIT: Code Editing with Tree-Based Neural Machine Translation(2019)

这篇文章的主要目的是对于日常提交如bug fix进行推荐。代码本来就是树型结构的,通过树型机器翻译模型,可能更贴近于源代码的结构表示。

Learning to Represent Edits(2019)

这个可以认为是smart paste功能的升级版,类似于office软件中的格式刷,将新写的代码刷成学习到的模式。我们看个例子:

A Neural Approach to Decompiled Identifier Renaming

这篇文章试图通过学习代码库来进行反编译时的名字信息的推测。原理和例子如下图所示:

Program Synthesis and Semantic Parsing with Learned Code Idioms(2019)

这一篇是将程序代码与自然语言协同的新尝试。

RefiNym: Using Names to Refine Types(2018)

这一篇可以说是OOP的辅助工具吧,用于识别类的设计是否合理,是不是设计了过多的类,或者将不相关的域放到同一个类中了。

总结

从Allamanis的经历来看,还是非常扎实的,稳扎稳打,从建立数据集和概率语言模型开始,一点点向自然语言和程序语言相结合的方向不断前进。其中像smart paste等功能让人眼前一亮,可以成为IDE的爽点功能。


转载:https://blog.csdn.net/lusing/article/details/100901332
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场