最后更新:2020-06-17 09:53:23 手机定位技术交流文章
机器心脏报告
参与:恶魔
代码转换器是由脸书提出的一种无监督的代码转换方法,可以在C++、Java和Python之间高精度地转换函数。只需要单一语言的源代码,不需要源语言或目标语言的专业知识。看起来不错,但是有些人抱怨:如果有一个bug呢?你想读两种语言吗?(颤抖...

我想使用以前编写的代码库,但是我担心编程语言已经过时,重写它太麻烦了。我该怎么办?源代码到源代码的编译器似乎是一个不错的选择。
跨编译器系统,也称为源到源编译器,可以将用高级编程语言(如C++或Python)编写的源代码转换成另一种语言。这种工具的主要目的是通过将用过时或过时的语言(如COBOL和Python 2)编写的代码库移植到现代语言来提高互操作性。它们通常依赖于手动编写的重写规则,并应用于源代码抽象语法树。
然而,代码转换器有一些缺陷,比如转换结果通常是不可读的,不能遵循目标编程语言的规范,并且需要人类程序员手动修改才能准确运行。整个转换过程不仅耗时,而且需要专家掌握源语言和目标语言的专业知识,因此这种代码转换项目的成本非常高。
在自然语言翻译领域,神经模型的性能远远优于基于规则的模型。然而,由于缺乏并行数据,神经模型在编程语言翻译领域的应用相对有限。那么,自然语言翻译中的神经模型能否在程序语言翻译中得到借鉴?最近,脸谱人工智能研究所做了一些尝试。
脸书研究人员使用无监督的机器翻译方法来训练无监督的神经跨编译器——转码器。代码转换器基于GitHub开源项目中的源代码培训。它可以高精度地实现C++、Java和Python之间的函数转换。
如下图所示,代码转换器将Python代码转换为C++代码:

代码转换器成功地将Python输入函数SumOfKsubArray转换为C++。转码器推导参数、变量类型和函数返回类型,在C++中将Python deque()转换成deque。此外,它还精确地转换了Python的循环和范围函数。
下图显示了C++和Java之间的转换:

Python和其他语言之间也有转换:

该方法具有以下特点:
实现编程语言转换只需要单一语言源代码,不需要任何源语言或目标语言的专业知识;
转码器可以成功地掌握每种语言的特定复杂模式,并将它们移植到其他语言中。
这种完全无监督的方法大大优于使用基于规则的方法和高级编程知识的商业系统。
此外,研究人员还构建并发布了一个包含852个并行函数的测试集和一个单元测试来检查转换结果的准确性。研究人员表示,相关的代码和预培训模型将是开源的。

测试集中并行函数的示例。
无监督编程语言转换工件-代码转换器
转码器使用seq2seq模型,由编码器、解码器和变压器架构组成。研究人员表示,一个模型对于所有的编程语言都足够了。
在训练方面,研究人员跟踪了兰普尔等人。
图1:1使用的无监督机器翻译的三个原则:代码转换器。
原则1:初始化
第一个原则是使用跨语言掩蔽语言模型预训练进行模型初始化。因此,表达相同指令的代码段被映射到相同的表示,而与编程语言无关。
原则2:语言建模
第二个原则使用去噪自动编码(DAE)来训练解码器,使其始终生成有效序列,即使输入数据有噪声。也就是说,编码器对输入噪声的鲁棒性得到了增强。
向后弯曲
第三个原则是重译,即模型生成可用于训练的并行数据。
例如,当Python → C++模型质量好时,使用它为C++ → Python模型生成更准确的数据,反之亦然。
下图显示了培训后获得的跨语言嵌入式表示:

图5:跨语言令牌嵌入空。
转码器有多有效?
研究人员进行了一系列实验来评估转码器的效果。
具体来说,他们使用了一个具有6层和8个关注点的变压器架构,并将模型维度设置为1024。此外,所有编程语言都使用相同的编码器和解码器。
在跨语言语言模型的预训练过程中,研究人员分批交替使用C++、Java和Python,它们由32个源代码序列组成,每个序列包含512个标记。
在训练阶段,研究人员在去噪、自编码和重译之间交替进行,使用大约6000个标记的批量。
至于模型优化,研究人员使用了学习率为10 4的亚当优化器、学习率调度器和瓦瓦尼等人。
表1:使用贪婪解码后测试集上的代码转换器的结果。
下表2显示了使用波束搜索的解码结果,并比较了转码器和现有基线方法的性能。

看来效果很好。
然而,一些程序员抱怨道:
这是调试的地狱。如果出了差错,必须读成两种语言的代码...

参考内容:
https://arxiv.org/abs/2006.03511
本文由 在线网速测试 整理编辑,转载请注明出处。