Rust 在 2017 年的发展符合一个核心主题:提高生产力,特别是对于 Rust 新手。从工具、库、文档到核心语言,我们希望让使用 Rust 完成任务变得更容易。这种愿望促成了该年度的一份路线图,其中设定了指导团队工作的 8 个高层目标。
我们做得怎么样?非常非常好。
一篇文章无法涵盖发生的一切,但我们将在下方介绍一些亮点。
2017 年的目标
Rust 应该降低学习曲线
- 书籍
- 《Rust 编程语言》的大部分内容已进入最终编辑阶段。Steve 和 Carol 感谢所有阅读草稿并提供反馈的人!可在 No Starch Press 预订印刷版,计划于 2018 年 5 月发行。
- Jim Blandy 和 Jason Orendorff 撰写的《Programming Rust》已于 2017 年 12 月 21 日发行印刷版!
- Tim McNamara 撰写的《Rust 实战》正在 Manning 的早期访问计划中,预计出版日期为 2019 年初。
- RustBridge 课程
- RustBridge 研讨会专注于帮助代表性不足的人群进入 Rust 领域。Ashley Williams 今年极大地改进了研讨会课程,我们计划在 2018 年初进行一次教师培训。该课程对任何人开放使用,但仅当活动面向代表性不足的人群时,才能命名为 RustBridge。有关 2017 年 RustBridge 的更多信息,请参阅指导目标下的内容!
- 语言改进
- 人体工程学倡议带来了大量解决语言中棘手问题的 RFC;随后的Impl Period则实现了几乎所有这些 RFC。这些改进涵盖所有权(更灵活的生命周期、更顺畅的模式匹配、更简洁的省略)、模块系统(改进路径以提高清晰度、允许嵌套导入)、特性系统(
impl Trait
、特性别名)等等。您可以在跟踪 issue 上查看所有这些更改及其当前状态的概述。总而言之,这些更改应该消除或减轻自 Rust 1.0 以来出现的大多数常见的学习性和人体工程学障碍。
- 人体工程学倡议带来了大量解决语言中棘手问题的 RFC;随后的Impl Period则实现了几乎所有这些 RFC。这些改进涵盖所有权(更灵活的生命周期、更顺畅的模式匹配、更简洁的省略)、模块系统(改进路径以提高清晰度、允许嵌套导入)、特性系统(
Rust 应该拥有愉快的编辑-编译-调试周期
cargo check
工作流- Cargo 现在提供了一个
check
子命令,可用于在让代码通过编译器检查时加快编辑-编译周期。特别地,此模式跳过为依赖树中的 crate 生成可执行 artifact,而是只执行足以对当前 crate 进行类型检查的工作。
- Cargo 现在提供了一个
- 增量编译
- 我们改进编译时间的方法的基石是增量编译,它允许重建重用先前编译中的重要部分工作。在这一年里,我们为实现这一目标付出了大量努力,现在我们很高兴地宣布,增量编译将于一月份随编译器的下一个测试版本开始随列车发布,并于二月份随 Rust 1.24 在稳定通道上提供!
- 您可以在下面的一些关键基准测试中看到增量编译的实际表现。请注意,
-opt
指的是优化构建,“最佳情况”指的是没有更改的重新编译,而println
指的是一个小更改的重新编译,例如向函数体添加一个println
调用。我们预计现在看到的 50% 以上的加速将在明年继续增长,因为我们将增量编译更深入地推送到编译器中。 - 结合编译器的更改,我们还将更新 Cargo,使其在特定用例中默认使用增量编译,这样您就可以无需额外配置即可利用改进的编译时间。当然,您也可以根据具体情况选择启用或禁用该功能。
Rust 应该提供扎实但基本的 IDE 体验
- Rust 现在在 IntelliJ 和通过 Rust 语言服务器 (RLS) 提供了坚实的 IDE 支持。无论您喜欢功能齐全的 IDE 还是具有 IDE 功能的更轻量级编辑器,您都可以通过利用出色的 Rust 集成来提高工作效率。
- IntelliJ。Rust 已获得 JetBrains 的 IDEs(IntelliJ IDEA、CLion、WebStorm 等)的官方支持,其中包括
- 在整个项目、其依赖项和标准库中查找类型、函数和特性。
- 当前文件中定义符号的层级概览。
- 搜索给定特性的所有实现。
- 跳转到光标处符号的定义。
- 导航到父模块。
- 重构和代码生成
- RLS。RLS 是一个独立于编辑器的 Rust 程序智能来源。它用于为许多编辑器提供 Rust 支持,包括Visual Studio Code、Visual Studio 和Atom,更多编辑器正在开发中。它按计划将于 2018 年初发布 1.0 版本,但目前已在所有通道(nightly、beta 和 stable)上提供预览版。它支持
- 代码补全(使用 Racer)
- 跳转到定义(如果编辑器支持则可预览定义)
- 查找所有引用
- 查找类型或特性的实现
- 符号搜索(当前文件和项目)
- 使用 rustfmt 重新格式化,重命名
- 应用错误建议(例如,添加缺失的导入)
- 悬停时显示文档和类型
- 使用代码片段生成代码
- Cargo 任务
- RLS 的安装和更新(通过 rustup)
Rust 应该轻松集成到大型构建系统中
- 替代注册表。 Cargo 现在对从 crates.io 以外的注册表安装 crate 提供不稳定支持。这将使公司能够像使用开源 crate 一样轻松地管理和使用内部 crate。目前正在开发比 crates.io 服务器更适合私有用途的 crate 服务器。
- Cargo 作为组件。今年投入了大量工作来收集希望将 Rust crate 集成到大型现有构建系统(如Bazel)中的利益相关者的限制条件。Cargo 团队制定了一个愿景,将 Cargo 视为一套可以定制或替换的组件,使外部构建系统能够轻松管理其构建任务,同时仍与 crates.io 和 Cargo 工作流集成。虽然我们在实现这一愿景方面未能达到预期,但目前正在进行的“构建计划生成”工作已达到足够程度,可以支持 Firefox 构建系统和Tup。这个初步成果应该能为 2018 年初的进一步迭代提供一个良好的草案。
Rust 应该提供便捷访问高质量 crate 的途径
- Crates.io 今年增加了类别,旨在提供一个 crate 组织结构,以便于提供适用于特定目的的 crate。
- 我们就类别和关键字中 crate 的最佳排序方式进行了热烈的 RFC 讨论,其中包括一项关于人们如何评估 crate 的调查。
- 讨论最终决定按近 90 天的下载量对 crate 进行排序,并显示更多信息供人们评估时使用。
- crate 作者现在可以在 crates.io 上显示的一些额外信息包括 CI 状态徽章、维护状态、代码覆盖率、GitHub 统计数据。
- 最重要的是,crates.io 现在在 crate 页面上显示 crate 的 README!鼓励 crate 作者利用此功能提供入门文档以及使用该 crate 的小示例,因为良好的文档和示例是人们评估 crate 时最常提及的积极信号之一。
Rust 应该能很好地用于编写健壮的服务器
- Futures 和 Tokio
- Rust 在服务器端的大部分故事都围绕其异步 I/O 展开。futures crate 于 2016 年末引入,而 Tokio 项目(为 futures 提供一个专注于网络的事件循环)于 2017 年初发布了其 0.1 版本。从那时起,在构建“Tokio 生态系统”方面进行了大量工作,并对核心原语提出了很多反馈。在年末,Tokio 团队提出了一项重大的 API 改进,以简化和澄清 crate 的 API,并且正在编写一本专门介绍 Rust 中异步编程的书籍。预计最新一轮工作将在 2018 年初完成。
- 异步生态系统
- Tokio 周围的生态系统取得了巨大的增长,包括对curl、openssl、inotify、unix signals、cap’n proto、sendfile、postgres、couchbase 等的支持。此外,Rust 还提供了适用于 HTTP1 和 HTTP2 的异步服务器库。
- 生成器
- Web 框架
Rust 应该拥有用于基本任务的 1.0 级别 crate
- Libz Blitz。库团队今年发起了Libz Blitz,这是一项重大努力,旨在审查和改进大量基础 crate,并推动它们达到 1.0 发布。这是一项大规模的社区努力:我们每两周进行一次众包的“crate 评估”,根据一套明确的指南全面审查一个 crate,评估其 issue 跟踪器,并找出任何剩余的设计问题。虽然并非所有评估的 crate 都已发布 1.0 版本,但它们都非常接近。完整列表包括:log、env_logger、rayon、mio、url、num_cpus、semver、mime、reqwest、tempdir、threadpool、byteorder、bitflags、cc-rs、walkdir、same-file、memmap、lazy_static、flate2。
- API 指南。Libz Blitz 的一个巨大副产品是API 指南一书,它整合了标准库和 Libz Blitz 过程指导下的官方库团队 API 指南。
Rust 社区应该在各个层面提供指导
- 我们在 2017 年举办了 5 场RustBridge 研讨会,地点分别在乌克兰基辅、墨西哥墨西哥城、美国俄勒冈州波特兰、瑞士苏黎世和美国俄亥俄州哥伦布!RustBridge 研讨会旨在帮助代表性不足的人群开始学习 Rust。参与者可以了解语法和概念,做一些 exercism 练习,并构建一个提供紧急赞美和螃蟹图片的 Web 应用程序。我们希望在 2018 年扩展此计划,帮助更多人举办更多研讨会!
- 扩大 Rust 影响计划将拥有其他领域技能(例如教学)和不同经验的人带入 Rust,以便我们在社区缺乏这些技能和经验的领域进行改进。参与者提供了巨大帮助,许多人计划继续在 Rust 社区中提供帮助。我们很高兴他们来了!以下是关于该经历的一些博客文章
- Anna Liao:扩大 Rust 影响:将 Python 应用程序移植到 Rust
- Ryan Blecher:扩大 Rust 影响:后记 我们从该计划的第一轮中学到了很多,并计划在 2018 年进行另一轮!
- 最后但同样重要的是,我们还启动了首次 Rust
impl Period
。这是一项雄心勃勃的努力,旨在同时帮助大量新人为 Rust 生态系统做出贡献,并完成大量工作。为此,我们创建了 40 多个工作组,每个工作组都有自己的重点领域、领导者和聊天频道。这些小组为想要贡献的人找出了良好的“切入点”,并帮助指导他们完成所需的更改。这项活动取得了巨大成功,对 Rust 的各个领域都带来了更改和贡献,从编译器内部结构到文档再到整个生态系统。对于参与其中的各位,非常感谢你们——请继续贡献!对于没有机会参与的人,不用担心:我们希望将此活动打造成一项常规传统。
2018
我们很快将启动 2018 年路线图制定流程;敬请关注!
感谢!
我们今年完成了惊人的工作量——这里的“我们”也包括了同样惊人数量的人员。由于工作分布在项目的许多方面,很难提供一份完整的贡献者列表。特别是在 impl period 期间,您可以在新闻通讯中查看详细的贡献者列表
当然,在这一年中还有各种各样的贡献。
在这篇文章中,我想特别表彰那些帮助策划我们 2017 年工作的领导者和导师。这种类型的领导力——致力于赋能他人——是一项艰辛且未得到充分认可的工作。所以,让我们向这些人致敬!
- Cargo
- carols10cents,全年持续在 crates.io 上的领导和指导工作。
- 社区
- carols10cents,运行扩大 Rust 影响计划。
- ashleygwilliams,为改进RustBridge 课程以及推动计划向前发展。
- jonathandturner,为监督2017 年 Rust 社区调查。
- 编译器
- nikomatsakis,为令人难以置信的大量领导、组织和指导工作,以及特别是在 NLL 方面的高价值开发。
- arielb1,同样为指导和开发工作,涵盖 NLL 和编译器的其他部分。
- michaelwoerister,为持续推动增量编译交付,并全年为其他人提供参与机会。
- eddyb,为继续担任通用编译器大师,并今年处理了围绕 const generics 的一些真正艰巨的任务。
- 开发工具
- 文档
- steveklabnik,为启动和监督 rustdoc 的令人兴奋的重大改进。
- quietmisdreavus,为监督文档领域的众多活动,特别是今年帮助社区显著改进 rustdoc。
- 基础设施
- mark-simulacrum,为使 perf 网站达到高度有用的状态,并为改造 rustbuild 以更好地支持贡献。
- aidanhs,为协调 crater 的维护。
- 语言
- withoutboats,为让我们专注于程序员体验,并帮助社区围绕非常棘手的语言设计问题进行讨论。
- cramertj,为让我们专注于交付,特别是围绕一些最难达成共识的主题建立共识:impl Trait 和模块系统更改。
- nikomatsakis,为使NLL RFC 如此易于理解,并开创性地使用独立仓库以允许更多人参与。
- 库
技术领导者是我们成功的关键要素,我希望在 2018 年我们能继续壮大我们的领导者队伍,并一起完成更多工作。