这一篇是我们这个系列的最后一篇,也是AI for code的第二个应用。前面一篇:液态黑洞:让AI帮你写代码 –(二)编译优化 主要是解决代码效率的问题,我们这篇主要针对代码的正确性或可读性的一些应用等等。我们主要针对四种智能编程的问题依次进行介绍利用AI技术的方法,主要包括:
- 错误自动查找
- 错误自动修复
- 代码搜索
- 代码克隆检测
当我们打算应用深度学习来解决智能编程中的问题时,我们首先把它拆分成三个小问题:1. 能否在自然语言处理任务中找到一个类似的问题;2. 如何为这个问题创建训练数据;3. 如何表示代码。对每个任务我们都会从这三个维度来解答,从而能够更清晰地看到问题的解决思路。
由于程序员的很多时间都会花费在代码维护或debug上,因此自动发现错误的深度学习技术对软件开发来说非常重要,可以很大程度上提高生产力。这里的代码错误不仅是普通的语法错误,也有可能是编译器检查不到的错误。在词法层面上通常是和代码中的标识符或名称相关联的错误,也有与程序语法相关的错误,和与程序逻辑或语义相关的更难查找的错误。
对于这个任务,我们首先回答一下我们上面提到的三个拆分的问题。对于第一个问题,能否在NLP中找到一个类似的任务。如果我们想要识别出错误代码和正确代码,在标准的自然语言处理领域种有一些技术可以已经被用来识别文本错误,无论是拼写、语法还是语义错误,这就是我们所说的文本错误检测。它的应用非常普遍,你会看到word编辑器会提供拼写检查和语法错误检测。这种任务就是给定某种人类语言,识别出其中的错误。类似地,代码的错误检测可以被建模为一个文本分类问题,我们可以考虑应用文本分类任务中的模型或研究经验来查找错误。
对于剩余两个问题,创建训练数据和表示代码,我们引入一篇论文来解释,叫DeepBugs,主要针对命名相关的错误debug,这种错误形式是比较表面的,是一种相对容易检测的错误类型,我们通过几个示例来展示什么是命名类型的错误。
我们看一下下面这段代码,其中有一个函数setPoint,它以x, y两个参数为输入。我们可以先忽视它的内部实现而看成一个黑盒。当我们调用这个函数时,我们是用 y_dim 和 x_dim 作为参数调用的,这里很明显传递参数的顺序在我们的理解中被错误地交换了,因此这是一个命名错误,通常是因为开发人员不了解参数的顺序或者疏忽而出现,这种错误是不会被编译器识别的。
我们再看一个命名相关的错误。如下,for 循环中正在遍历一个名为 params 的数组,for 循环中的条件检查实际上应该是将循环变量 j 与 params 的长度(params.length)进行比较,但这里由于疏忽写错了,所以这是另一种命名错误。
有很多工作试图在源代码中检测此类命名错误,并且这些工作大多是基于确定性规则的,因此通常不能很好地移植到类似的代码库中,并且不够鲁棒。利用深度学习或机器学习来学习一个检测器自动检测代码中的错误,可以减少手工制作的错误检测器遇到的问题。所以DeepBugs是从这个角度提出的,首先给定一个代码语料库,它的基本流程如下图,先生成训练数据,然后将这些输入代码表示为向量,再提供给一个两类的文本分类器,一旦你训练好了这个分类器,就可以用来预测新代码中的错误。
原文链接:https://zhuanlan.zhihu.com/p/410626458?utm_id=0