程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug


程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
作者 | 陈大鑫
众所周知 , 程序员是一份“光鲜亮丽”、“有福报”、“永不加班”的好工作 , 程序员每天就是程序代码嘛 , 理想中的工作日常是这样:
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
而现实中的工作日常却是这样:
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
其实无论是对于初学者还是对于专业开发人员 , 编程这件事 , 都需要花费大量时间调试或修复代码错误 , 或称为改Bug 。
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
程序员日常编程的过程基本就是:写代码、编译或执行程序 , 如果有报错 , 根据收到的编译器报错反馈修复程序 , 然后整个过程循环下去直到程序成功运行 。
那么 , 人们可以通过AI来建模和解决这个问题吗?
在ICML 2020上发表的一项最新工作中 , 来自斯坦福大学的两位研究员研究了如何使用AI来自动修复程序 , 以期未来程序修复自动化可以大大提高编程和学习编程的效率 。
1 论文介绍
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
论文名称:《Graph-based, Self-Supervised Program Repair from Diagnostic Feedback》 。
论文链接:https://arxiv.org/pdf/2005.10636.pdf
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
假设我们有一个有Bug的C ++程序(左上图) , 第5行char 的位置实际上应该是string 。 当编译程序时 , 程序将会如图右上报错:“第9行a的类型是char” 。
从此信息中 , 程序员可以注意到程序报错与变量a的类型有关 , 跟踪a在源代码中的使用或声明方式 , 到达第5行 , 然后编辑该行以更正错误 。
因此 , 我们希望我们的机器学习模型要解决的具体任务是 , 给定有Bug的代码(左图)和报错信息(右上图) , 定位错误行(第5行)并生成其修复版本(“string” tmp , a , b;”)(上图右下方) 。
挑战:
此任务带来两个主要挑战 。
1、在建模方面 , 需要通过两种方式(程序和报错信息)进行连接和共同推理:例如 , 如上例所示 , 跟踪导致代码报错的变量 。
2、在训练数据方面 , 需要有效的数据源 , 以提供监督学习来纠正含Bug的程序 。
不幸的是 , 现有的带有<broken code, fixed code>对的标记数据集比较小且难以获取 , 并且无法有效地扩展 。
2 模型方法
在本文中 , 作者通过以下两种方式提出了有效的解决方案:
1、使用程序反馈图对程序修复(改Bug)进行建模;
2、引入使用未标记程序的自监督训练方案 。
建模方法:程序反馈图
为有效地连接程序和报错信息两种方式并执行修复代码所需要的推理 , 作者引入了程序反馈图 , 这是一个连接图的表示 , 该图将整个程序中的代码符号与报错信息连接在一起 。
例如 , 示例中的编译器消息提到a , size和char , 因此我们可以将这些符号连接到源代码中它们出现的位置 , 以捕获对应语法响应 。
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
本文插图
这样 , 我们就可以在共享语法空间中处理这两种模态而不是分开地处理这两种模态 , 然后使用图注意力( graph attention)机制对这个空间中的符号进行推理。
下图是本文的模型架构 , 它建立在NLP中常用的编码器-解码器框架上 , 该框架对输入序列(在下图中为程序和报错信息)进行编码 , 然后对输出进行解码 , 并在架构的中间层(图中)将图注意力模块应用于程序反馈图中 。