Rust 两年

2017 年 5 月 15 日 · Carol (Nichols || Goulding)

Rust 是一种用于进行自信、高效的系统编程的语言。它旨在让系统编程能够触及更广泛的受众,并提升资深系统黑客的抱负。

距离 Rust 1.0 发布已经两年了。Rust 两岁生日快乐!

Group picture from RustFest Berlin

2016 年 9 月,RustFest 柏林大会上的 Rustaceans。图片由 Fiona Castiñeira 提供。

在这两年中,我们展示了稳定而不停滞,保持了与 1.0 版本的向后兼容性,同时也做了许多改进。巧合的是,Rust 的生日距离 2017 年过半还有一段时间,这使得现在是一个绝佳的时机来回顾过去一年的进展,以及我们 2017 年路线图目标的进展。

阅读本文后,如果您想就我们的表现以及 Rust 接下来的重点方向提供反馈,请填写我们的 2017 年 Rust 现状调查

但首先,让我们看看数据!

Rust 数据一览

自从 Rust 的一周岁生日以来,发生了很多事情:

  • 核心仓库新增了 10,800 次 提交,由 663 位贡献者(其中 438 位是今年新加入的)完成;
  • 合并了 56 个 RFC
  • 发布了 9 个小版本和 2 个补丁版本;
  • 发布了 4,405 个新的 crates
  • 标准库稳定了 284 个功能;
  • rust-lang.org 已被翻译成 10 种语言;
  • 新增了 48 家 在生产环境中使用 Rust 的公司
  • 新增了 4 个团队(文档、代码风格、基础设施和 Unsafe 指南突击团队);
  • 24 次人员加入团队,6 次人员退出团队;
  • Rust 团队成员的 3 个宝宝出生了;
  • 带来了 2 年的稳定性

今年平均每周,Rust 社区会合并 1 个 RFC 并发布 83 个新的 crate。在 StackOverflow 调查中,Rust 连续第二年位居“最受欢迎的语言”榜首。今年还新增了 thanks.rust-lang.org 网站,您可以在其中按版本浏览贡献者。

生产环境中的 Rust

除了新增的 48 家 Rust 朋友,我们现在还有一个 Rust 工作网站!越来越多的公司选择 Rust 来解决涉及性能、扩展性和安全性的问题。让我们来看看其中几家。

Dropbox 在多个高影响力的项目中使用了 Rust,以在后端管理 EB 级别的数据,其中正确性和效率至关重要。Rust 代码目前也已用于 Windows 桌面客户端,运行在数亿台机器上。Jamie Turner 最近在 SF Rust Meetup 上详细介绍了 Rust 如何帮助 Dropbox 使用更少的 RAM 并以更少的 CPU 获得更高的吞吐量。

Mozilla 作为 Rust 的主要赞助商,加快了在生产环境中对 Rust 的使用。不仅 Servo 开始发布每夜构建版本,而且 Firefox 48 也成为了第一个包含 Rust 代码的 Firefox 版本,作为 Oxidation 项目的一部分。于 2016 年 10 月宣布的 Project Quantum,是一项将 Servo 中经过验证的部分逐步融入 Firefox 渲染引擎 Gecko 的努力。请查看这个刚刚开始的博客系列,以详细了解 Project Quantum。

GNOME,一个用于 Linux 的自由开源桌面环境,从 2016 年 10 月在 librsvg 中试用 Rust,到 3 月份举办了一次 hackfest,致力于研究 GNOME 和 Rust 之间的互操作性,以便更多 GNOME 组件可以用 Rust 编写。hackfest 参与者取得了良好的进展,请务必查看 hackfest 页面底部的报告以获取所有细节。我们对 Rust 和 GNOME 携手合作的可能性感到兴奋。

今年,npm 开始在生产环境中使用 Rust 来提供 JavaScript 包服务。Rust 部分消除了他们平台中的性能瓶颈,该平台每天服务约 3.5 亿个包。Ashley Williams 最近在乌克兰的 RustFest 上发表了关于 npm 在生产环境中使用 Rust 的经验的演讲;请查看视频

这只是 Rust 周围积累的成功案例中的一部分。如果您在生产环境中使用 Rust,我们也想听听您的故事

Rust 社区

说到会议,过去一年我们举办了四场 Rust 会议:

  • 2016 年 9 月 9 日至 10 日:RustConf 2016,位于美国俄勒冈州波特兰市;
  • 2016 年 9 月 17 日:RustFest 2016,位于德国柏林;
  • 2016 年 10 月 27 日至 28 日:Rust Belt Rust 2016,位于美国宾夕法尼亚州匹兹堡市;
  • 2017 年 4 月 29 日至 30 日:RustFest 2017,位于乌克兰基辅。

