译者 | 刘畅

出品 | AI科技大本营(ID:rgznai100)

将早期的编程语言(例如COBOL)的代码库迁移到现在的编程语言(例如Java或C++)是一项艰巨的任务,它需要源语言和目标语言方面的专业知识。COBOL如今仍在全球大型的系统中广泛使用,因此公司,政府和其他组织通常必须选择是手动翻译其代码库还是尽力维护使用这个可追溯到1950年代的程序代码。

FaceBook公司开发了一个工具TransCoder,这是一个完全自我监督的神经编译器系统,它可以使代码迁移变得更加轻松和高效。本文的方法是第一个能够将代码从一种编程语言转换为另一种编程语言而无需并行数据进行训练的AI系统。本文已经证明TransCoder可以成功地在C++,Java和Python 3之间进行翻译功能。

TransCoder的性能优于开源的代码和基于商业规则的翻译程序。在本文的评估中,该模型正确地将90%以上的Java函数转换为C++,将74.8%的C++函数转换为Java,并将68.7%的函数从Java转换为Python。相比之下,市售工具只能正确地将61.0%的功能从C++转换为Java,而开源的翻译器仅能准确地将38.3%的Java函数转换为C++。

自我监督训练对于在编程语言之间进行翻译特别重要。传统的有监督学习方法依赖于大规模的并行数据集进行训练,但是对于COBOL到C++或C++到Python来说,这些数据根本不存在。TransCoder只依赖于仅用一种编程语言编写的源代码,而不需要源代码和目标语言中的相同代码示例。它不需要编程语言方面的专业知识,并且可以很容易地将TransCoder的方法推广到其他编程语言中。本文还创建了专门为此领域设计的新的评估指标。

TransCoder对于将遗留代码库更新为现代编程语言可能很有用,现代编程语言通常更高效且易于维护。它还展示了一个神经机器翻译技术应用的新领域。与Facebook AI以前使用神经网络解决高级数学方程式的工作一样,本文认为NMT可以帮助完成通常与翻译或模式识别任务无关的其他任务。

特意为编程语言建立序列到序列模型

在自然语言中,即使在越来越依赖自动化机器翻译系统的专业翻译人员群体中,神经机器翻译的最新结果也被广泛认可。但是,由于代码翻译领域中缺少并行数据,因此它们在该方面的应用受到了限制。程序员仍然依赖于基于规则的代码转换工具,这需要专家复查和调试输出,或者手动翻译代码。TransCoder通过利用无监督机器翻译到编程语言翻译取得的成功来克服这些挑战。

本文构建了一个带有注意力机制的序列到序列(seq2seq)模型,该模型由具有转换结构的编码器和解码器组成。TransCoder使用单个共享模型,部分基于Facebook AI以前在XLM上针对所有编程语言所做的工作。本文按照Facebook AI先前的研究中详细介绍的无监督机器翻译的三个原则进行了训练:初始化,语言建模和反向翻译。

本文首先利用开源GitHub项目中的源代码使用蒙版语言模型(MLM)对本文的模型进行了预训练。就像自然语言处理中的上下文一样,这种预训练会创建跨语言的嵌入:在相似上下文中使用来自不同编程语言的关键字在嵌入空间(例如catch和except)中非常接近。这些嵌入的跨语言性质来自存在于多种语言中的大量通用的标记(锚点)。锚点的示例包括C++,Java和Python通用的关键字(例如,for,while,if,try),以及源代码中出现的数学运算符,数字和英语字符串。

使用MLM进行预训练使TransCoder可以生成输入序列的高质量表示。然而,由于从未训练过解码器基于源表示对序列进行解码,因此解码器缺乏翻译能力。为了解决此问题,本文训练了该模型使用降噪自动编码(DAE)对序列进行编码和解码。 DAE的工作方式类似于有监督的机器翻译算法,在该算法中,模型被训练为在给定序列存在损坏的情况下预测该序列。

