25

不再重复造轮子,AI 给你推荐更好的代码,还没bug

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzA5ODEzMjIyMA%3D%3D&%3Bmid=2247516293&%3Bidx=1&%3Bsn=6d9c6ad45a63f311a7a71b3396fe727a
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

AJfuyyu.jpg!web

作者 | 青 暮

编辑 | 丛 末

程序员的的代码大部分都不是如同写书法那般一挥而就,而需要反复地抠bug,抠到怀疑人生。

7RzqAzN.gif       

剑桥大学法官商学院发表的一项研究显示, 程序员将50.1%的工作时间用于编程,而将一半的时间用于debug 。估计每年的debug总费用为3120亿美元。

现代软件系统越来越复杂,很多时候一个小小的错误就可能让系统崩溃,带来巨大损失。所以不仅是程序员,企业也在为debug付出巨大代价。但现在,AI带来了福音。

英特尔、麻省理工学院、佐治亚理工学院的研究人员合作开发了自动化代码相似性检测系统MISIM,该系统可以判断两段代码的相似性,即便 这两段代码使用的是不同的结构和算法 ,也可以依据它们是否执行相似的任务、是否有相似的代码特征加以判断。

代码相似性检测可以应用在代码推荐、自动修复bug中。在代码推荐的应用过程有点像输入法的词推荐,由于MISIM可以对不完整的代码片段进行评估, 当它检测到不完整的、有bug的代码时,就会从其它地方选出功能一样的、没有bug的代码,来替换原来的代码。

JF3ueu.gif       

并且,MISIM 还会将代码转换为统一的形式,确定代码功能,从而在不受编写方式的影响下进行代码片段的对比。 由于MISIM不受编程语言限制,它还可以用于代码语言转换。

在45,780个程序的实验评估中,MISIM识别C和C ++程序中的代码,这些程序是由学生编写的,旨在解决104个编码问题。如果一对程序都解决了相同的问题,则它们在数据集中被标记为相似。MISIM的表现始终好于三个当前最先进系统,最高达到40.6倍。

自动代码生成一直是一个研究热点,产业界和学术界都在此方向上努力着。OpenAI的GPT-3语言模型甚至可以根据自然语言描述生成网页布局的代码。 而代码相似性检测则可以复用已有代码,使质量高的代码得到更有效的利用。       

EFZnUb6.gif

输入“创建一个长得像西瓜的按钮”,GPT-3就生成了上图中绿皮红瓢的原型按钮。或者输入“welcome to my newsletter的大号字体”,GPT-3就生成了上图中的红色大号字体。

当然,代码相似性检测也可以用于代码查重。所以,计算机系的同学们,注意自己写作业!虽然现在已有非AI的代码查重系统,但谁知道AI什么时候会后来居上呢?

1

MISIM架构

JBveEjy.png!web

MISIM架构概览

MISIM由两个核心组件组成。首先,MISIM具有新型的上下文感知语义结构(CASS),该结构通过捕获描述代码上下文的信息,使用机器学习算法来确定给定源代码的目的(例如,代码是一个函数调用、一个操作等)。其次,MISIM还具有基于神经网络的代码相似性评估算法,该算法可通过各种神经网络架构来实现。

一旦构建了CASS,就将其向量化并用作神经网络的输入,神经网络会生成特征向量。生成特征向量后,就可以进行代码相似度评估(例如,向量点积、余弦相似度等)。

对于MISIM的相似性评估算法,研究人员研究了三种神经网络方法:GNN、RNN和BoF神经网络。其中,使用GNN的 MISM 总体表现最好,能够以超过75%的准确率识别出两个程序的相似程度。

将代码的结构与CASS集成在一起后,算法就会根据代码要执行的工作计算相似性分数。即使两段代码表面上不同,如果执行相同的功能,模型就会将它们评估为相似。

CASS可以配置特定的上下文,从而能够捕获描述代码的更高级别信息。而且CASS可以在不使用编译器的情况下对代码进行评级(编译器将人类可读的源代码转换为计算机可执行的机器代码),甚至可以对不完整的代码片段进行评估。

MISIM-GNN的架构如下图所示。对于这种方法,输入代码的CASS表征被转换为图。然后,将图中的每个节点嵌入一个可训练的向量,作为该节点的初始状态。接下来,使用GNN迭代更新每个节点的状态。最后,应用全局读取函数从节点的最终状态提取整个图的向量表征。

iEnIneV.png!web

MISIM-GNN 架构

2

不再重复造轮子

研究人员仍然在扩展MISIM的特征集,目的是创建一个代码推荐引擎,它能够识别算法背后的意图,并提供语义上相似但性能有所提高的候选代码。系统可以指示程序员使用库函数,而不用再重复造轮子。

像MISIM这样的以AI为动力的代码建议和审查工具有望大幅削减开发成本,同时使编码人员能够专注于更具创造性、减少重复性的任务。

英特尔实验室首席科学家兼机器编程研究总监Justin Gottschlich表示:“如果该系统能取得成功,我们的最终目标之一就是实现全民编程。”

或许有一天,代码相似性检测可以扩展到自然语言中,到时候要实现全民编程,就不再是难事。

相关论文

fM3YJbn.png!web

论文地址:https://arxiv.org/pdf/2006.05265.pdf

IFZNbqi.png!web

代码相似检测系统的准确率比较,结果是运行3次的平均值和相对于平均值的最小/最大值。

iEJVrqQ.png!web

code2vec、NCC、Aroma、MISIM在POJ-104测试集上的准确率结果。条形高度表示运行3次测量值的平均值,误差条由测量值的最小值和最大值确定。

参考资料:

https://venturebeat.com/2020/07/29/intel-researchers-create-ai-system-that-rates-similarity-of-two-pieces-of-code/

https://www.theregister.com/2020/07/31/intel_wants_to_build_an/

rAneym.jpg!web

更多交流

扫码关注AI研习社小助手2(AIyanxishe3),备注【 RL夏令营 】,参与更多交流互动!

IFBvieY.jpg!web

阅读原文,直达官方报名地址。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK