程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
文章插图
作者 | 陈大鑫
众所周知 , 程序员是一份“光鲜亮丽”、“有福报”、“永不加班”的好工作 , 程序员每天就是程序代码嘛 , 理想中的工作日常是这样:
文章插图
而现实中的工作日常却是这样:
文章插图
其实无论是对于初学者还是对于专业开发人员 , 编程这件事 , 都需要花费大量时间调试或修复代码错误 , 或称为改Bug 。
文章插图
程序员日常编程的过程基本就是:写代码、编译或执行程序 , 如果有报错 , 根据收到的编译器报错反馈修复程序 , 然后整个过程循环下去直到程序成功运行 。
那么 , 人们可以通过AI来建模和解决这个问题吗?
在ICML 2020上发表的一项最新工作中 , 来自斯坦福大学的两位研究员研究了如何使用AI来自动修复程序 , 以期未来程序修复自动化可以大大提高编程和学习编程的效率 。
1 论文介绍
文章插图
【程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug】论文名称:《Graph-based, Self-Supervised Program Repair from Diagnostic Feedback》 。
论文链接:
文章插图
假设我们有一个有Bug的C ++程序(左上图) , 第5行char 的位置实际上应该是string 。 当编译程序时 , 程序将会如图右上报错:“第9行a的类型是char” 。
从此信息中 , 程序员可以注意到程序报错与变量a的类型有关 , 跟踪a在源代码中的使用或声明方式 , 到达第5行 , 然后编辑该行以更正错误 。
因此 , 我们希望我们的机器学习模型要解决的具体任务是 , 给定有Bug的代码(左图)和报错信息(右上图) , 定位错误行(第5行)并生成其修复版本(“string” tmp , a , b;”)(上图右下方) 。
挑战:
此任务带来两个主要挑战 。
1、在建模方面 , 需要通过两种方式(程序和报错信息)进行连接和共同推理:例如 , 如上例所示 , 跟踪导致代码报错的变量 。
2、在训练数据方面 , 需要有效的数据源 , 以提供监督学习来纠正含Bug的程序 。
不幸的是 , 现有的带有对的标记数据集比较小且难以获取 , 并且无法有效地扩展 。
2 模型方法
在本文中 , 作者通过以下两种方式提出了有效的解决方案:
1、使用程序反馈图对程序修复(改Bug)进行建模;
2、引入使用未标记程序的自监督训练方案 。
建模方法:程序反馈图为有效地连接程序和报错信息两种方式并执行修复代码所需要的推理 , 作者引入了程序反馈图 , 这是一个连接图的表示 , 该图将整个程序中的代码符号与报错信息连接在一起 。
例如 , 示例中的编译器消息提到a , size和char , 因此我们可以将这些符号连接到源代码中它们出现的位置 , 以捕获对应语法响应 。
文章插图
这样 , 我们就可以在共享语法空间中处理这两种模态而不是分开地处理这两种模态 , 然后使用图注意力( graph attention)机制对这个空间中的符号进行推理。
下图是本文的模型架构 , 它建立在NLP中常用的编码器-解码器框架上 , 该框架对输入序列(在下图中为程序和报错信息)进行编码 , 然后对输出进行解码 , 并在架构的中间层(图中)将图注意力模块应用于程序反馈图中 。
文章插图
模型架构图拆解:
文章插图
文章插图
训练方法:自监督学习本文使用的另外一种技术是自监督学习 。
带标签的程序Bug修复数据集很小 , 但在互联网上有大量未带标签的程序代码可用 。
例如 , GitHub上拥有超过3000万个公共存储仓库 。 使用大量免费的可用代码来改善学习程序的Bug修复 , 将大大增强系统的可伸缩性和稳定可靠性 。
文章插图
- 互联网|苏宁跳出“零售商”重组互联网平台业务 融资60亿只是第一步
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 联网时代|34岁转行做程序员是否还有成功的机会
- 程序员学英语第1天——JavaScript 程序测试的介绍1
- 这些错误,程序员经常会犯,你了解过吗?
- 睿哲信息:想做跨境电商,第一步你千万不能选错
- 程序员面试主要看哪些 该怎么准备面试内容
- 中国程序员最容易发音错误的单词,看看你有没有读错
- 程序员大佬整理的300本编程电子书,整整12个G你想学的都有
- 程序员年包90w,回老家被月薪3800表哥怼,催他赶紧上岸