2017 年的 Rust:我们取得的成就

2017 年 12 月 21 日 · Aaron Turon

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

我们做得怎么样?真的,真的很好

一篇帖子无法涵盖所有发生的事情,但我们将在下面介绍一些亮点。

2017 年的目标

Rust 应该有更低的入门门槛

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

  • cargo check 工作流程
    • Cargo 现在提供了一个 check 子命令,当您致力于使代码通过编译器的检查时,可以使用该子命令来加快编辑-编译周期。特别是,此模式会跳过为依赖树中的 crate 生成可执行工件,而是仅执行足够的工作来执行当前 crate 的类型检查。
  • 增量重新编译
    • 我们改进编译时间的方法的基石是增量重新编译,它允许重建重用先前编译中的重要工作。在过去的一年中,我们投入了大量工作来使其成为现实,现在我们很高兴地宣布,增量编译将开始在列车上运行,下一个 beta 版本的编译器将在 1 月推出,并在 2 月的 Rust 1.24 中在稳定通道上提供!
    • 您可以在下面的一些关键基准中看到增量重新编译在实践中的表现。请注意,-opt 指的是优化构建,“最佳情况”指的是没有更改的重新编译,而 println 指的是有少量更改的重新编译,例如向函数主体添加 println 调用。我们预计,当我们更深入地通过编译器推动增量重新编译时,我们现在看到的 50+% 的加速将在明年继续增长。
    • 结合编译器中的更改,我们还将更新 Cargo,以便在选择的用例中默认使用增量重新编译,因此您可以利用改进的编译时间,而无需额外的配置。当然,您也可以根据具体情况选择加入和退出该功能。

Incremental recompilation benchmarks

Rust 应该提供一个稳健但基本的 IDE 体验

  • Rust 现在在 IntelliJ 和通过 Rust 语言服务器 (RLS) 获得了可靠的 IDE 支持。无论您喜欢功能齐全的 IDE 还是具有 IDE 功能的更轻量级的编辑器,您都可以通过利用出色的 Rust 集成来提高生产力。
  • IntelliJ。Rust 在 JetBrains 的 IDE(IntelliJ IDEA、CLion、WebStorm 等)中获得官方支持,其中包括:
    • 查找整个项目、其依赖项和标准库中的类型、函数和 trait。
    • 当前文件中定义的符号的层次结构概述。
    • 搜索给定 trait 的所有实现。
    • 转到光标处符号的定义。
    • 导航到父模块。
    • 重构和代码生成
  • RLSRLS 是一个独立于编辑器的关于 Rust 程序的智能来源。它用于支持许多编辑器中的 Rust 支持,包括Visual Studio CodeVisual StudioAtom,更多编辑器正在开发中。它计划在 2018 年初发布 1.0 版本,但目前以预览形式提供给所有通道(nightly、beta 和 stable)。它支持:
    • 代码补全(使用 Racer)
    • 转到定义(如果编辑器支持,则查看定义)
    • 查找所有引用
    • 查找类型或 trait 的 impl
    • 符号搜索(当前文件和项目)
    • 使用 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,评估问题跟踪器,并找出任何剩余的设计问题。虽然并非所有经过评估的 crate 都已发布 1.0 版本,但它们都非常接近发布。完整列表包括:logenv_loggerrayonmiourlnum_cpussemvermimereqwesttempdirthreadpoolbyteorderbitflagscc-rswalkdirsame-filememmaplazy_staticflate2
  • API 指南。 Libz Blitz 的一个重要副产品是 API 指南,它整合了官方库团队的 API 指导,该指导以标准库和 Libz Blitz 流程为基础。

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

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

2018

我们将在不久的将来启动 2018 年的路线图制定过程;请关注此处!

谢谢!

我们今年完成了惊人的工作量——这里的“我们”包括同样惊人数量的人。由于这项工作已分散到项目的许多方面,因此很难提供贡献者的单个列表。对于 impl 周期而言,您可以在新闻简报中看到详细的贡献列表:

但当然,这一年中也有各种各样的贡献。

在这篇文章中,我想特别点名那些帮助协调我们 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 年我们可以继续扩大我们的领导团队,并一起完成更多工作。