代码jar包_代码java下载文件_java代码

代码jar包_代码java下载文件_java代码

译者| 刘畅

来源|AI科技大本营(ID:)

代码库从早期的编程语言(例如 COBOL)迁移到当前的编程语言(例如 Java 或 C++)是一项艰巨的任务,需要源语言和目标语言方面的专业知识。 如今,COBOL 仍在世界各地的大型系统中广泛使用,因此公司、政府和其他组织经常必须选择是手动翻译其代码库,还是尝试维持使用这种可追溯到 20 世纪 50 年代的程序代码。

该公司开发了一种工具,一种完全自我监督的神经编译系统,可以使代码迁移变得更容易、更高效。 我们的方法是第一个能够将代码从一种编程语言翻译成另一种编程语言而无需并行数据进行训练的人工智能系统。 本文证明了在 C++、Java 和 3 之间成功转换函数是可能的。

性能优于开源代码和基于商业规则的翻译程序。 在我们的评估中,该模型正确地将超过 90% 的 Java 函数翻译为 C++,将 74.8% 的 C++ 函数正确翻译为 Java,将 68.7% 的函数从 Java 正确翻译为 Java。 相比之下,商用工具只能正确地将 61.0% 的函数从 C++ 转换为 Java,开源翻译器只能准确地将 38.3% 的 Java 函数转换为 C++。

自我监督培训对于编程语言之间的翻译尤其重要。 传统的监督学习方法依赖于大规模并行数据集进行训练,但对于 COBOL 到 C++ 或 C++ 到 C++,这些数据根本不存在。 仅依赖于仅用一种编程语言编写的源代码,不需要源语言和目标语言具有相同的代码示例。 它不需要编程语言的专业知识,并且该方法可以很容易地推广到其他编程语言。 本文还创建了专门为此领域设计的新评估指标。

对于将遗留代码库更新为现代编程语言非常有用,现代编程语言通常更高效且更易于维护。 它还展示了神经机器翻译技术的新应用领域。 与之前使用神经网络解决高级数学方程的人工智能工作一样,本文认为 NMT 可以帮助完成通常与翻译或模式识别任务无关的其他任务。

专为编程语言构建的序列到序列模型

在自然语言中,神经机器翻译的最先进结果被广泛接受,甚至在越来越依赖自动化机器翻译系统的专业翻译社区中也是如此。 然而,由于代码翻译领域缺乏并行数据,它们在该领域的应用受到限制。 程序员仍然依赖基于规则的代码转换工具,这需要专家审查和调试输出,或手动翻译代码。 通过利用无监督机器翻译到编程语言翻译方面取得的成功,可以克服这些挑战。

本文构建了一个带有注意力机制的-to-()模型,该模型由编码器和具有变换结构的解码器组成。 使用单一共享模型,部分构建于 AI 之前针对所有编程语言的 XLM 工作。 本文遵循了先前人工智能研究中详述的无监督机器翻译的三个原则:初始化、语言建模和反向翻译。

代码jar包_java代码_代码java下载文件

本文首先利用开源项目中的源代码使用掩码语言模型(MLM)来预训练本文的模型。 就像自然语言处理中的上下文一样,这种预训练创建了跨语言嵌入:在相似的上下文中使用来自不同编程语言的关键字在嵌入空间中非常接近(例如 catch 和 )。 这些嵌入的跨语言性质来自于多种语言中存在的大量公共标记(锚点)。 锚点的示例包括C++、Java 和通用关键字(例如,for、while、if、try),以及出现在源代码中的数学运算符、数字和英文字符串。

使用 MLM 进行预训练可以生成输入序列的高质量表示。 然而,由于解码器从未被训练来根据源表示来解码序列,因此解码器缺乏翻译能力。 为了解决这个问题,本文使用去噪自动编码(DAE)训练模型对序列进行编码和解码。 DAE 的工作原理与监督机器翻译算法类似,在该算法中,模型经过训练可以在序列中存在损坏的情况下预测该序列。

