写点什么

Facebook 发布 TransCoder:可将代码分分钟转换为另一种编程语言

  • 2020-06-09
  • 本文字数:1658 字

    阅读完需:约 5 分钟

Facebook发布TransCoder:可将代码分分钟转换为另一种编程语言

近日,Facebook 的研究人员表示,已经开发出一种神经网络编译器,可以将代码从一种高级编程语言(如 C ++,Java 和 Python)转换为另一种。


将现有的代码库迁移到主流或更高效的语言,如 Java 或 C++,需要源语言和目标语言方面的专业知识,而且通常成本很高。例如,澳大利亚联邦银行在 5 年内花费了约 7.5 亿美元将其平台从 COBOL 转换为 Java。超编译器在理论上可以提供帮助——它们消除了从头开始重写代码的需要——但在实践中却很难建立,因为不同的语言可能有不同的语法,并依赖于不同的平台 API、标准库函数和变量类型。


为简化这一问题,Facebook 推出了TransCoder,该工具采用无监督学习,可以让代码在 C ++,Java 和 Python 之间进行转换。


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


TransCoder 首先使用跨语言模型预训练进行初始化,该训练将表示相同指令的代码段映射为相同的表示形式,而与编程语言无关(源代码序列的输入流被随机屏蔽,并且 TransCoder 的任务是根据上下文预测被屏蔽的部分),降噪自动编码的过程会训练系统生成有效序列,即使在输入有噪声的数据的情况下,反向编译使 TransCoder 可以生成可用于训练的并行数据。


TransCoder 的跨语言性质是由跨编程语言存在的通用标记(锚点)的数量引起的,这些标记来自诸如“ for”,“ while”,“ if”和“ try”的通用关键字、数学运算符以及出现在源代码中的英文字符串。反向编译通过将源到目标模型与并行训练的“反向”目标到源模型耦合在一起来提高系统的编译质量。目标到源模型用于将目标序列编译成源语言,产生有噪声的源序列,而源到目标模型则有助于从噪声源重构目标序列,直到两个模型收敛。


Facebook 研究人员在公共 GitHub 语料库上对 TransCoder 进行了培训,该语料库包含超过 280 万个开源存储库,目标是函数级别的编译(在编程中,函数是可重复使用的代码块,用于执行单个相关动作)。在对所有可用的源代码进行预训练后,去噪自动编码和反向翻译组件只在函数上进行训练,在组件之间交替使用大约 6000 个标记批次。


为了评估 TransCoder 的性能,研究人员从 GeeksforGeeks 中提取了 852 个 C ++,Java 和 Python 并行函数,GeeksforGeeks 是一个在线平台,可收集编码问题并以多种编程语言提供解决方案。他们使用这些公式开发了一种新的度量标准:计算精度,测试给定相同输入时,假设函数是否生成与参考相同的输出。


Facebook 方面表示,虽然 TransCoder 表现最佳的版本并没有产生很多与预期完全相同的函数,但它的编译具有很高的计算精度。研究人员将其归因于波束搜索的结合,波束搜索是一种维护一组部分解码的序列的方法,该序列会附加到序列中,然后进行评分,从而使最佳序列冒泡到顶部:


  • 从 C ++转换为 Java 时,74.8%返回了预期的输出。

  • 从 C ++转换为 Python 时,67.2%返回了预期的输出。

  • 从 Java 转换为 C ++时,91.6%返回了预期的输出。

  • 从 Python 转换为 Java 时,56.1%返回了预期的输出。

  • 从 Python 转换为 C ++时,57.8%返回了预期的输出。

  • 从 Java 转换为 Python 时,68.7%返回了预期的输出。


根据研究人员的说法,TransCoder 在实验过程中展示了对每种语言特有的语法、数据结构及其方法的理解,并且在跨编程语言的情况下正确对齐了库,同时适应了较小的修改(例如当输入已重命名)。尽管它并不完美,例如 TransCoder 在生成过程中未能考虑某些变量类型,但它的性能仍然比一些框架要优秀。


