代码补全漫谈(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的爽点功能。

代码补全漫谈(2) - Miltos Allamanis相关推荐

  1. 代码补全漫谈(1) - 从TabNine说起

    代码补全漫谈(1) - 从TabNine说起 前不久,基于GPT-2模型的TabNine横空出世,在程序员界再次引起轰动.此前,国产的aixcoder,还有获得github ceo天使投资的Pytho ...

  2. scala入门之代码补全

    为什么80%的码农都做不了架构师?>>>    在scala的shell命令行中,我们可以使用像Linux那样的代码补全功能.Linux中是使用Tab键补全,scala的shell命 ...

  3. 重磅!革命级AI代码补全工具,这款撸码利器让程序员界沸腾了!

    我们平时写代码的时候,多少都会依赖编辑器的代码补全功能,敲几个字母就能补全一个词.可是这么多年过去了,语言升级了很多次,而代码提示却没有升级,还是只能限定在一个词,毫无意义地按照字典表顺序排列,这对于 ...

  4. vim win装_VIM的代码补全工具YouCompleteMe在Windows上的安装攻略

    前言 用VIM写代码也有很多年了,一直使用其内嵌的自动补全.这种补全没有任何语义分析,仅仅根据当前打开的文件,收集所有的单词形成一个补全库.在输入时,根据已经输入的字母,用逐个字母匹配的方式来寻找可能 ...

  5. IPython 8.0大版本更新:Debug报错提示更清晰,加入自动代码补全

    鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI 酝酿了3年多,IPython 8.0终于来了. 现在,用上最新版本,你不仅能在命令行里使用Black重新格式化代码,还能获得更好的自动代码补全和D ...

  6. hbuilderx代码自动补全_DL时代的代码补全利器,北大出品,效果远超语言模型

    从程序员到数据工程师,编写程序代码是一项基本功,但是编写冗长代码的过程也极大地消耗了开发者的耐心.近来,有不少关于代码补全工具的消息爆出,例如,来自美国的 Kite,来自加拿大的 TabNine 等, ...

  7. 在windows中python安装sit-packages路径位置 在Pycharm中导入opencv不能自动代码补全问题

    一.在windows中python安装sit-packages路径位置 C:\Users\shl\AppData\Local\Programs\Python\Python36\Lib\site-pac ...

  8. Arduino终于支持代码补全了!小白们终于可以愉快的写代码了!Arduino IDE 2.0beta功能简介...

    Arduino终于支持代码补全了!小白们终于可以愉快的写代码了!Arduino IDE 2.0beta功能简介 前一段时间听到有人说Arduino的IDE特别不好用,功能太单一,最重要的是没有代码补全 ...

  9. devc代码补全没效果_从零开始写文本编辑器(二十八):自动补全(上)

    前言 我本没打算这么早就写"自动补全"功能的. 但是在写XML资源编辑时,为了实现自动引用已有资源@string/xxx,需要一个合适的列表来让我选择.这样能防止拼写错误. 也就是 ...

最新文章

  1. 通过产品ID得到collection!!!
  2. from torch._C import * ImportError: DLL load failed: 找不到指定的模块。
  3. HTML5 文件操作API
  4. MVC架构中的Repository模式 个人理解
  5. 【注】【精】【火】博主考研去了,现在的博文都是以前的笔记或者算法。
  6. 备份Mysql数据库时,报 Couldn't execute 'show fields from的一种问题解决方案
  7. Android中Handler的使用方法——在子线程中更新界面
  8. restfull api 接口 规范
  9. Unable to resolve dependency for ':app@debug/compileClasspath'
  10. sai笔记1-sai安装
  11. 无线网络连接不上请检查服务器,为什么无线网络连接不上?
  12. php chm中文手册201502月更新
  13. 大学英语计算机统考怎么过,2011年9月大学英语B 统考 计算机网考样题
  14. 2 OsgEarth中实现PBR材质流程总结
  15. 【bzoj3653】谈笑风生
  16. 传奇SF的架设-开外网
  17. jenkins构建Protractor项目报错解决
  18. 文档查看器(Open XML)格式工具
  19. cocos creator 3D学习(六)光照+阴影
  20. 2018年9月12日

热门文章

  1. 微信小程序App(Object object)
  2. 南京邮电大学matlab实验报告,南邮电工电子实验复习资料与试卷概要
  3. 世界著名IT企业汇总
  4. 奥运冠军全红婵姓名学分析
  5. EdgeConnect: Generative lmage lnpainting with Adversarial Edge Learning 代码测试教程
  6. 16广东各市人口数据(echarts)
  7. 通过Python脚本下载【来此加密的免费HTTPS SSL证书】并自动更新到服务器和阿里云CDN
  8. DevExpress汉化方法详解(附资源)
  9. qtCreator 请不要使用高性能显卡设置
  10. android之Fresco框架(一)--Fresco基本使用