我们还有至少三场会议即将举行!

  • 2017 年 8 月 18 日至 19 日:RustConf 2017,位于美国俄勒冈州波特兰市;
  • 2017 年 9 月:另一场 RustFest,位于瑞士苏黎世;
  • 2017 年 10 月 26 日至 27 日:Rust Belt Rust 2017,位于美国俄亥俄州哥伦布市。

这还不包括全球 103 个 关于 Rust 的 meetup。您会是举办第四场会议或发起第 104 个 meetup 的人吗?联系社区团队以获得帮助和支持!

2017 年的 Rust

2017 年路线图目标对于将社区精力集中到当前 Rust 面临的最紧迫问题上大有裨益。当然,我们希望 Rust 的各个方面都能不断改进,但我们目前还没有拥有无限时间和无限贡献者!

让我们来看看路线图中每个目标的一些倡议。链接的跟踪问题提供了比此处摘要更详细的信息。

Rust 应该降低学习曲线

《Rust 编程语言》第二版距离最初内容完成只差一个章节。不过,为了使这本书在 10 月出版,还有很多编辑工作要做。印刷版目前可在 No Starch 预订,第二版的在线版本已进入beta 阶段,并将作为 Rust 1.18.0 自带文档的一部分。Steve 和我收到的反馈表明,特别是所有权章节有了很大改进,帮助人们更好地理解了所有权相关的概念!

语言人机工程学倡议是降低学习曲线目标的另一部分,它在计划中有许多改进。语言团队热切希望指导(另一个目标!)那些有兴趣通过编写 RFC 并与社区合作细化这些改进如何工作来推动这些人体工程学改进想法向前发展的人。如果您想参与其中,请在跟踪问题上发表评论。

另请查看:

Rust 应该拥有愉快的编辑-编译-调试循环

等待编译器是阻碍 Rust 开发工作流程被描述为“愉快”的最大障碍。到目前为止,幕后已完成大量工作,为未来的改进打下了基础。这些改进正开始显现成果,但请放心,这项倡议远未被视为完成。

改进的主要前提之一是将 MIR(中级中间表示)添加到编译器管道中。今年,MIR 成为了编译过程的默认部分

由于 MIR,我们现在能够着手添加增量编译。每夜构建版本目前为其提供“beta”支持,允许编译器跳过未更改代码的代码生成。我们正在重构编译器,以支持更细粒度的增量计算,从而使我们能够跳过类型检查和其他编译部分。这种重构还应该为 IDE 工作提供更好的支持(见下一节),因为它使编译器能够做诸如独立编译单个函数之类的事情。我们预计在接下来的几个月内看到增量编译的下一阶段可用。如果您有兴趣参与其中,请查看路线图问题 #4,该问题会定期更新,以反映当前状态以及需要帮助的地方。

二月的这篇文章关于“beta”支持显示,在发布模式下进行增量编译,重新编译通常会快五倍!此图显示了在更改 regex crate 的各个部分并在发布模式下重新构建时编译时间的改进。

Graph showing improved time with incremental compilation

在每夜版本的 Rust 上尝试增量编译,使用 CARGO_INCREMENTAL=1 cargo <command>

感谢 Niko Matsakis 提供的这份增量编译总结!

我们在完整编译所需的时间方面也取得了一些进展。平均而言,去年编译时间提高了 5-10%,但一些最差情况下的行为得到了修复,从而使某些程序的编译时间提高了 95% 以上。今年晚些时候还将有非常有前景的改进;请查看 perf.rust-lang.org 以日常监控 Rust 的性能。

Rust 应该提供基础但可靠的 IDE 体验

作为我们的 IDE 倡议的一部分,我们创建了 Rust Language Server 项目。其目标是创建一个单一工具,通过使用 Microsoft 和 Eclipse 创建的标准 语言服务器协议,使任何编辑器或 IDE 都能轻松拥有 Rust 编译器的全部能力,用于错误检查、代码导航和重构。

虽然 RLS 仍处于早期阶段,但今天 可通过 rustup 获取供 nightly 用户使用。它提供悬停时的类型信息、输入时的错误消息以及不同类型的代码导航。它甚至还提供重构和格式化等不稳定功能!它甚至可以用于像 Cargo 这样的大项目。我们很高兴看到 RLS 的持续发展,并希望它能在今年晚些时候进入稳定版 Rust。

感谢 Jonathan Turner 提供的这份 RLS 总结!

Rust 应该为基本任务提供 1.0 级别的 crate,以及 Rust 应该提供方便的高质量 crate 访问

