谷歌宣布将在Chromium项目中使用Rust


Chromium 项目将在未来支持在 Chromium 中使用来自 C++ 的第三方 Rust 库。为此,我们现在正积极寻求将生产 Rust 工具链添加到我们的构建系统中。这将使我们能够在明年内将 Rust 代码包含在 Chrome 二进制文件中。
我们起步缓慢,并且对一旦准备就绪 我们将考虑哪些库设定了明确的期望。

我们将 Rust 引入 Chromium 的目标是提供一种更简单(无 IPC)和更安全(整体 C++ 复杂性较低,沙箱中也没有内存安全错误)的方式来满足两个规则,以加快开发速度(更少的代码编写,更少的设计文档,更少的安全审查)并提高Chrome的安全性(增加没有内存安全错误的代码行数,降低代码的错误密度)。

Rust 是由 Mozilla 开发的,专门用于编写浏览器,因此 Chromium 最终也开始依赖这项技术是非常合适的。感谢 Mozilla 为系统软件行业做出的巨大贡献。Rust 是一个令人难以置信的证据,证明我们应该能够期望一种语言在提供安全性的同时还具有高性能。

我们知道 C++ 和 Rust 可以通过cxxbindgencbindgendiplomat和(实验性的)crubit等工具很好地协同工作。但是也有局限性。我们可以预期这些限制的形式会通过新的或改进的工具及时改变,但这里的决定和描述是基于当前的技术状态。

根据我们的研究,我们为 Chromium 取得了两个成果:

  1. 目前,我们将仅在一个方向上支持互操作,从 C++ 到 Rust。Chromium 是用 C++ 编写的,大部分堆栈帧都是 C++ 代码,从 main() 到 exit(),这就是我们选择这个方向的原因。通过将互操作限制在一个方向上,我们可以控制依赖树的形状。Rust 不能依赖于 C++,因此它无法了解 C++ 类型和函数,除非通过依赖注入。这样,Rust 就不能登陆任意的 C++ 代码,只能登陆从 C++ 通过 API 传递的函数。
  2. 我们暂时只支持第三方库。第三方库是作为独立组件编写的,它们不包含有关 Chromium 实现的隐含知识。这意味着他们拥有更简单且专注于他们的单一任务的 API。或者,换句话说,它们通常具有狭窄的接口,没有复杂的指针图和共享所有权。我们将审查为 C++ 使用而引入的库,以确保它们符合这一期望。