Rust 在 2017 年:我们取得了什么

2017年12月21日 · Aaron Turon

Rust 在 2017 年的发展符合一个核心主题:提高生产力,特别是对于 Rust 新手。从工具、库、文档到核心语言,我们希望让使用 Rust 完成任务变得更容易。这种愿望促成了该年度的一份路线图,其中设定了指导团队工作的 8 个高层目标。

我们做得怎么样?非常非常好

一篇文章无法涵盖发生的一切,但我们将在下方介绍一些亮点。

2017 年的目标

Rust 应该降低学习曲线

Rust 应该拥有愉快的编辑-编译-调试周期

  • cargo check 工作流
    • Cargo 现在提供了一个 check 子命令,可用于在让代码通过编译器检查时加快编辑-编译周期。特别地,此模式跳过为依赖树中的 crate 生成可执行 artifact,而是只执行足以对当前 crate 进行类型检查的工作。
  • 增量编译
    • 我们改进编译时间的方法的基石是增量编译,它允许重建重用先前编译中的重要部分工作。在这一年里,我们为实现这一目标付出了大量努力,现在我们很高兴地宣布,增量编译将于一月份随编译器的下一个测试版本开始随列车发布,并于二月份随 Rust 1.24 在稳定通道上提供!
    • 您可以在下面的一些关键基准测试中看到增量编译的实际表现。请注意,-opt 指的是优化构建,“最佳情况”指的是没有更改的重新编译,而 println 指的是一个小更改的重新编译,例如向函数体添加一个 println 调用。我们预计现在看到的 50% 以上的加速将在明年继续增长,因为我们将增量编译更深入地推送到编译器中。
    • 结合编译器的更改,我们还将更新 Cargo,使其在特定用例中默认使用增量编译,这样您就可以无需额外配置即可利用改进的编译时间。当然,您也可以根据具体情况选择启用或禁用该功能。

Incremental recompilation benchmarks

Rust 应该提供扎实但基本的 IDE 体验

  • Rust 现在在 IntelliJ 和通过 Rust 语言服务器 (RLS) 提供了坚实的 IDE 支持。无论您喜欢功能齐全的 IDE 还是具有 IDE 功能的更轻量级编辑器,您都可以通过利用出色的 Rust 集成来提高工作效率。
  • IntelliJ。Rust 已获得 JetBrains 的 IDEs(IntelliJ IDEA、CLion、WebStorm 等)的官方支持,其中包括
    • 在整个项目、其依赖项和标准库中查找类型、函数和特性。
    • 当前文件中定义符号的层级概览。
    • 搜索给定特性的所有实现。
    • 跳转到光标处符号的定义。
    • 导航到父模块。
    • 重构和代码生成
  • RLSRLS 是一个独立于编辑器的 Rust 程序智能来源。它用于为许多编辑器提供 Rust 支持,包括Visual Studio CodeVisual StudioAtom,更多编辑器正在开发中。它按计划将于 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 的途径

Rust 应该能很好地用于编写健壮的服务器

  • Futures 和 Tokio
    • Rust 在服务器端的大部分故事都围绕其异步 I/O 展开。futures crate 于 2016 年末引入,而 Tokio 项目(为 futures 提供一个专注于网络的事件循环)于 2017 年初发布了其 0.1 版本。从那时起,在构建“Tokio 生态系统”方面进行了大量工作,并对核心原语提出了很多反馈。在年末,Tokio 团队提出了一项重大的 API 改进,以简化和澄清 crate 的 API,并且正在编写一本专门介绍 Rust 中异步编程的书籍。预计最新一轮工作将在 2018 年初完成。
  • 异步生态系统
  • 生成器
    • 多亏了社区的英勇努力,Rust 在 2017 年也实现了实验性的生成器支持!该支持为 async/await 语法提供了必要的基础,该语法目前在 nightly 版本上可用。预计该领域的进一步工作将是 2018 年初的高优先级事项。
  • Web 框架
    • 最后,像Rocket(同步)和Gotham(异步)这样的复杂 Web 框架今年继续发展,并利用 Rust 的表达能力提供一种健壮而富有生产力的编程风格。

Rust 应该拥有用于基本任务的 1.0 级别 crate

  • Libz Blitz。库团队今年发起了Libz Blitz,这是一项重大努力,旨在审查和改进大量基础 crate,并推动它们达到 1.0 发布。这是一项大规模的社区努力:我们每两周进行一次众包的“crate 评估”,根据一套明确的指南全面审查一个 crate,评估其 issue 跟踪器,并找出任何剩余的设计问题。虽然并非所有评估的 crate 都已发布 1.0 版本,但它们都非常接近。完整列表包括:logenv_loggerrayonmiourlnum_cpussemvermimereqwesttempdirthreadpoolbyteorderbitflagscc-rswalkdirsame-filememmaplazy_staticflate2
  • API 指南。Libz Blitz 的一个巨大副产品是API 指南一书,它整合了标准库和 Libz Blitz 过程指导下的官方库团队 API 指南。