最近关于 Libz Blitz 的文章详细介绍了库团队提高常用任务 crate 质量的倡议;那篇文章写得非常好,我就不在此重复了。我需要指出的是,库团队将要创建的许多问题将是很好的新手问题。为了让这项突击行动达到最佳效果,库团队需要社区的帮助——这意味着就是您!:) 他们愿意指导有兴趣贡献的人。

为了让特定用途的优秀 crate 更容易被找到,crates.io 现在有了分类,方便 crate 作者更好地指示其 crate 的用例。Crate 现在也可以显示 CI 徽章,并且 crates.io 界面的更多改进正在进行中,这将帮助您选择符合您需求的 crate。

Rust 应该为编写健壮、高并发服务器做好准备

过去一年 Rust 生态系统中的一个重要事件是引入了零成本的 futures 库,以及一个基于它进行异步 I/O 的框架 Tokio。这些库对于高效地进行高并发、高可靠性服务器编程来说是一个福音。Futures 在 C++Scala 以及当然还有 JavaScript(以 promises 的形式)中取得了巨大成功,我们在 Rust 中也获得了类似的益处。然而,Rust 库采用了一种新的实现方法,使得 futures 无分配。Tokio 则在此基础上提供了一个支持 futures 的事件循环,以及大量用于快速实现新协议的工具。在 TechEmpower 服务器基准测试中,一个使用 Tokio 的简单 HTTP 服务器是测量到的最快的服务器之一。

说到协议,Rust 完整的 HTTP 支持正在巩固,Hyper 的 master 分支目前已完全支持 Tokio(正式发布在即)。HTTP/2 的工作也在顺利进行中。而且 Web 框架生态系统也在发展壮大。例如,今年推出了 Rocket:这是一个将脚本框架的人体工程学和灵活性与 Rust 的性能和可靠性相结合的框架。再加上像 Diesel ORM 这样的支持库,这个生态系统正在展示 Rust 如何在不牺牲性能或可靠性的前提下提供流畅、符合人体工程学的开发体验。

在今年剩余的时间里,我们期望上述所有库都能显著成熟;中间件生态系统能够涌现;支持的协议和服务类型能够增加;并且,很有可能,通过一个与 Rust 的 futures 原生兼容的 async/await 记法将这一切联系起来。

感谢 Aaron Turon 提供的这份服务器端总结!

Rust 应该轻松集成到大型构建系统中

Cargo,Rust 的原生包管理器和构建系统,经常被认为是人们最喜欢的 Rust 特性之一。但当然,世界运行在多种构建系统上,当您想将一部分 Rust 生态系统引入到一个拥有自己现有构建系统的大型组织时,平滑集成至关重要。

这项倡议主要处于构思阶段;我们与利益相关者进行了大量工作,以了解当前构建系统集成中的挑战,并且我们认为我们对于如何解决这些挑战有一个很好的总体愿景。跟踪问题上有很多精彩的讨论,这导致了几个 Cargo 问题,例如:

还有很多细节有待解决;请密切关注此领域的更多改进。

Rust 社区应提供各级指导

路线图项目中“各级”部分对我们很重要:它关乎新贡献者的入职,也关乎在核心团队层面吸纳人员(比如我,你好呀!)。

对于刚开始接触 Rust 的人,我们在 RustFest 柏林和 Rust Belt Rust 之前举办了 RustBridge 活动。还有一个即将举行,计划在波特兰的 RustConf 前一天!

Mozilla Rust 团队今年夏天将有 OutreachyGSoC 实习生参与各种项目。

当有低承诺、高影响力的任务需要完成时,我们在吸引贡献者方面也取得了成功。其中一项努力是改进错误消息格式——看看这个问题的 82 位参与者!前一节提到的 Libz Blitz 便是专门为提供更多指导机会而设立的。

一月份,语言团队引入了 shepherds(牧羊人),这部分是为了指导语言团队周围的一些人。这些 shepherds 在推动 RFC 讨论向前发展方面非常有帮助!

我们也一直致力于增加和扩大子团队的数量和规模,为人们提供更多担任领导角色的机会。

我们还有一些不太正式的方式来帮助人们参与各种倡议。我在许多人的 Rust 之旅中与他们一起努力过:帮助组织会议、第一次在会议上发表演讲、提供书籍反馈、开发 crate、为 Rust 本身做贡献以及加入团队!虽然很难量化这些场景,但我无论走到哪里,都看到 Rustaceans 在帮助其他 Rustaceans,我很高兴这是我们文化的一部分。

Rust 的未来

两岁的 Rust 正在进入编程的各个角落,从 Web 开发到嵌入式系统,甚至是您的桌面。库和基础设施正在成熟,我们正在铺平入口,并且相互支持。我对 Rust 的发展方向感到乐观!

Rust 生日快乐!祝未来有很多年!🎉