因为新冠疫情的缘故,美国一些地区的失业救济系统不堪重负,而这些系统都是上古语言 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

由 GitHubDaily 原班人马打造的公众号:GitCube,现已正式上线! 接下来我们将会在该公众号上,为大家分享优质的计算机学习资源与开发者工具,坚持每天一篇原创文章的输出,感兴趣的小伙伴可以关注一下哈! Anania 是一个机器人数据分析师,可以通过简单、自然的英语对话来分析您的数据。连接数据源并以简单的英语提问,无需任何设置或配置。在幕后,Anania 正在使用一个 AI 系统,该系统将文本转换为 SQL 和 Python 代码 并执行您的数据以获得答案。由 GPT-3 提供支持的机器人数据分析师。言简意赅:提供数据(数据源:excle,数据库等),可以通过提问的形式对数据分析网址:https://anania. ai /例如:对话提问:“有多少初创公司的估值超过 20 美元? AI 生成一个后台。 小弟一直没用过Linux。平时的码也只是在WINDOW上用SWIG或CYGWIN进行编译。下面的例子,先从网上找来一个.c文件。example.c/*File:example.c*/#includedoubleMy_variable=3.0;intfact(intn){if(n<=1)return1;elsereturnn*fact(n-1);}intm... 机器之心编辑参与:思源你是否常训练炫酷的机器学习模型,用来分析数据或执行某些新奇的任务?你是否发现你的模型只能在一定开发环境上才能跑起来,很难部署也很难加入其它程序?今天我们将介绍一个炫酷的工具,它可以把构建在 scikit-learn 或 XGBoost 等库上的 ML 模型直接转化为不需要任何依赖项的 Java / Python /C 源 代码 。项目地址:https://github.com... 实际工程可能存在如下部分:业务接口需要编程高效的语言(如 Python Java 等),易于部署维护;而核心算法部分,某些场景需要高效计算,会使用性能高效的语言(如C/ C++ 等)。对于上述场景,“粘合剂”工具可以将语言打包, 实现 跨语言调用。例如 Java / Python 可以使用Swig转换后的C/ C++ 代码 Python 可以使用JPype等调用 Java 代码 。这种跨语言调用的场景能帮助我们解决例如不同语言间性能差异、存量 代码 等问题。 广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!将 python 程序转换成exe.一、 先安装 python 1、首先访问http:www. python .orgdownload去下载最新的 python 版本。 2、安装下载包,一路next。 3、为计算机添加安装目录搭到环境变量,如图把 python 的安装目录添加到pth系统变量中即可。 (... 参与:魔王Facebook 提出的无监督 代码 转换方法 TransCoder 能够以高准确率 实现 C++ Java Python 三种编程语言之间的函数转换。只需单语源 代码 ,无需任何源... c++ python 知识小记之一# -*- coding: utf-8 -*-#utf-8支持中文编码words=['cat','dog','chicken']for w in words[:]: #words[:]复制了原本的listwords.insert(0, w)print wordsa = range(0,10,4)print aargs=[3,10,3]print range(*ar... 一、概念的了解 1.JVM—— Java 虚拟机,跨平台翻译, Java Virtual Machine; 2.JRE—— Java 程序的运行环境,包含运行时所需的类库, Java Runtime Environment; 3.JDK—— Java 开发工具包,包括 java c编译器、 java 运行工具, Java Development Kit;