当前位置: 首页 > 科技观察

用AI实现C++、Java、Python代码的互译!

时间:2023-03-21 10:45:06 科技观察

还记得前阵子美国要招60岁的程序员吗?都是因为编程语言发展太快了!因为新冠疫情,美国部分地区的失业救济系统不堪重负,而这些系统都是用古老的COBOL语言编写的。然而,它已经被C/C++、Java和Python所占据。用Python替换COBOL程序是如此困难。更何况,Python2刚刚被淘汰,将过去的旧程序手动转换为Python3也是一个大工程。AI既然可以翻译自然语言,那么它应该也可以翻译编程语言。Facebook也是这么认为的,所以他们最近提出了TransCoder,一种翻译编程语言的AI,现在可以在C++、Java和Python语言之间进行翻译。程序翻译后,运行成功率可达80.9%。TransCoder是一种无监督学习算法,这意味着它不需要大量的配对标记编程代码数据集来进行训练。如果这项技术达到实用水平,那将是程序员的一大福音!难怪该论文的作者之一GuillaumeLample在推特上宣布该论文后迅速引起了热议。翻译程序语言的原理是什么?TransCoder充分利用了编程语言的特性,例如关键字for、while、if和常见的数学运算符。下图显示了C++、Java和Python关键字的嵌入。在相似上下文中使用的不同编程语言的关键字在嵌入空间中非常接近。例如Python中的except和Java、C++中的catch都是用来捕获异常的,它们映射到非常相似的嵌入空间位置。对于映射(map和dict)的实现、将字符串转换为字符数组(c_str和toCharArray)以及类似的变量类型(例如long、int和Integer),也可以观察到同样的情况。那么上述关键词的embeddings是如何得到的呢?Facebook提出了实现编程语言无监督机器翻译的三个原则。首先,模型通过跨语言掩码语言模型(MLM)预处理进行初始化,这有点类似于自然语言填空题。结果是表达相同指令的代码片段被映射到独立于编程语言的相同表示。第二个是去噪自动编码,它训练解码器即使在输入噪声数据时也始终生成有效序列,从而提高编码器对输入噪声的鲁棒性。最后是反向翻译,它允许模型生成可用于训练的并行数据。每次Python-to-C++模型变得更好时,它都会为C++-to-Python模型生成更准确的数据,反之亦然。通过以上步骤,TransCoder经过训练得到了上述的跨语言嵌入。我们观察到TransCoder成功地理解了每种语言特有的语法、数据结构、函数库和方法。在上图中,唯一的三元运算符X?A:BofJavaandC++isshowed,andwhentranslatedintoPython,itbecomeifXthenAelseB.下面是一个从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++-to-Java代码仅匹配3.1%的GroundTruth。另外,NLP翻译中的BLEU不适合作为代码翻译的衡量标准,因为它只能表示实际代码和参考代码之间的句法差异。因此,需要一个新的度量标准——正确性的计算,它表示翻译后的代码在测试后是否能产生与参考代码相同的输出。以此为标准,C++对Java代码的计算准确率为60.9%,Java对C++的计算准确率为80.9%。Facebook并不是唯一一家开发人工智能代码生成系统的公司。在前不久的MicrosoftBuild大会上,OpenAI展示了一个在GitHub数据上训练的模型,只需要根据注解内容就可以生成相应功能的代码。TransCoder并没有那么智能,但是在计算机技术飞速发展的今天,谁知道下一个流行的语音会是什么。有了TransCoder,至少让我们移植代码更方便了。或许美国社保系统的COBOL就是由它解决的。