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

简介: # 代码补全漫谈(2) - Miltos Allamanis 上一回我们从火到爆表的TabNine说起,介绍了OoV问题引发的论战。 在进入细节之前,我们再八卦程序语言处理领域的一个重要研究者,微软研究院的Miltos Allamanis。

代码补全漫谈(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 Source Code Repositories at Massive Scale Using Language Modeling

Mining Idioms from Source Code(2014)

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

Mining Idioms from Source Code

Learning Natural Coding Conventions(2014)

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

allamanis2014learning.png

Suggesting Accurate Method and Class Names(2015)

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

Suggesting Accurate Method and Class Names

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

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

A Bimodal Modelling of Source Code and Natural Language

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

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

A Convolutional Attention Network for Extreme Summarization of Source Code

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

SmartPaste: Learning to Adapt Source Code(2017)

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

SmartPaste

Learning Continuous Semantic Representations of Symbolic Expressions(2017)

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

Learning Continuous Semantic Representations of Symbolic Expressions

Mining Semantic Loop Idioms from Big Code(2018)

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

Mining Semantic Loop Idioms from Big Code

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)

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

The Adverse Effects of Code Duplication in Machine Learning Models of Code

其它研究

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

Deep Learning Type Inference(2018)

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

类型提示

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

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

CODIT

Learning to Represent Edits(2019)

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

A Neural Approach to Decompiled Identifier Renaming

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

A Neural Approach to Decompiled Identifier Renaming

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

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

Program Synthesis and Semantic Parsing with Learned Code Idioms

RefiNym: Using Names to Refine Types(2018)

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

总结

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

目录
相关文章
|
7天前
|
人工智能 缓存 API
阿里云Qwen3.8-Flash大模型详细介绍:模型能力、功能、收费标准、内置工具及使用教程参考
本文将从模型定位、核心能力、适用场景、收费标准、内置工具、调用教程、API参考以及最新活动与优惠等方面,对Qwen3.8-Flash进行系统性介绍。需要说明的是,模型版本、上下文长度、速率限制、价格策略和工具支持情况可能随阿里云百炼平台持续更新而调整,最终应以百炼控制台、模型详情页、API返回结果和官方计费页面实时展示为准。
|
3月前
|
人工智能 安全 API
API Key如何从"人手一把"走向"按需分配"——从身份认证到策略驱动的访问控制
本文探讨AI时代API Key管理的痛点与破局之道:当团队规模扩大,分散的静态Key导致成本失控、安全风险与排查困难。核心方案是用“虚拟Key+策略绑定”替代“人手一把”,实现按需签发、动态授权、分钟级回收,并达成成本归因透明化。管得更聪明,而非更严。
275 0
|
3月前
|
弹性计算 运维 Linux
阿里云国际站代理商:ECS SSH连接失败解决方法 Linux远程登录故障排查全流程
很多用户从购买阿里云ECS到第一次尝试远程登录,就卡在SSH环节——命令行敲完回车后光标一直闪烁,或者直接提示“Connection refused”。这类问题并不复杂,但排查方向如果跑偏,会浪费大量时间。我们梳理了一套从现象反推根因的「阿里云ECS SSH连接失败解决方法」,把故障归为连接超时、连接被拒绝、认证失败三种类型,对应着网络可达性、服务可用性和凭证正确性三层关卡。
801 0
|
4月前
|
存储 人工智能 自然语言处理
数字化转型赋能GEO(生成式引擎优化)全链路实践指南
本文系统阐述生成式引擎优化(GEO)与数字化转型的深度协同:以GEO五层架构为骨架、四标融合为治理准绳,从数据、流程、组织、技术四维推动企业构建AI可信数字资产,实现从“被搜索”到“被引用”的价值跃迁。(239字)
|
7月前
|
存储 数据采集 人工智能
|
9月前
|
人工智能 自然语言处理 数据挖掘
Qwen3-VL-Embedding & Qwen3-VL-Reranker:统一多模态表征与排序
通义千问Qwen团队于2025年1月8日推出多模态模型新成员:Qwen3-VL-Embedding与Qwen3-VL-Reranker,基于Qwen3-VL构建,支持文本、图像、视频等多模态统一表示与跨模态检索,在图文匹配、视觉问答等任务中表现卓越,具备高精度、多语言、易集成等优势,助力全球开发者构建高效多模态应用。
4305 4
|
存储 人工智能 文字识别
VideoRAG:长视频理解的检索增强生成技术,支持多模态信息提取,能与任何 LVLM 兼容
VideoRAG 是一种用于长视频理解的检索增强生成技术,通过提取视频中的视觉对齐辅助文本,帮助大型视频语言模型更好地理解和处理长视频内容。
1325 10
VideoRAG:长视频理解的检索增强生成技术,支持多模态信息提取,能与任何 LVLM 兼容
|
算法 iOS开发 CDN
“企业微信iPad协议”第 0x04 天:当朋友圈接口在凌晨 2:14 突然返回 404
新品上线紧急任务:300位经销商朋友圈同步海报。突破官方限制,利用企业微信iPad协议私有接口,自动化上传发布。凌晨遭遇404,迅速定位并修复算法版本问题,最终高效完成推送,点赞超4200。技术在文档之外,也在边界之内。
534 0
|
编解码 前端开发 人机交互
Tkinter保姆级教程(上)(一)
Tkinter保姆级教程(上)
1155 0
Tkinter保姆级教程(上)(一)
|
中间件 Shell Go
EngineGroup:让 Flutter 桌面端引擎“飘”起来
EngineGroup:让 Flutter 桌面端引擎“飘”起来
2146 0
EngineGroup:让 Flutter 桌面端引擎“飘”起来

热门文章

最新文章