Rust 社区应该在各个层面提供指导

  • 我们在 2017 年举办了 5 场RustBridge 研讨会,地点分别在乌克兰基辅、墨西哥墨西哥城、美国俄勒冈州波特兰、瑞士苏黎世和美国俄亥俄州哥伦布!RustBridge 研讨会旨在帮助代表性不足的人群开始学习 Rust。参与者可以了解语法和概念,做一些 exercism 练习,并构建一个提供紧急赞美和螃蟹图片的 Web 应用程序。我们希望在 2018 年扩展此计划,帮助更多人举办更多研讨会!
  • 扩大 Rust 影响计划将拥有其他领域技能(例如教学)和不同经验的人带入 Rust,以便我们在社区缺乏这些技能和经验的领域进行改进。参与者提供了巨大帮助,许多人计划继续在 Rust 社区中提供帮助。我们很高兴他们来了!以下是关于该经历的一些博客文章
  • 最后但同样重要的是,我们还启动了首次 Rust impl Period。这是一项雄心勃勃的努力,旨在同时帮助大量新人为 Rust 生态系统做出贡献,并完成大量工作。为此,我们创建了 40 多个工作组,每个工作组都有自己的重点领域、领导者和聊天频道。这些小组为想要贡献的人找出了良好的“切入点”,并帮助指导他们完成所需的更改。这项活动取得了巨大成功,对 Rust 的各个领域都带来了更改和贡献,从编译器内部结构到文档再到整个生态系统。对于参与其中的各位,非常感谢你们——请继续贡献!对于没有机会参与的人,不用担心:我们希望将此活动打造成一项常规传统。

2018

我们很快将启动 2018 年路线图制定流程;敬请关注!

感谢!

我们今年完成了惊人的工作量——这里的“我们”也包括了同样惊人数量的人员。由于工作分布在项目的许多方面,很难提供一份完整的贡献者列表。特别是在 impl period 期间,您可以在新闻通讯中查看详细的贡献者列表

当然,在这一年中还有各种各样的贡献。

在这篇文章中,我想特别表彰那些帮助策划我们 2017 年工作的领导者导师。这种类型的领导力——致力于赋能他人——是一项艰辛且未得到充分认可的工作。所以,让我们向这些人致敬!

  • Cargo
    • carols10cents,全年持续在 crates.io 上的领导和指导工作。
  • 社区
  • 编译器
    • nikomatsakis,为令人难以置信的大量领导、组织和指导工作,以及特别是在 NLL 方面的高价值开发。
    • arielb1,同样为指导开发工作,涵盖 NLL 和编译器的其他部分。
    • michaelwoerister,为持续推动增量编译交付,并全年为其他人提供参与机会。
    • eddyb,为继续担任通用编译器大师,并今年处理了围绕 const generics 的一些真正艰巨的任务。
  • 开发工具
    • nrc,为总体监督开发工具组,并为稳步推进 RLS 和 rustfmt 的发布,尽管面临许多棘手的基建问题。
    • matklad,为IntelliJ Rust 上的杰出工作。
    • xanewok,为使 RLS 成为现实所付出的巨大努力
    • fitzgen,愉快地组织了围绕 bindgen 的庞大贡献者群体。
  • 文档
    • steveklabnik,为启动和监督 rustdoc 的令人兴奋的重大改进。
    • quietmisdreavus,为监督文档领域的众多活动,特别是今年帮助社区显著改进 rustdoc。
  • 基础设施
    • mark-simulacrum,为使 perf 网站达到高度有用的状态,并为改造 rustbuild 以更好地支持贡献。
    • aidanhs,为协调 crater 的维护。
  • 语言
    • withoutboats,为让我们专注于程序员体验,并帮助社区围绕非常棘手的语言设计问题进行讨论。
    • cramertj,为让我们专注于交付,特别是围绕一些最难达成共识的主题建立共识:impl Trait 和模块系统更改。
    • nikomatsakis,为使NLL RFC 如此易于理解,并开创性地使用独立仓库以允许更多人参与。
    • brson,为构想并主要监督 Libz Blitz 倡议。
    • kodraus,为优雅地接管 Libz Blitz 并将其成功完成。
    • dtolnay,为承担 API 指南工作并使其达到连贯和完善的状态。
    • budziq,为协调和编辑 cookbook 贡献的大量工作。
    • dhardy,为领导一项英勇的努力来改进 rand crate。

技术领导者是我们成功的关键要素,我希望在 2018 年我们能继续壮大我们的领导者队伍,并一起完成更多工作。