作为输入给解码器的第一个符号是指示输出编程语言的特殊标记。在测试时,该模型可以对Python序列进行编码,并使用C++起始符号对其进行解码以生成C++翻译器。C++翻译的质量将取决于模型的“跨语言”:如果编码器将Python函数和有效的C++翻译映射到相同的潜在表示,则解码器将成功翻译成C++。

仅预训练的跨语言模型和自动降噪就足以进行翻译。但是,这些翻译的质量往往很低,因为从未训练过该模型在测试时应该完成什么样的工作,即从一种语言翻译为另一种语言的功能。为了解决此问题,本文使用反向翻译,这是在弱监督的情况下利用单语数据的最有效方法之一。

对于每种目标语言,本文使用一个模型和一个不同的开始标记。它经过训练可以从源到目标以及从目标到源并行转换。目标到源版本用于将目标序列翻译成源语言,从而产生与标记目标(GT)序列相对应的嘈杂源序列。然后以弱监督的方式训练模型,让模型可以从嘈杂的源序列中重建目标序列,并学习从源到目标的转换。直到收敛为止。

为了评估该模型,以前对源代码翻译的大多数研究都依赖于自然语言中使用的度量标准,例如BLEU分数或其他基于标记之间相对重叠的方法。但是,这些类型的指标不太适合编程语言。语法差异小的两个程序在执行代码时可能会获得很高的BLEU分数,但会产生非常不同的结果。相反,具有不同实现方式的语义等效程序将具有较低的BLEU分数。另一种度量标准是参考匹配,或与GT完全匹配的翻译百分比,但这通常会低估翻译的质量,因为它无法识别语义上等效的代码。

为了更好地衡量TransCoder和其他代码翻译技术的性能,本文创建了一个称为计算精度的新指标,该指标可评估假设函数在给定相同输入时是否生成与参考相同的输出。我们还将发布测试集以及用于计算该指标的脚本和单元测试。

下面的示例显示了TransCoder如何将示例代码从Python转换为C++。我们使用以上的代码作为模型输入:

TransCoder成功将Python输入函数SumOfKsubArray转换为C++。它还可以推断参数的类型,返回类型和函数的参数。该模型将Python dequeue()容器附加到C++实现dequeue <>。下面是该模型在C++中的输出:

最新研究并在实际应用中提供的帮助

自动代码翻译有可能使在公司或开源项目中工作的程序员更加高效,因为他们可以更轻松地集成公司内其他团队或其他开源项目的各种代码,还可以大大减少更新用早期语言编写的代码库的工作量和成本。

反编译的进步可能会促使公司和其他机构更新到最新的语言并促进未来的创新,这可能让使用服务的人们以及机构本身受益。编程语言机器翻译的进步也可以帮助那些没有时间学习多种语言编程的人。

更广泛地说,人工智能有潜力帮助其他编程任务。例如,Facebook AI以前共享了神经代码搜索,这是一种在查询代码中使用自然语言的方法。以及Getafix,该工具可学习自动为编码错误提供建议修复。虽然TransCoder并非旨在帮助调试或提高代码质量,但它可以帮助工程师迁移旧代码库或使用以其他语言编写的外部代码。

为了促进使用深度学习进行代码翻译的研究,本文还发布了一个测试集,该测试集使其他研究人员可以使用计算精度而不是语义盲模型来评估代码翻译模型。我们期待看到其他人如何在我们与TransCoder的合作基础上继续前进,并为新的翻译任务推进自我监督学习。

推荐阅读

  • 98年“后浪”科学家,首次挑战图片翻转不变性假设,一作拿下CVPR最佳论文提名

  • 残差网络的前世今生与原理 | 赠书

  • 适合 Python 入门的 8 款强大工具

  • 芯片破壁:摩尔定律的一次次“惊险”续命

  • 观点 | ETH 2.0 经济模型分析报告简述

