Facebook 研究人员表示,他们已经开发出了一种名为 TransCoder AI 的“神经编译器” ,该系统可以将代码从一种高级编程语言(如 C ++、Java 和 Python)转换为另一种。
将现有的代码库迁移到更现代或更高效的语言需要大量的资源,包括财务和人力。譬如,澳大利亚联邦银行在 5 年的时间里花费了大约 7.5 亿澳元,将其平台从 COBOL 转换为 Java。而从理论上讲,转编译器可以则帮助消除从头重写代码所需的费用。但是,由于源语言和目标语言都具有不同的语法、变量类型、标准库函数和平台 API,因此这个在实践中其实很难构建。
据介绍,Facebook 的 TransCoder AI 则采用了一种无监督的学习方法来应对这些挑战。它可以在无人监督的情况下不受监督地运行,从而在没有标签的情况下在数据集中找到未检测到的模式,比基于规则数据集的模型要高效得多。
无论使用哪种编程语言,神经编译器都可以将代表相同指令的代码段映射到相同代码段。一位共同作者写道:“ TransCoder 可以轻松地推广到任何编程语言,不需要任何专业知识就可以将代码从一种编程语言转换为另一种编程语言,并且在很大程度上优于商业解决方案。我们的结果表明,通过向解码器添加简单的约束以确保生成的函数在语法上是正确的,或者通过使用专用架构,可以轻松解决该模型所犯的许多错误。”
TransCoder AI 的准确性
Facebook 研究人员在超过 280 万个开源存储库中的公开代码上对 TransCoder AI 进行了训练,以专注于功能级别的代码转换。
为了评估 TransCoder AI 的性能,他们从 GeeksforGeeks 中选择了 852 个 C ++、Java 和 Python 并行函数。GeeksforGeeks 是一个在线平台,用于收集编写代码时的问题,并提供多种编程语言的解决方案。
利用以上两个数据,他们开发了一个名为 “计算精度(computational accuracy)”的新指标,用于检查翻译后的函数在输入相同的情况下是否会产生与源语言相同的输出。
结果
这是 AI 从以下位置转换代码时获得的结果的准确性水平:
- C++ to Java: 74.8%
- C++ to Python: 67.2%
- Java to C++: 91.6%
- Java to Python: 68.7%
- Python to Java: 56.1%
- Python to C++: 57.8%
研究人员表示,TransCoder AI 已经展示出对每种语言(Java、Python 和 C ++)的语法及其数据结构的理解。它甚至能够正确地调整每种语言的库,同时适应小的修改–例如,重命名输入中的一个变量。尽管 Transcoder 并非十分完美,无法在代码生成过程中考虑某些变量类型。 但是,它的性能确实优于已有的利用专家知识手动构建的框架。
完整论文地址:https://arxiv.org/pdf/2006.03511.pd