2020-09-18 14:47

导语:还在抠bug抠到怀疑人生?

作者 | 青 暮

编辑 | 丛 末

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

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

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

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

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

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

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

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

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

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

1

MISIM架构

MISIM架构概览

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

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

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

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

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

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

MISIM-GNN 架构

2

不再重复造轮子

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

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

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

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

3

相关论文

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

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

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/

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

  1. 关于“不要重复造轮子”的不同看法

    在计算机领域(包括软件和硬件),我们经常能看到一种论调,那就是"不要重复造轮子".这种言论一般用来批评在开发过程中没有很好的利用现有技术,而是从头做起. 鄙人一直也认为这种看法没有 ...

  2. 造轮子是什么意思_程序员发文质疑阿里天启为kpi项目,重复造轮子,阿里回应:诽谤...

    前言: 曹丕在<典论·论文>中说到,"文人相轻,自古而然".中国自古就有文人相轻的传统,文人相轻真没有什么要紧的,就像是小夫妻似的斗斗气拌拌嘴,然后还可以理直气壮地拿稿 ...

  3. 不是“重复”造轮子,百度飞桨框架2.0如何俘获人心

    2016 年,百度 PaddlePaddle 打响了国产深度学习框架开源的第一枪. 2019 年 4 月,在 Wave Summit 深度学习开发者峰会上,首次发布了PaddlePaddle 的中文名 ...

  4. Spring Boot并不重复“造轮子”

    2.1 Spring Boot简介 Spring Boot是由Pivotal团队提供的基于Spring的全新框架,其设计目的是简化Spring应用的搭建和开发过程.该框架遵循"约定大于配置& ...

  5. 51年被发现9次,陶哲轩证明的公式成了重复造轮子?事情并没有这么简单

    晓查 栗子 发自 凹非寺  量子位 报道 | 公众号 QbitAI 在科学探索的过程中,"重复造轮子"从来就不新鲜. 最知名如牛顿和莱布尼茨,各自独立发明了微积分:而计算机领域,也 ...

  6. 程序员到底要不要重复造轮子?

    分享一波:程序员赚外快-必看的巅峰干货 关于这个话题,现在这里阐述立场:就公司工作而言,不建议重复造轮子.就个人技术而言,强烈建议造轮子! 程序员圈子里流行这么一句话:"不要重复造轮子&qu ...

  7. 微软 CEO 萨提亚·纳德拉:不要重复造轮子,提升技术强密度

    扫描二维码,查看精彩回顾 据中国互联网络信息中心(CNNIC)发布的第 44 次<中国互联网络发展状况统计报告>显示,截至 2019 年 6 月,我国网民规模达 8.54 亿,较 2018 ...

  8. 7个实用的Python自动化代码,别再重复造轮子了!

    关于Python有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重复 ...

  9. 到底是否应该重复造轮子

    引言 之所以谈起这个话题,是因为和新公司同事的一次交流.他是LZ当时二面的面试官(以下简称CZ),看过LZ的github,因此知道LZ正在尝试写一个redis的Java客户端.在交流的过程中,CZ给L ...

最新文章

  1. 唯品会实时计算平台的演进之路
  2. ionic开发中页面跳转隐藏底部Ttab
  3. 分析UIWindow
  4. 怎样的代码算是好代码?
  5. JAVA——实现json bean实体类的传参校验模板及注解详解
  6. xcode6.1中 symbolicatecrash位置
  7. .netcore 和 java_Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
  8. Date对象中的方法
  9. asp.net 调用echarts显示图表控件随浏览器自适应解决方案
  10. 全网首发:以字型为例,以bit表示的二维数组矩阵,旋转90、-90
  11. win7计算机桌面位置,win7系统更改桌面位置的操作方法
  12. 淘宝无线端一键直达微博自助生成工具
  13. ubuntu18.04安装nvidia驱动(戴尔G15_3060版本)
  14. 永磁同步电机死区补偿C语言代码
  15. postman Could not send request
  16. 如何合并多个工作表或多个工作簿?3种合并方法都在这
  17. 怎么用计算机弹出soldout,《SOLDOUT2》游戏怎么玩 游戏攻略玩法全面介绍
  18. 从零开始学WEB前端——HTML实战练习
  19. 一个关于创业不错的博客
  20. MD5加密中文字符问题详解

热门文章

  1. 传入一个日期 返回该月的第一天是星期几_Excel VBA 编程开发应用系列 (二十一)— Excel常用的日期函数...
  2. python调用r_python调用R包的问题
  3. svm对未知数据的分类_基于SVM的高维不平衡数据分类方法与流程
  4. 2020-08-20 CountVectorizer 包含示例 API
  5. 配置一台计算机所需的东西,攒一台计算机需要的配置
  6. Ubuntu磁盘空间如何扩容
  7. 王建民做客第六期青年学者月度沙龙 分享工业软件的开源创新发展模式
  8. ACL 2021 | 腾讯AI Lab、港中文杰出论文:用单语记忆实现高性能NMT
  9. 独家 | 在Python编程面试前需要学会的10个算法(附代码)
  10. 云校庆系列活动 | 软件定义新基建,数据驱动新未来