在 Firefox 中发布 Rust

TL;DR:从 Firefox 48 开始,Mozilla 将发布其第一个生产环境 Rust 代码,并且还会有更多代码发布!

Mozilla ❤ Rust

很难相信 Mozilla 研究院开始赞助 Rust 开发已经近七年了,当时它还只是一个雄心勃勃的研究实验,拥有一小群但非常忠实的社区。 令人惊讶的是,尽管 Rust 的历史悠久,充满了发明和发现,但它的核心原则始终如一。 Rust 核心团队的最初愿景——一个安全的 C++ 替代方案,可以让系统程序员更高效,让关键任务软件不易受到内存漏洞的影响,让并行算法更易处理——一直是 Mozilla 支持 Rust 项目并最终在生产环境中使用 Rust 的核心所在。

同样令人鼓舞的发展是,Rust 的安全性以及现代功能吸引了更多人加入系统编程。 对于 Mozilla 而言,以社区为基础的开发从字面上来说是 我们的使命,扩大我们的圈子至关重要。

因此,我很高兴地宣布一个重要的里程碑:从 Firefox 48 开始,Mozilla 将向所有桌面平台发布我们第一个 Rust 组件,并且很快将支持 Android。

将 Rust 集成到 Mozilla 的媒体堆栈中

Mozilla 最早使用 Rust 的团队之一是媒体播放团队。 现在,我们很容易看出媒体是现代 Web 体验的核心。 对于那些没有安全意识的人来说,可能不太明显的是,每次浏览器播放看似无害的视频(比如,一个 变色龙吹泡泡),它都会读取以复杂格式提供的数据,这些数据由你不知道也不信任的人创建。 事实证明,媒体格式以其能够欺骗解码器,进而暴露 恶意的安全漏洞而闻名,这些漏洞会利用 Web 浏览器实现代码中的内存管理错误。

这使得像 Rust 这样的 内存安全编程语言成为 Mozilla 工具箱中的一个引人注目的补充,可以防御 Web 上可能存在的恶意媒体内容。 因此,Ralph Giles 和 Matthew Gregan 构建了 Mozilla 的 第一个 Rust 媒体解析器。 我很高兴地宣布,他们的代码将成为 Firefox 中发布的第一个 Rust 组件。 对于 Rust 社区来说,这也是一项真正的成就:Rust 代码发布到数亿 Firefox 用户。 我们的初步测量结果表明,Rust 组件运行良好,并与它所替换的原始 C++ 组件提供了相同的结果——但现在是用内存安全的编程语言实现的。

Telemetry data for Firefox's first Rust component
Firefox 遥测数据显示,新的 Rust 代码在超过十亿次使用中没有出现任何问题。

更多内容即将推出!

许多人应得巨大的感谢,因为他们让我们走到今天。 Ralph Giles 和 Matthew Gregan 实现了该组件,Nathan Froyd、Nick Nethercote、Ted Mielczarek、Gregory Szorc 和 Alex Crichton 在将 Rust 集成到 Firefox 构建和工具系统以及确保它能够在我们所有平台上发布方面发挥了关键作用。

Rust 本身是来自一个充满活力且庞大的社区的产物。 没有全球 Rustaceans 的 问题设计代码以及 更多贡献,这些工作是不可能完成的。 作为 Rustacean 本人,我鼓励你尝试使用 Rust。 现在是 开始使用的好时机,并且越来越多地,参与 Mozilla 使用 Rust 的项目

看到 Rust 代码在 Mozilla 的生产环境中发布,感觉像是漫长旅程的结束。 但这仅仅是 Mozilla 的第一步。 请关注我们!

关于 Dave Herman

Dave Herman 是 Mozilla 研究院的首席研究员和战略总监。

Dave Herman 的更多文章…


