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

FacebookAI用深度学习实现编程语言转换,代码库迁移不再难!

时间:2023-03-13 19:21:06 科技观察

从COBOL等遗留编程语言到Java或C++等现代语言的代码库迁移是一项艰巨的任务,需要源语言和目标语言方面的专业知识。例如,COBOL至今仍在世界各地的大型机系统中广泛使用,因此公司、政府和其他组织通常必须选择是手动翻译其代码库,还是致力于维护以1950年代的语言编写的代码。FacebookAI开发了Transcoder,使代码迁移更简单、更高效。FacebookAI的方法是一种人工智能系统,能够将代码从一种编程语言翻译成另一种编程语言,而不需要数据来训练它。FacebookAI已经证明TransCoder可以成功完成C++、Java和Python之间的语言翻译。TransCoder优于开源、基于商业规则的翻译程序。在FacebookAI的评估中,该模型将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利用无监督机器翻译成编程语言的最新进展克服了这些挑战。FacebookAI特别注意构建一个seq2seq模型,该模型由具有Transformer架构的编码器和解码器组成。TransCoder使用单一共享模型,部分基于FacebookAI之前在XLM上的工作,适用于所有编程语言。FacebookAI遵循无监督机器翻译的三个原则:初始化、语言建模和回译。此图显示了TransCoder如何利用无监督机器翻译的三个原则。FacebookAI首先使用来自开源GitHub项目的源代码,使用MLM目标对FacebookAI的模型进行了预训练。正如在自然语言处理的上下文中一样,这种预训练创建了跨语言嵌入:来自相似上下文中使用的不同编程语言的关键字在嵌入空间中非常接近(例如catch和except)。这些嵌入的跨语言性质源于多种语言中存在的大量通用标记。标记的示例包括C++、Java和Python通用的关键字(例如,for、while、if、try),以及出现在源代码中的数学运算符、数字和英文字符串。使用MLM进行预训练使TransCoder能够生成输入序列的高质量表示。然而,解码器缺乏翻译能力,因为解码器从未接受过基于源表示解码序列的训练。为了解决这个问题,FacebookAI训练模型使用去噪自动编码器(DAE)目标对序列进行编码和解码。DAE的工作方式类似于有监督的机器翻译算法,在该算法中,训练模型以预测给定序列的损坏版本的令牌序列。在测试时,该模型可以对Python序列进行编码并使用C++起始符号对其进行解码以生成C++转换。该视频展示了如何将具有相似功能的关键字组合在一起。仅跨语言模型预训练和自动去噪就足以生成翻译。然而,这些翻译的质量往往很低,因为该模型从未接受过训练,无法在测试时完成它应该做的事情,即将特征从一种语言翻译成另一种语言。为了解决这个问题,FacebookAI使用反向翻译,这是在弱监督下利用单语数据的最有效方法之一。对于每种目标语言,FacebookAI使用一个模型和一个不同的开始标签。它经过训练可以并行地从源到目标以及从目标到源的转换。然后可以以弱监督方式训练该模型,以从嘈杂的源序列重建目标序列并学习源到目标的转换。并行训练目标到源和源到目标版本,直到收敛。为了评估他们的模型,大多数以前的源代码翻译研究都依赖于自然语言中使用的指标,例如BLEU分数或其他基于标记之间相对重叠的方法。然而,这些类型的指标不太适合编程语言。两个语法差异很小的程序在执行代码时可能会获得非常高的BLEU分数,但仍然会产生非常不同的结果。相反,具有不同实现的语义等效程序将具有较低的BLEU分数。另一个指标是参考匹配,或者与实际参考完全匹配的翻译百分比,但这通常会低估翻译质量,因为它无法识别语义上等效的代码。为了更好地衡量TransCoder和其他转码技术的性能,FacebookAI创建了一个称为计算精度的新指标,该指标评估假设函数在给定相同输入时是否产生与参考相同的输出。FacebookAI还将发布一个测试集以及用于计算该指标的脚本和单元测试。下面的示例显示了TransCoder如何将示例代码从Python转换为C++。FacebookAI使用以下代码作为模型输入:TransCoder成功将Python输入函数SumOfKsubArray转换为C++。它还可以推断参数的类型、返回类型和函数的参数。该模型将Pythondequeue()容器附加到C++实现dequeue<>。以下是C++模型的输出:编程语言翻译有益于实际应用来自其他开源项目的各种代码。它还可以大大减少更新用古老语言编写的遗留代码库的工作量和开销。反编译的进步可能会促使公司和其他机构更新到最新的语言并促进未来的创新,这可能会使使用该服务的人以及机构本身受益。编程语言机器翻译的进步也可以帮助那些没有时间或负担不起学习多种语言编程的人。更广泛地说,人工智能有可能帮助完成其他编程任务。例如,FacebookAI之前共享了用于神经代码搜索的工具,这些工具学习自动建议对编码错误的修复。虽然TransCoder并非旨在帮助调试或提高代码质量,但它有可能帮助工程师迁移遗留代码库或使用以其他语言编写的外部代码。为了促进未来使用深度学习进行代码翻译的研究,FacebookAI还发布了一个测试集,允许其他研究人员使用计算准确性而不是语义盲模型来评估代码翻译模型。FacebookAI期待看到其他人在TransCoder的工作基础上进一步发展,并为新的翻译任务推进自我监督学习。