作为解码器输入给出的第一个符号是一个特殊的标记,指示输出的编程语言。 在测试时,该模型可以对序列进行编码并使用 C++ 起始符号对其进行解码,以生成 C++ 翻译器。 C++ 翻译的质量将取决于模型的“跨语言”:如果编码器将函数和有效的 C++ 翻译映射到相同的潜在表示,则解码器将成功翻译为 C++。

仅预训练的跨语言模型和自动降噪就足以进行翻译。 然而,这些翻译往往质量较低,因为模型从未接受过关于测试时应该做什么的训练,即将特征从一种语言翻译成另一种语言。 为了解决这个问题,本文使用反向翻译,这是利用弱监督的单语言数据的最有效方法之一。

对于每种目标语言,本文使用一个模型和不同的开始标签。 它经过训练可以并行地从源到目标以及从目标到源的转换。 目标到源版本用于将目标序列翻译成源语言,从而产生与标记目标(GT)序列相对应的噪声源序列。 然后以弱监督的方式训练模型,允许模型从噪声源序列重建目标序列并学习从源到目标的转换。 直到它收敛。

为了评估这个模型,之前大多数关于源代码翻译的研究都依赖于自然语言中使用的指标,例如 BLEU 分数或其他基于标记之间相对重叠的方法。 然而,这些类型的指标不太适合编程语言。 语法差异较小的两个程序在执行代码时可能会获得较高的 BLEU 分数,但会产生截然不同的结果。 相反,具有不同实现的语义等效程序将具有较低的 BLEU 分数。 另一个指标是参考匹配,或者说与 GT 完全匹配的翻译的百分比,但这通常会低估翻译的质量,因为它无法识别语义上等效的代码。

为了更好地衡量其他代码翻译技术的性能,本文创建了一种称为计算精度的新指标,该指标评估假设函数在给定相同输入时是否产生与参考相同的输出。 我们还将发布测试集以及用于计算指标的脚本和单元测试。

下面的示例展示了如何将示例代码从 C++ 转换为 C++。 我们使用上面的代码作为模型输入:

代码java下载文件_代码jar包_java代码

已成功将输入函数转换为 C++。 它还可以推断函数的参数类型、返回类型和参数。 该模型将 () 容器附加到 C++ 实现。 以下是该模型的 C++ 输出:

java代码_代码jar包_代码java下载文件

最新研究和实际应用

自动代码翻译有潜力使在公司或开源项目中工作的程序员变得更加高效,因为他们可以更轻松地集成公司内其他团队或其他开源项目的各种代码,并且还可以大大减少更新编写的代码的需要在早期的语言中。 图书馆的努力和成本。

反编译方面的进步可以促使公司和其他机构更新到最新的语言并促进未来的创新,这可以使使用该服务的人们以及机构本身受益。 编程语言机器翻译的进步也可以帮助那些没有时间学习多种语言编程的人。

更广泛地说,人工智能有潜力帮助完成其他编程任务。 例如,AI之前共享了神经代码搜索,一种在查询代码中使用自然语言的方法。 此外,该工具还会自动提供针对编码错误的修复建议。 虽然无意帮助调试或提高代码质量,但它可以帮助工程师迁移遗留代码库或使用以其他语言编写的外部代码。

为了促进使用深度学习进行代码翻译的研究,本文还发布了一个测试集,使其他研究人员能够使用计算精度而不是语义盲模型来评估代码翻译模型。 我们期待看到其他人如何在我们的工作基础上推进新翻译任务的自我监督学习。

java代码_代码java下载文件_代码jar包

更多精彩推荐
98年“后浪”科学家,首次挑战图片翻转不变性假设,一作拿下 CVPR 最佳论文提名
饿了么四年、阿里两年:研发路上的一些总结与思考
GPT-3 的到来,程序员会被 AI 取代吗?
残差网络的前世今生与原理 | 赠书
推特惊爆史诗级漏洞,App 恶意窃取用户隐私,云端安全路向何方?
干货 | 了解 Geth 客户端:快照加速机制
点分享
点点赞
点在看

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注