用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%
晓查 发自 凹非寺
量子位 报道 | 公众号 QbitAI
还记得美国前一阵要招聘60岁的老程序员吗?都怪编程语言发展太快!
因为新冠疫情的缘故,美国一些地区的失业救济系统不堪重负,而这些系统都是上古语言COBOL写的。
然而,现在早已经是C/C++、Java、Python的天下了,把COBOL程序换成Python,何其难也。
远的不说,Python 2刚刚淘汰,过去的老程序手工转成Python 3也是个很大的工程。
既然AI能翻译自然语言,那也应该能翻译编程语言。
Facebook也是这么想的,所以他们最近提出了TransCoder,一个翻译编程语言的AI,现在可以在C++、Java、Python语言之间互译。
经翻译后的程序,成功运行的通过率最高可以达到80.9%。
而且TransCoder是一种无监督学习算法,意味着不需要大量成对的、标记的编程代码数据集进行训练。
如果这项技术达到实用化程度,对广大程序员来说真是巨大福音啊!
难怪论文作者之一Guillaume Lample在Twitter上宣布了这篇论文后很快引起了热议。
翻译编程语言,什么原理?
TransCoder充分利用了编程语言的特点,比如像for、while、if这些关键词以及通用的数学运算符。
下图展示了C++、Java和Python关键字的嵌入。在相似的上下文中使用的不同编程语言的关键字在嵌入空间中非常接近。
例如,Python中的except和Java、C++中的catch都用于获取异常,它们被映射到非常相似的嵌入空间位置。
对于映射的实现(map和dict)、用于将字符串转换为字符数组(c_str和toCharArray)以及类似的变量类型(例如long、int和Integer),也可以观察到相同的现象。
那么以上这些关键词的嵌入是如何获得的?
Facebook提出了实现无监督编程语言机器翻译的三个原则。
首先,通过跨语言掩码语言模型(MLM)预处理来初始化模型,这有些类似于自然语言的填空题。结果是表达相同指令的代码片段被映射到与编程语言无关的相同表示。
其次是去噪自动编码,它能训练解码器始终生成有效序列,即使在输入有噪声的数据时也是如此,提高了编码器对输入噪声的鲁棒性。
最后是反向翻译,它允许模型生成可用于训练的并行数据。每当Python转C++模型变得更好时,它就会为C++转Python模型生成更精确的数据,反之亦然。
通过以上步骤,TransCoder在训练后获得了之前提到的跨语言嵌入。
我们观察到,TransCoder成功地理解了每种语言特有的语法、数据结构、函数库和方法。
在上面的图中,展示了Java和C++独有的三元运算符X ? A : B,翻译到Python中就变成了if X then A else B。
以下是一个从Python翻译到C++的实例。TransCoder推断变量和函数返回值的类型,将Python的deque()容器映射到C++中类似的实现deque<>,并使用C++的front、back、pop_back和push_back方法来检索和插入deque中的元素,而不是使用Python方括号、pop和append方法。
实验结果
为了训练TransCoder,Facebook在GitHub上寻找了280万个开源代码库进行训练,其中包含数百亿个token。
然后去GeeksforGeeks平台去验证翻译成果,该平台是收集各类编码问题,并以多种编程语言提供解决方案。
和自然语言不同的是,代码翻译并不太要求逐字逐句的对照,因此翻译后的代码和参考代码的重合度其实很低,比如C++转Java的代码和Ground Truth仅有3.1%匹配。
另外NLP翻译中的BLEU也不宜作为代码翻译的衡量标准,因为这只能表示实际代码和参考代码之间的语法差异。
因此需要一个新的度量标准——计算正确率,它表示翻译后的代码测试后是否能与参考代码有相同的输出。
以此为标准,C++转Java的代码的计算正确率为60.9%,而Java转C++的计算正确率为80.9
%。
Facebook不是唯一开发AI代码生成系统的公司。前不久微软Build大会上,OpenAI就演示了一个在GitHub数据上训练的模型,仅根据注释内容即可生成对应功能的代码。
TransCoder没那么智能,但是在计算机技术飞速发展的今天,谁知道下一个流行的语音是什么,有了TransCoder,至少让我们在移植代码的时候没那么难了。
也许美国社保系统的COBOL就靠它解决了。
论文地址:
https://arxiv.org/abs/2006.03511
— 完 —
喜欢就点「在看」吧 !
用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%相关推荐
- 牛逼!用 AI 实现 C++、Java、Python 代码互译!
公众号关注 "GitHubDaily" 设为 "星标",带你了解技术圈内新鲜事! 转自量子位 还记得美国前一阵要招聘 60 岁的老程序员吗?都怪编程语言发展太快 ...
- 这款实现 C++、Java、Python 代码互译的工具,很强!
点击上方"Github中文社区",关注 看遍Github好玩的项目 转自量子位 还记得美国前一阵要招聘 60 岁的老程序员吗?都怪编程语言发展太快! 因为新冠疫情的缘故,美国一些地 ...
- python代码打好了怎么运行-python代码是怎样运行的
python作为一种动态语言,其实是一个解释器软件包.当Python运行脚本时,在代码开始进行处理之前,Python还会执行一些步骤.第一步是编译成所谓的"字节码",如果Pytho ...
- python代码怎么运行-python代码是怎样运行的
python作为一种动态语言,其实是一个解释器软件包.当Python运行脚本时,在代码开始进行处理之前,Python还会执行一些步骤.第一步是编译成所谓的"字节码",如果Pytho ...
- python代码写好了怎么运行-python代码是怎样运行的
python作为一种动态语言,其实是一个解释器软件包.当Python运行脚本时,在代码开始进行处理之前,Python还会执行一些步骤.第一步是编译成所谓的"字节码",如果Pytho ...
- python代码写好了怎么运行不了-python代码可以直接运行吗 Python写了代码如何运行...
先下载python,然后打开命令行,输入 python 你的代码文件名. 有python代码怎么编成可执行的exe程序? 如果可以能否帮小编做成可执行的exe程序儿女情长什么的,真的很影响小编行走江湖 ...
- 【Python自学笔记】快速入手PyScript,让Python代码优雅的运行于HTML
文章目录 前言 安装 使用 Pyscript的标签 Hello World 写入标记元素 声明依赖 导入本地模块(文件) 插入编辑器 document交互 遇到的坑 相关阅读 前言 python原来就 ...
- golang 腾讯AI 机器翻译调用 实现中英互译服务
对腾讯AI机器翻译接口的调用 在上一次文字识别代码的基础上,进行了改进,代码结构优化了一点(我认为···) 开完账号,加好应用能力,安装好依赖包,按代码最后的提示改成http(如果要在其他页面中访问, ...
- MTCNN(一)python代码训练与运行
目录 一.相关知识 二.训练与运行 2.1 背景知识 tfrecords 2.2 程序作用 2.3 命令行 2.4 运行程序 2.5 指定运行的显卡命令行 三.参数量的查询 3.1 tensorflo ...
最新文章
- HEVC-CABAC
- ecshop在首页调用dedecms文章
- [vue] 你有使用做过vue与原生app交互吗?说说vue与ap交互的方法
- codevs 3287 货车运输 NOIP2013提高组
- 无痛苦的软件维护——文档和代码
- BZOJ 4094 USACO 2013 Dec. Optimal Milking
- php 社区,社区(phpmysql)一
- 软件开发的需求分析样例
- MySQL 高性能表设计规范
- 测试方案/测试计划/测试报告
- 编写myqq,即时聊天脚本
- 图像分割——meanshift算法(C++GDAL库)
- countif和sum套用_COUNTIF与SUMIF函数的常见用法
- html光标自动定位到文本框,进入JSP页面时就将光标定位到指定的文本框中
- 赵小楼《天道》《遥远的救世主》深度解析(54)简单聊聊基督的信仰、教义和天堂的说法
- python银行利息问题_(完整版)存款利率问题应用题
- 眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (三)
- Certificate、Provisioning Profile、App ID的介绍及其之间的关系
- android epub 开源,EPUB SDK
- python爬取微博评论并做词频分析_爬取李子柒微博评论并分析
热门文章
- 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
- 记录一次自己清理数据的过程
- Matlab与线性代数 -- 稀疏矩阵的创建
- 如何教计算机认识手写数字(上)
- 一口一个,超灵活的Python迷你项目
- 李开复口中的“联邦学习” 到底是什么?| 技术头条
- 公开课报名 | 深入浅出理解A3C强化学习
- “基因编辑婴儿”惹争议,你或许不知道机器学习在脱靶效应中的作用?
- 科大讯飞拟募资36亿,要搞什么大事?
- 元旦福利 | Python、机器学习、TensorFlow 图书送一波