Python, C++和Java代码互翻,Facebook开发首个自监督神经编译器相关推荐

  1. 执行引擎的工作过程、Java代码编译和执行的过程、解释器、JIT编译器

    执行引擎概述 执行引擎是Java虛拟机核心的组成部分之一. "虚拟机"是-一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接 ...

  2. cmake release和debug代码运行效果不一样_这35个小细节,让你的Java 代码运行效率翻倍!...

    传智播客博学谷 加小谷vx:boxueguu 免费领IT各学科资料.课程 Get更多干货直播课 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码 ...

  3. java开发高端说法_关于Java代码的设计和开发注意事项,下列哪些说法符合《集合开发规约》:...

    案例分析一:假定CPU的主频是500MHz.硬盘采用DMA方式进行数据传送,其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过. 如果CPU在DMA初始化设置和启 ...

  4. 混合索引java代码,Elasticsearch 实现拼音,中文,首字母混合搜索

    在实际搜索需求中,常常需要对中文做拼音搜索,首字母搜索或者中文拼音首字母混合搜索. 比如要对 "广发聚财信用" 这几个中文进行拼音搜索,我们可能的搜索关键字是:"广发&q ...

  5. python web前端 java ui学哪个好_学IT选Java还是Python?就业发展有何区别?

    学IT选Java还是Python?就业发展有何区别? 来源:奇酷学院 发表于:2018-09-27 10:14:35 想了解一个语言就业到底好不好,得先明确语言的发展方向. 很多学员在选择专业上遇着难 ...

  6. java代码识别_识别Java中的代码气味

    java代码识别 作为软件开发人员,我们不仅要编写有效的代码,而且还要编写可维护的代码,这是我们的责任. Martin Fowler在他的<重构:改进现有代码的设计>中将代码气味定义为: ...

  7. java代码_【JAVA虚拟机(JVM)精髓】05-Java代码的执行过程

    持续更新JVM相关知识,敬请关注: Java虚拟机精髓专栏​zhuanlan.zhihu.com 这里再简单回顾下Java代码执行的整个过程,首先是前端编译过程,java源文件,通过前端编译器,生成出 ...

  8. 新浪云平台部署Java代码

    新浪云服务平台提供了web服务的开发.运行平台,可以使用该平台部署自己的web应用或者服务器. 新浪云平台网址:http://sae.sina.com.cn/ 1.注册登录 首先注册账号登录管理界面( ...

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

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 还记得美国前一阵要招聘60岁的老程序员吗?都怪编程语言发展太快! 因为新冠疫情的缘故,美国一些地区的失业救济系统不堪重负,而这些系统都是上 ...

最新文章

  1. [示例]NSDictionary-按value排序数组中的字典并输出(描述器)
  2. git clone github_Git下载速度慢的解决方案汇总
  3. 排查访问Linux Server速度较慢的问题
  4. Sencha Architect 2 的使用
  5. android复习第二天------布局
  6. c# 智能升级程序代码(2)
  7. 从源码角度解释 fragment 坑(一)
  8. Cocos2dx---------------- TinyXml 解析 XML
  9. Oracle 删除重复数据
  10. ant design 上传+自定义上传
  11. iozone测试文件系统IO性能
  12. ads滤波器仿真(2)——带通滤波器
  13. matlab 还原内部函数,matlab内部函数
  14. TensorFlow中图(graphs)概念
  15. dataframe类型数据的遍历_pandas中遍历dataframe的每一个元素
  16. thinkpad笔记本电脑更换固态硬盘
  17. 关于反三角函数在0点的高阶导数
  18. RabbitMq 消息中间件介绍初体验
  19. 他们为什么离开微软? 创业热情驱动
  20. UVa 1616 商队抢劫者(Caravan Robbers)

热门文章

  1. python GUI编程( 二 ) (基于PyQt5)
  2. 区域链实践第一步——区域链测试环境搭建
  3. Lucene.net: the main concepts
  4. ピエタ~幸せの青い鳥~相关
  5. 关闭vmware喇叭报警声
  6. 论文:Multi-Objective Modified Grey Wolf Optimizer for Optimal Power Flow-最优潮流
  7. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
  8. 获取checkbox所选中的值
  9. Android 马甲包制作流程
  10. 《Java技术》第三次作业--面向对象——继承、抽象类、接口