Rust 是一种用于构建可靠、高效的系统编程语言。它的目标是让更多人可以接触到系统编程,并提高资深系统黑客的追求。
自从 Rust 1.0 发布以来,已经过去两年了。Rust,两周年快乐!
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 个团队(文档、风格、基础设施和不安全指南特别小组);
- 团队新增了 24 人,有 6 人从团队退休;
- Rust 团队中有 3 个宝宝出生;
- 兑现了 2 年的 稳定性承诺。
今年,Rust 社区平均每周合并 1 个 RFC 并发布 83 个新 crate。在 StackOverflow 调查中,Rust 连续第二年位居“最受欢迎的语言”榜首。今年还新推出了 thanks.rust-lang.org,你可以在该网站按版本浏览贡献者。
Rust 在生产环境中的应用
除了新增的 48 位 Rust 之友外,我们现在还有一个 Rust 工作网站!越来越多的公司选择 Rust 来解决性能、扩展和安全方面的问题。让我们来看看其中的一些公司。
Dropbox 在多个高影响力项目中使用 Rust 来管理后端大量数据,在这些项目中,正确性和效率至关重要。Rust 代码目前也在 Windows 桌面客户端中运行,部署在数亿台机器上。Jamie Turner 最近在 旧金山 Rust Meetup 上详细介绍了 Rust 如何帮助 Dropbox 使用更少的 RAM,并以更少的 CPU 获得更高的吞吐量。
Mozilla 是 Rust 的主要赞助商,它加快了在生产环境中使用 Rust 的步伐。不仅 Servo 开始发布每日构建版本,Firefox 48 也标志着第一个将 Rust 代码作为 Oxidation 项目一部分的 Firefox 版本。Project Quantum 于 2016 年 10 月宣布,旨在逐步将 Servo 中经过验证的部分应用到 Firefox 的渲染引擎 Gecko 中。请查看这个刚刚开始的博客系列,详细了解 Project Quantum。
Linux 的自由开源桌面环境 GNOME,从 2016 年 10 月在 librsvg 中试验 Rust,到 3 月份举办 黑客马拉松,致力于 GNOME 和 Rust 之间的互操作性,以便可以用 Rust 编写更多的 GNOME 组件。黑客马拉松的参与者取得了良好的进展,请务必查看黑客马拉松页面底部的报告,了解所有详细信息。我们都对 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 的聚会。你会是第四次会议的组织者还是第 104 次聚会的发起者吗?请联系社区团队寻求帮助和支持!
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,该问题会定期更新以反映当前状态,以及需要帮助的地方。
2 月份关于“beta”支持的文章表明,在发布模式下使用增量编译重新编译通常会快五倍!此图显示了在更改 regex crate 的各个部分并在发布模式下重新构建时,编译时间的改进
在每日构建的 Rust 上使用 CARGO_INCREMENTAL=1 cargo <command>
来试用增量编译!
感谢 Niko Matsakis 对增量编译的总结!
我们还对进行完整编译所需的时间进行了一些改进。在过去一年中,平均编译时间缩短了 5-10%,但某些最坏情况下的行为得到了修复,从而使某些程序的编译时间缩短了 >95%。今年晚些时候,一些非常有希望的改进即将到来;请查看 perf.rust-lang.org 以监控 Rust 的每日性能。
Rust 应该提供基本但可靠的 IDE 体验
作为我们 IDE 计划的一部分,我们创建了 Rust 语言服务器 项目。它的目标是创建一个单一工具,使任何编辑器或 IDE 都能利用 Rust 编译器的全部功能进行错误检查、代码导航和重构,方法是使用由 Microsoft 和 Eclipse 创建的标准 语言服务器协议。
虽然 RLS 仍处于早期阶段,但现在 nightly 版本的用户可以通过 rustup 获取。它提供悬停时的类型信息、输入时的错误消息以及不同类型的代码导航。它甚至提供重构和格式化作为不稳定的功能!它适用于像 Cargo 这样的大型项目。我们很高兴看到 RLS 继续发展,并希望看到它在今年晚些时候进入稳定的 Rust 版本。
感谢 Jonathan Turner 对 RLS 的总结!
Rust 应该为基本任务提供 1.0 级别的 crate,并且 Rust 应该提供对高质量 crate 的轻松访问
最近的 关于 Libz Blitz 的帖子详细介绍了库团队为提高常见任务 crate 的质量而采取的行动;那篇文章非常棒,所以我不会在这里重复。我只想指出,库团队将要创建的许多问题将是很好的入门问题。为了使 blitz 达到最佳效果,库团队需要社区的帮助 —— 这意味着你!:) 他们愿意指导有兴趣做出贡献的人。
为了更容易找到用于特定用途的优秀 crate,crates.io 现在提供了 类别,供 crate 作者更好地说明其 crate 的用例。Crate 现在也可以有 CI 徽章,并且 crates.io 界面的更多改进即将到来,这将有助于您选择适合您需求的 crate。
Rust 应该能够很好地编写健壮、高规模的服务器
去年 Rust 生态系统中的重大事件之一是引入了零成本的 futures 库,以及一个在其之上进行异步 I/O 的框架 Tokio。这些库对于高效地进行高规模、高可靠性的服务器编程非常有帮助。Futures 已在 C++、Scala 以及当然的 JavaScript (以 promise 的形式出现)中成功使用,我们在 Rust 中也获得了类似的收益。但是,Rust 库采用了一种新的实现方法,使 futures *无需分配*。而 Tokio 构建在此基础上,提供了一个启用 futures 的事件循环,以及大量用于快速实现新协议的工具。在 TechEmpower 服务器基准测试中,使用 Tokio 的一个简单的 HTTP 服务器是测量中最快的之一。
说到协议,Rust 的完整 HTTP 故事正在巩固,Hyper 的主分支目前提供完整的 Tokio 支持(官方版本即将发布)。HTTP/2 的工作正在顺利进行中。Web 框架生态系统也在不断发展。例如,Rocket 今年发布:它是一个将脚本框架的人体工程学和灵活性与 Rust 的性能和可靠性相结合的框架。连同 Diesel ORM 等支持库,这个生态系统正在展示 Rust 如何在不牺牲任何性能或可靠性的情况下提供流畅、符合人体工程学的开发人员体验。
在今年余下的时间里,我们期望上述所有库都将显著成熟;中间件生态系统将涌现;支持的协议和服务选择将增加;并且,很可能,使用与 Rust 的 futures 本地协作的 async
/await
表示法将所有这些联系在一起。
感谢 Aaron Turon 对服务器端总结!
Rust 应该可以轻松集成到大型构建系统中
Cargo,Rust 的本机包管理器和构建系统,经常被认为是人们最喜欢的 Rust 功能之一。但是,世界上的构建系统有很多,当您想将 Rust 生态系统的一部分引入拥有自己现有构建系统的大型组织时,平滑集成至关重要。
该计划主要处于概念阶段;我们已经与利益相关者做了大量工作,以了解当今构建系统集成中的挑战,并且我们认为我们对如何解决它们有一个很好的总体愿景。跟踪问题上有很多精彩的讨论,这导致了一些 Cargo 问题,例如这些
还有很多细节有待完善;请密切关注该领域即将出现的更多改进。
Rust 社区应该在各个层面提供指导
路线图项目的“各个层面”部分对我们很重要:这既包括引导首次贡献者,也包括在核心团队层面(像我一样,大家好!)添加人员。
对于刚开始使用 Rust 的人,我们在 RustFest Berlin 和 Rust Belt Rust 之前举办了 RustBridge 活动。在波特兰举行的 RustConf 前一天,计划了另一个活动!
Mozilla Rust 的工作人员将在今年夏天让 Outreachy 和 GSoC 实习生参与各种项目。
当需要完成低承诺、高影响的任务时,我们也成功地让贡献者参与进来。其中一项工作是 改进错误消息的格式 —— 请查看 该问题上的 82 名参与者!前面部分提到的 Libz Blitz 特别设置为指导机会的另一个来源。
1 月,语言团队引入了 shepherds,这部分是为了指导围绕语言团队的一群人。shepherds 在推动 RFC 讨论向前发展方面非常有帮助!
我们还在努力增加子团队的数量和规模,为人们创造更多机会担任领导角色。
我们还以不太正式的方式帮助人们参与各种计划。我曾与许多处于 Rust 旅程中不同阶段的人合作:帮助举办会议,进行他们的第一次会议演讲,提供有关该书的反馈,开发 crate,为 Rust 本身做出贡献,并加入团队!虽然很难量化诸如此类的场景,但我无论走到哪里,都看到 Rustaceans 在帮助其他 Rustaceans,我很感激这是我们文化的一部分。
Rust 的未来
在两岁时,Rust 正在进入编程的各个角落,从 Web 开发到嵌入式系统,甚至到您的桌面。库和基础设施正在成熟,我们正在铺平道路,并且我们正在互相支持。我对 Rust 的发展方向持乐观态度!
Rust,生日快乐!祝您未来更加美好!🎉