Rust语言在Ubuntu的未来发展中将扮演重要角色。作为一种能让程序员更好地控制资源使用和性能、同时消除多类内存安全问题的编程语言,Rust在构建安全敏感型软件时尤为适合。

然而,将目前支撑Linux操作系统运行的大量遗留C代码进行现代化改造,始终是一项艰巨的挑战。

Canonical工程副总裁Jon Seager在本周三发布的一篇博客文章中写道:"长期以来,重写代码既耗资巨大又风险极高,且往往难以带来显而易见的改进。成熟的代码库中积累了多年的错误修复、兼容性决策、运维经验以及来之不易的性能优化成果。如果我们希望更多系统软件能够从内存安全中获益,就需要找到更好的方法来降低迁移的成本与风险。"

为此,Canonical联合英国研究与创新署共同资助了一个为期三年的博士研究项目,旨在打造一个能够将数十万行C代码自动转换为Rust代码的平台。该项目由王萌教授主持,Seager与Cristina David博士担任博士生Alex Wood的共同导师。

Seager指出,这项工作并非看起来那么简单。"传统的源到源转换工具虽然能够处理大量代码,但往往过于忠实地保留了C语言的代码结构。转换结果虽然能以Rust编译通过,却仍大量依赖不安全操作,保留了不自然的C语言习惯用法,且需要大量人工处理,才能接近Rust开发者愿意维护的代码风格。"

另一方面,大语言模型虽然能生成"地道、符合语言规范的Rust代码",但在处理"代码仓库级别的上下文"时表现不佳。Seager还补充道:"更重要的是,看起来合理的输出结果并不能证明翻译后的程序与源代码行为一致。"

因此,该项目将融合机器学习与传统程序分析两种技术来构建这一系统。

系统拟采用四个核心组件:调度模块,负责将代码仓库拆分为包含足够上下文的代码块,使转换机制能够理解类型、依赖关系和代码行为;转换模块,基于已知C到Rust转换样本库训练的模型进行代码翻译;验证模块,用于检查转换后的代码是否与C源代码行为一致;以及调试与修复模块,负责分析并修正存在的问题。

Seager写道:"在这一架构中,大语言模型只是系统的一个组成部分。生成的代码应被视为不可信内容,直到有证据证明其保留了所需的行为特性为止。"

项目将以Ubuntu的两个安全组件AppArmor和snap-confine作为案例研究对象。Seager特别说明:"这并不意味着我们承诺用生成的代码替换AppArmor或snap-confine,而是因为我们对这些软件有切身利益,也非常期待看到研究成果。"

在谈及项目的"最乐观预期"时,Seager表示,希望最终能够构建出一个系统,"能够将大型C代码仓库转换为Rust代码,同时具备充分的行为等价性证据,且所需的人工干预相对较少。这项研究还有望产出更优的代码仓库分解方法、更强大的验证技术、可复用的转换数据集、更完善的程序修复工具,以及对自动化迁移可靠性边界更为精确的认识。"

Q&A

Q1:Canonical和布里斯托大学联合开展的C语言到Rust转换项目具体要做什么?

A:该项目旨在打造一个自动化平台,将数十万行C代码转换为Rust代码。系统融合了机器学习与传统程序分析技术,包含调度、转换、验证、调试与修复四个核心模块。项目由王萌教授主持,为期三年,由Canonical与英国研究与创新署共同资助。

Q2:为什么不直接用大语言模型来做C转Rust的代码转换?

A:大语言模型虽然能生成地道的Rust代码,但在处理完整代码仓库级别的上下文时能力不足,且其输出结果无法保证与源代码行为完全一致。因此该项目选择将大语言模型与传统程序分析方法结合使用,并通过验证模块确保转换后代码的行为等价性。

Q3:AppArmor和snap-confine在这个项目中扮演什么角色?

A:AppArmor和snap-confine是Ubuntu的两个安全组件,将作为该研究项目的案例研究对象。Canonical强调,这并不代表承诺用转换后的代码替换这两个组件,而是因为Canonical对这些软件有切身利益,希望借此验证研究成果的实际效果。

InfoWorld