互联网资讯 / 人工智能 · 2023年10月29日 0

AI实现编程语言转换,简化代码库迁移

将传统编程语言迁移至现代语言的代码库是一项复杂的任务,要求对源语言和目标语言都有深入的了解。

例如,COBOL至今仍在许多大型机系统中广泛应用,因而公司、政府及其他组织常常面临选择:要么手动翻译其代码库,要么继续维护那些可以追溯到1950年代的旧代码。

FACEbook AI开发的TRanscodeR工具使代码迁移变得更加简便和高效。该系统能够在不依赖数据训练的情况下,将代码从一种编程语言转换为另一种编程语言。

AI实现编程语言转换,简化代码库迁移

FACEbook AI已经展示了TRanscodeR在C++、Java与Python之间成功进行语言转换的能力。其性能超过了许多基于商业规则的开源翻译程序。在FACEbook AI的评估中,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在将遗留代码库更新为现代编程语言时显得极为有用,现代编程语言通常效率更高、维护更便捷。此举还展示了神经机器翻译技术在新领域的应用潜力。

seq2seq模型的关键作用

在自然语言处理领域,即使专业翻译人员越来越依赖自动化翻译系统,神经机器翻译的最新进展也得到了广泛认可。然而,由于缺乏并行数据,代码转换中的应用受到了限制,程序员仍依赖基于规则的代码转换器,这些转换器需要专家审查和调试,或者干脆手动翻译代码。TRanscodeR通过结合无监督机器翻译的最新进展,克服了这些挑战。

FACEbook AI专注于构建一个seq2seq模型,该模型由具有变压器架构的编码器和解码器组成。TRanscodeR使用单一共享模型,部分基于FACEbook AI在XLM上的先前研究,适用于所有编程语言。FACEbook AI遵循无监督机器翻译的三个原则:初始化、语言建模和反向翻译。

AI实现编程语言转换,简化代码库迁移

此图展示了TRanscodeR如何利用无监督机器翻译的三个原则。

FACEbook AI首先利用开源GITHUB项目中的源代码,对其模型进行了MLM目标的预训练。正如在自然语言处理的背景下,这种预训练生成了跨语言的嵌入:来自不同编程语言的关键字在相似上下文中使用时,其在嵌入空间中非常接近。

这些嵌入的跨语言特性源于多种语言中存在的通用令牌示例,包括C++、Java和Python的关键字,以及源代码中常见的数学运算符、数字和英文字符串。

通过MLM进行预训练,使得TRanscodeR能够生成输入序列的高质量表示。然而,解码器缺乏翻译能力,因为它从未经过训练,使用的是基于源表示的序列解码。为了解决这一问题,FACEbook AI使用降噪自动编码(DAE)目标对序列进行编码和解码。

DAE的工作方式类似于监督机器翻译算法,通过训练模型预测给定序列的损坏版本下的令牌序列。在测试阶段,该模型能够对Python序列进行编码,并用C++起始符号解码生成C++转换。

AI实现编程语言转换,简化代码库迁移

视频展示了相似功能的关键字如何组合在一起。

仅通过跨语言模型预训练和自动降噪就足以生成翻译,但这些翻译的质量往往不高,因为模型未曾经过训练以满足实际要求,即将功能从一种语言翻译为另一种语言。

为了解决这个问题,FACEbook AI采用反向翻译,这是一种在弱监督情况下利用单语数据的高效方法。对于每种目标语言,FACEbook AI使用一个模型和一个不同的起始标记,经过训练实现源到目标以及目标到源的并行转换。

模型可以以弱监督的方式训练,从嘈杂的源序列中重建目标序列,学习源到目标的转换。并行训练源到目标版本和目标到源版本,直到模型收敛。

在评估模型时,以前的源代码翻译研究大多依赖自然语言中的评估标准,如BLEU分数或其他基于标记间相对重叠的方法。然而,这些指标不太适合编程语言,因为在执行代码时,语法差异小的两个程序可能会有很高的BLEU分数,但实际上产生的结果却截然不同。相比之下,具有不同实现方式的语义等效程序,BLEU分数则会较低。

另一种评估标准是参考匹配,即与参考相符的翻译百分比,但这通常会低估翻译质量,因为它无法识别语义等效的代码。

为了更好地评估TRanscodeR和其他代码转换技术的性能,FACEbook AI创建了一个名为计算精度的新指标,该指标评估在相同输入下假设函数是否生成与参考一致的输出。FACEbook AI还将发布测试集及用于计算该指标的脚本和单元测试。

AI实现编程语言转换,简化代码库迁移

以下示例展示了TRanscodeR如何将示例代码从Python转换为C++。FACEbook AI使用此代码作为模型输入:

TRanscodeR成功将Python输入函数SuMOfKsubARRay转换为C++。它还能够推断参数类型、返回类型以及函数参数。这是TRanscodeR输出的C++实现:

AI实现编程语言转换,简化代码库迁移

编程语言转换的实际应用价值

自动代码翻译有潜力使程序员在公司或开源项目中更加高效,因为他们可以更轻松地整合其他团队或开源项目的代码。这项技术还可以显著减少更新使用旧语言编写的代码库时的工作量和成本。

随着反编译技术的进步,企业和机构可能会更新到最新语言,促进未来的创新,从而让使用这些服务的人们及机构本身受益。同时,编程语言机器翻译的进步也将帮助那些没有时间或无法负担学习多种编程语言的人。

AI实现编程语言转换,简化代码库迁移

从更广泛的角度来看,人工智能还可以辅助其他编程任务。例如,FACEbook AI之前分享的神经代码搜索工具,能够自动为编码错误提供建议修复。尽管TRanscodeR并非旨在辅助调试或提高代码质量,但它有潜力帮助工程师迁移旧代码库或使用其他语言编写的外部代码。

为了推动关于深度学习代码翻译的未来研究,FACEbook AI还发布了一个测试集,使其他研究人员可以使用计算精度而非语义盲模型评估代码翻译模型。

FACEbook AI期待看到其他人在TRanscodeR的基础上继续前进,并在新的翻译任务中推动自我监督学习的发展。