24 条评论

  1. Felix Schwarz

    这意味着 Rust 现在是构建 Firefox 的强制要求吗? 我只是问问,因为一些发行版(例如 Fedora)的仓库中还没有 Rust 编译器,所以他们可能需要再提醒一下。

    2016 年 7 月 12 日,下午 07:43

    1. Nick Anstee

      来自 rust-lang 的 Rust 发行版二进制文件(至少是通过下载页面上提到的脚本安装的)支持安装到你的主目录(并将它添加到路径中),所以这应该不是什么大问题。

      2016 年 7 月 12 日,下午 12:07

      1. Felix Schwarz

        我的重点不是我自己构建 Firefox,而是发行版提供的 Firefox。 Fedora(以及至少 Debian)不会使用任何预构建的二进制文件(例如预编译的 rustc)来构建 Firefox。 唯一的例外可能是 rustc 包的初始编译。

        但是我认为,对于 Linux 发行版来说,Rust 代码现在还不是强制性的,这样他们就不必急于在发行版中加入 Rust(尽管我当然欢迎发行版包中加入 Rust,并且我 *非常* 感谢 Mozilla 对 Rust 的工作/资金支持)。

        2016 年 7 月 13 日,下午 00:26

    2. Lars Bergstrom

      还没有! 请查看 https://bugzilla.mozilla.org/show_bug.cgi?id=1284816,了解何时会正式生效。

      我们从 Rust 方面积极讨论将 Rust 编译器加入所有主要的 Linux 发行版。 这里肯定有一些复杂性,但 Rust 社区正在努力在 Firefox 要求默认构建 Rust 之前完成这项工作。

      2016 年 7 月 12 日,下午 12:31

    3. mark

      实际上,gcc 应该像对 C++ 一样,原生支持 Rust。 这样我们实际上就不会有任何真正的问题。

      2016 年 7 月 12 日,下午 14:45

      1. Stephanie

        目前还不太容易。 Rust 的固有安全特性来自编译时检查,这需要一个非常特殊的编译器。

        2016 年 7 月 13 日,下午 11:22

    4. Gregory Szorc

      构建 Firefox 要求使用 Rust,这在 https://bugzilla.mozilla.org/show_bug.cgi?id=1284816 中有跟踪记录。

      2016 年 7 月 12 日,下午 16:54

    5. Daniel

      我认为 rustup 允许你设置 Rust 编译器,速度几乎和发行版包一样快。

      2016 年 7 月 12 日,下午 16:58

      1. Emil

        问题是发行版还没有将其加入工具链中。 你不能合理地将一个不能从包管理器中自动安装的构建依赖项包含进来。

        因此,如果 Firefox 在仓库支持 Rust 之前就要求使用 Rust,那么这意味着它们将在 Fx 版本方面落后,直到它们打包好 Rust 为止。

        2016 年 7 月 13 日,下午 00:18

  2. Russell Irvin Johnston

    恭喜——这是一个伟大的进步,实际上——很可能是一个载入史册的进步。

    不需要反复调试的代码绝对值得付出更多努力——实际上是付出很多努力——但我相信我们都很好奇。

    与之前的代码(相比较)而言,匹配速度(的难度)有多大?(而不是获得一个功能健全、有效的模块。)获得最后 10% 的速度有多难?

    与 C++ 相比,开发速度是快还是慢,一般来说,经验(以及可能更好的工具)能够缩短这些时间吗?(毫无疑问,第一次需要额外的注意和检查。)

    2016 年 7 月 12 日,下午 10:41

    1. Lars Bergstrom

      感谢您的赞赏!

      这个特定组件的速度并不在关键路径上,并且 Rust 能够立即匹配 C 代码的性能,据我们从自动化测试中得知,至少目前如此。 也就是说,我们当然已经看到,在 Servo 中,我们的 Rust 代码需要额外的工作(例如,向编译器提供内联提示),才能获得类似提示的 C++ 代码的性能。

      开发时间与以前差不多,但对于新的 Rust 开发人员来说,肯定有一些额外的学习时间。 几乎每个人最初都会对“借用检查器” (https://doc.rust-lang.net.cn/book/references-and-borrowing.html) 感到头疼,这是 Rust 类型系统及其静态保证的关键部分,但这似乎在以后缺乏调试使用后释放或越界内存访问方面得到了回报!

      这里还有一个意料之外的额外工作是调试线程创建。 在 Rust 中,安全地生成线程并在其中执行任务非常容易。 但是,Firefox 有时会运行在内存非常少的旧机器上,我们不得不编写额外的代码来处理甚至没有足够的内存来生成线程的情况! 这是一个在为生产系统编写 Rust 代码时遇到的一个有趣挑战,我们在其他项目中还没有遇到过(但可能以后会遇到)。

      2016 年 7 月 12 日,下午 12:36

      1. Rohit

        您能更详细地解释一下您是如何解决内存不足导致无法创建线程的问题吗?或者,您是否可以写一篇博文并将链接贴在这里?

        2016 年 7 月 13 日 凌晨 3:29

        1. Jack Moffitt

          此崩溃已在此处解决:https://bugzilla.mozilla.org/show_bug.cgi?id=1266309#c17

          解决方案是使用可出错的线程构建器 API,该 API 会返回错误而不是崩溃。

          2016 年 7 月 15 日 上午 8:09

  3. Gabriela

    太棒了!这将适用于所有平台吗?

    2016 年 7 月 12 日 下午 3:49

    1. Lars Bergstrom

      您可以在这里查看每个平台的发布日期(以及其他 Rust 功能):
      https://wiki.mozilla.org/Oxidation

      2016 年 7 月 12 日 下午 5:12

      1. Gabriela

        好的,谢谢!

        2016 年 7 月 14 日 下午 8:18

  4. RustyKrab

    哦,太好了!Firefox… 你可能会

    Rust

    碎片中!
    (以一种好的方式)
    _我会自己离开的。_

    2016 年 7 月 12 日 下午 7:10

    1. Walid Damouny

      我咯咯地笑 :D

      2016 年 7 月 13 日 下午 1:49

  5. Igor Tupi

    请考虑在此阶段将 Firefox 集成到 KDE Plasma 环境中。我们只想要合适的保存对话框。

    2016 年 7 月 12 日 下午 7:33

  6. Foxy Rustacean

    再见 Safari!我刚将书签导入到 Firefox 中……

    2016 年 7 月 13 日 上午 9:17

  7. Xidorn Quan

    但现在数据显示大约 5% 的失败率 :/

    2016 年 7 月 14 日 上午 7:35

    1. Jack Moffitt

      显示的图表是 Firefox 47,它在 Mac 和 Linux 上启用了部分 Rust 代码。存在一个低内存崩溃 (https://bugzilla.mozilla.org/show_bug.cgi?id=1266309#c17),该崩溃已在 48 版中修复,这可能是当前遥测数据不完整的原因。

      或者您是指其他错误吗?

      2016 年 7 月 15 日 上午 8:12

  8. Gabriela

    考虑到我不是技术人员,我可以帮助测试 Windows 上的这些构建吗?我使用所有 Firefox 通道。如果是这样,请告诉我!谢谢!

    2016 年 7 月 30 日 上午 10:47

  9. Lonami

    哦,太酷了,感谢所有合作的人!:D

    2016 年 8 月 5 日 上午 10:47

本文的评论已关闭。