该工具的一位共同作者写道:“ TransCoder 可以轻松地推广到任何编程语言,不需要任何专业知识,并且在很大程度上优于商业解决方案。我们的研究结果表明,通过向解码器添加简单的约束以确保生成的函数在语法上是正确的,或者通过使用专用架构,可以轻松解决该模型所犯的许多错误。”


Facebook 不是唯一开发代码生成系统的组织。在今年早些时候的 Microsoft Build 大会上,OpenAI 演示了一个在 GitHub 存储库上训练的模型,该模型使用英语注释生成整个功能。两年前,莱斯大学的研究人员创建了一个名为Bayou的系统,该系统通过将公开代码背后的“意图”相关联,并自主编写软件程序。


2020-06-09 11:212819
用户头像
陈思 InfoQ编辑

发布了 576 篇内容, 共 284.0 次阅读, 收获喜欢 1303 次。

关注

评论

发布
暂无评论
发现更多内容

taskwarrior ,一款提升效率的命令行的 TODO list 工具

Red

效率工具 TODO linux操作

浅析LSM-Tree存储模型

正向成长

LSM树 KV存储引擎

嘉云公司研发效能平台实践

小江

研发效能 CI/CD

Seldon 使用 (二):打包模型

托内多

tensorflow kubeflow Kubernetes PyTorch seldon

Python OpenCV 图片高斯模糊

梦想橡皮擦

Python OpenCV 4月日更

Docker 环境清理的常用方法

xcbeyond

Docker 4月日更

陪伴

小天同学

陪伴 育儿 个人感悟 4月日更

hive的数据存储格式

大数据技术指南

hive 4月日更

计算机原理学习笔记 Day2

穿过生命散发芬芳

计算机原理 4月日更

Java 并发基础(五):面试实战之多线程顺序打印

看山

Java并发

TIOBE榜单四月已出:上古语言Fortran重回前20?

Bob

编程语言、 4月日更 Tiobe

css

赫鲁小夫

4月日更

翻译:《实用的Python编程》08_03_Debugging

codists

Python

算法训练营 - 学习笔记 - 第二周

心在飞

企业上云一张网,华为将在分析师大会上亮出哪些大招?

脑极体

关于列表转字符串这个过程的曲折

ベ布小禅

4月日更

架构师训练营 4 期 大作业

引花眠

架构师训练营 4 期

「架构师训练营 4 期」大作业一&二

凯迪

架构师训练营 4 期

「架构师训练营 4 期」大作业二

凯迪

架构师训练营 4 期

PI的一种简写。

山@支

深入剖析 | JVM-Sandbox核心源码

九叔(高翔龙)

JVM 中间件 类加载 Sandbox 类隔离

重读《重构2》

顿晓

重构 4月日更

华仔架构实战营 - 作业 - 模块2

曲元洪

架构实战营

GitHub已爆火的Java突击手册,全面详细对标P7岗!真的很全面

比伯

Java 编程 架构 程序人生 计算机

微服务网关方案:Kong & Nacos

程序员架构进阶

架构 微服务 API网关 28天写作 4月日更

猫鼠游戏,一个刷票老千看在线投票项目的防范与取舍

ucsheep

安全 在线投票 防作弊 刷票

AI数据科学认证-2021年的最佳选择 John 易筋 ARTS 打卡 Week 44

John(易筋)

ARTS 打卡计划

初入江湖,IT从业者应该如何选择?

云峰

对前端趋势的一些理解

葱小白

大前端

并发容器与并发控制 - JUC

学Java关注我

Java 编程 程序员 架构 计算机

吃透Nginx编译安装过程

书旅

nginx

Facebook发布TransCoder:可将代码分分钟转换为另一种编程语言_架构_Kyle Wiggers_InfoQ精选文章