用AI实现C++、Java、Python代码互译,运行成功率最高达80.9%

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 还记得美国前一阵要招聘60岁的老程序员吗?都怪编程语言发展太快! 因为新冠疫情的缘故,美国一些地区的失业救济系统不堪重负,而这些系统都是上古语言COBOL写的。

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


还记得美国前一阵要招聘60岁的老程序员吗?都怪编程语言发展太快!

因为新冠疫情的缘故,美国一些地区的失业救济系统不堪重负,而这些系统都是上古语言COBOL写的。

1

然而,现在早已经是C/C++、Java、Python的天下了,把COBOL程序换成Python,何其难也。

远的不说,Python 2刚刚淘汰,过去的老程序手工转成Python 3也是个很大的工程。

既然AI能翻译自然语言,那也应该能翻译编程语言。

Facebook也是这么想的,所以他们最近提出了TransCoder,一个翻译编程语言的AI,现在可以在C++、Java、Python语言之间互译。

2

经翻译后的程序,成功运行的通过率最高可以达到80.9%。

而且TransCoder是一种无监督学习算法,意味着不需要大量成对的、标记的编程代码数据集进行训练。

如果这项技术达到实用化程度,对广大程序员来说真是巨大福音啊!

难怪论文作者之一Guillaume Lample在Twitter上宣布了这篇论文后很快引起了热议。

3

翻译编程语言,什么原理?

TransCoder充分利用了编程语言的特点,比如像for、while、if这些关键词以及通用的数学运算符。

下图展示了C++、Java和Python关键字的嵌入。在相似的上下文中使用的不同编程语言的关键字在嵌入空间中非常接近。

4

例如,Python中的except和Java、C++中的catch都用于获取异常,它们被映射到非常相似的嵌入空间位置。

对于映射的实现(map和dict)、用于将字符串转换为字符数组(c_str和toCharArray)以及类似的变量类型(例如long、int和Integer),也可以观察到相同的现象。

那么以上这些关键词的嵌入是如何获得的?

Facebook提出了实现无监督编程语言机器翻译的三个原则。

首先,通过跨语言掩码语言模型(MLM)预处理来初始化模型,这有些类似于自然语言的填空题。结果是表达相同指令的代码片段被映射到与编程语言无关的相同表示。

5

其次是去噪自动编码,它能训练解码器始终生成有效序列,即使在输入有噪声的数据时也是如此,提高了编码器对输入噪声的鲁棒性。

最后是反向翻译,它允许模型生成可用于训练的并行数据。每当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方法。

6

实验结果

为了训练TransCoder,Facebook在GitHub上寻找了280万个开源代码库进行训练,其中包含数百亿个token。

7

然后去GeeksforGeeks平台去验证翻译成果,该平台是收集各类编码问题,并以多种编程语言提供解决方案。

和自然语言不同的是,代码翻译并不太要求逐字逐句的对照,因此翻译后的代码和参考代码的重合度其实很低,比如C++转Java的代码和Ground Truth仅有3.1%匹配。

另外NLP翻译中的BLEU也不宜作为代码翻译的衡量标准,因为这只能表示实际代码和参考代码之间的语法差异。

因此需要一个新的度量标准——计算正确率,它表示翻译后的代码测试后是否能与参考代码有相同的输出。

8

以此为标准,C++转Java的代码的计算正确率为60.9%,而Java转C++的计算正确率为80.9
%。

Facebook不是唯一开发AI代码生成系统的公司。前不久微软Build大会上,OpenAI就演示了一个在GitHub数据上训练的模型,仅根据注释内容即可生成对应功能的代码。

TransCoder没那么智能,但是在计算机技术飞速发展的今天,谁知道下一个流行的语音是什么,有了TransCoder,至少让我们在移植代码的时候没那么难了。

也许美国社保系统的COBOL就靠它解决了。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-06-09
本文作者:晓查
本文来自:“量子位公众号”,了解相关信息可以关注“公众号QbitAI”

相关文章
|
1月前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
|
9天前
|
Rust JavaScript 前端开发
[oeasy]python075_什么是_动态类型_静态类型_强类型_弱类型_编译_运行
本文探讨了编程语言中的动态类型与静态类型、强类型与弱类型的概念。通过实例分析,如Python允许变量类型动态变化(如`age`从整型变为字符串),而C语言一旦声明变量类型则不可更改,体现了动态与静态类型的差异。此外,文章还对比了强类型(如Python,不允许隐式类型转换)和弱类型(如JavaScript,支持自动类型转换)的特点。最后总结指出,Python属于动态类型、强类型语言,对初学者友好但需注意类型混淆,并预告下期内容及提供学习资源链接。
48 21
|
15天前
|
消息中间件 Java 应用服务中间件
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
|
1天前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的体育用品商城管理系统源码+运行步骤+课程设计
一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的体育用品销售商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 4
|
11天前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
24 4
|
13天前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
|
23天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
|
25天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
1月前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
262 9
|
1月前
|
人工智能 自然语言处理 程序员
体验通义灵码的AI程序员:用Python+Tkinter实现表单向config.ini写入与读取
本文介绍了如何利用通义灵码的AI程序员快速开发一个基于Python和Tkinter的表单应用程序,实现对config.ini文件的读写。通过简单的自然语言描述,通义灵码能自动生成代码框架、自动补全功能代码,并提供错误检测与修复建议,极大提高了开发效率。开发者只需安装必要库(如configparser)并配置VSCode插件TONGYI Lingma,即可轻松创建包含多个输入项和按钮的表单界面。运行程序后,用户可以编辑表单并保存数据到config.ini文件中,再次启动时数据会自动加载显示。这一过程展示了AI在编程中的高效性和灵活性,为开发者提供了全新的开发方式。
135 3

热门文章

最新文章