2017 年 Rust 的发展契合一个总体主题:提高生产力,特别是对于 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 in Action》正在 Manning 的早期访问计划中,预计出版日期为 2019 年初。
- RustBridge 课程
- RustBridge 工作坊专注于让代表性不足的人群进入 Rust。Ashley Williams 今年大幅改进了工作坊课程,我们计划在 2018 年初进行教师培训。只要活动专注于代表性不足的人群,该课程可供任何人使用,但只有专注于代表性不足的人群的活动才能被称为 RustBridge。在指导目标下查看更多关于 2017 年 RustBridge 的信息!
- 语言改进
- 人体工程学倡议看到大量 RFC 解决了整个语言中的粗糙边缘;然后,实现期几乎实现了所有这些 RFC。这些改进涵盖了所有权(更灵活的生命周期,更流畅的模式匹配,更简洁的省略),模块系统(修改路径以提高清晰度,允许嵌套导入),trait 系统(
impl Trait
,trait 别名)等等。您可以在跟踪问题上获得所有这些更改及其当前状态的概述。总而言之,这些更改应消除或减轻自 Rust 1.0 以来出现的许多最常见的可学习性和人体工程学风险。
- 人体工程学倡议看到大量 RFC 解决了整个语言中的粗糙边缘;然后,实现期几乎实现了所有这些 RFC。这些改进涵盖了所有权(更灵活的生命周期,更流畅的模式匹配,更简洁的省略),模块系统(修改路径以提高清晰度,允许嵌套导入),trait 系统(
Rust 应该有一个愉快的编辑-编译-调试周期
cargo check
工作流程- Cargo 现在提供了一个
check
子命令,当您致力于使代码通过编译器的检查时,可以使用该子命令来加快编辑-编译周期。特别是,此模式会跳过为依赖树中的 crate 生成可执行工件,而是仅执行足够的工作来执行当前 crate 的类型检查。
- Cargo 现在提供了一个
- 增量重新编译
- 我们改进编译时间的方法的基石是增量重新编译,它允许重建重用先前编译中的重要工作。在过去的一年中,我们投入了大量工作来使其成为现实,现在我们很高兴地宣布,增量编译将开始在列车上运行,下一个 beta 版本的编译器将在 1 月推出,并在 2 月的 Rust 1.24 中在稳定通道上提供!
- 您可以在下面的一些关键基准中看到增量重新编译在实践中的表现。请注意,
-opt
指的是优化构建,“最佳情况”指的是没有更改的重新编译,而println
指的是有少量更改的重新编译,例如向函数主体添加println
调用。我们预计,当我们更深入地通过编译器推动增量重新编译时,我们现在看到的 50+% 的加速将在明年继续增长。 - 结合编译器中的更改,我们还将更新 Cargo,以便在选择的用例中默认使用增量重新编译,因此您可以利用改进的编译时间,而无需额外的配置。当然,您也可以根据具体情况选择加入和退出该功能。
Rust 应该提供一个稳健但基本的 IDE 体验
- Rust 现在在 IntelliJ 和通过 Rust 语言服务器 (RLS) 获得了可靠的 IDE 支持。无论您喜欢功能齐全的 IDE 还是具有 IDE 功能的更轻量级的编辑器,您都可以通过利用出色的 Rust 集成来提高生产力。
- IntelliJ。Rust 在 JetBrains 的 IDE(IntelliJ IDEA、CLion、WebStorm 等)中获得官方支持,其中包括:
- 查找整个项目、其依赖项和标准库中的类型、函数和 trait。
- 当前文件中定义的符号的层次结构概述。
- 搜索给定 trait 的所有实现。
- 转到光标处符号的定义。
- 导航到父模块。
- 重构和代码生成
- RLS。RLS 是一个独立于编辑器的关于 Rust 程序的智能来源。它用于支持许多编辑器中的 Rust 支持,包括Visual Studio Code,Visual Studio和Atom,更多编辑器正在开发中。它计划在 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 的轻松访问
- 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 年初完成。
- 异步生态系统
- 生成器
- Web 框架
Rust 应该为基本任务提供 1.0 级别的 crate
- Libz Blitz。库团队今年启动了 Libz Blitz,这是一项重大举措,旨在审查和改进大量基础 crate 并将其推向 1.0 版本。这是一项大规模的社区活动:我们每两周进行一次众包的“crate 评估”,根据一套明确的指导方针全面审查 crate,评估问题跟踪器,并找出任何剩余的设计问题。虽然并非所有经过评估的 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 指南,它整合了官方库团队的 API 指导,该指导以标准库和 Libz Blitz 流程为基础。
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 周期而言,您可以在新闻简报中看到详细的贡献列表:
但当然,这一年中也有各种各样的贡献。
在这篇文章中,我想特别点名那些帮助协调我们 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 年我们可以继续扩大我们的领导团队,并一起完成更多工作。