Rust 1.0 之路

2014 年 9 月 15 日 · Niko Matsakis

Rust 1.0 即将到来!我们已经确定了一个具体的功能列表,并且正在努力实现它们。我们计划在年底左右发布 1.0 Beta 版。如果一切顺利,这将在 Beta 阶段之后成为 1.0 正式版。在 1.0 发布后,未来的 1.x 版本将向后兼容,这意味着现有代码将继续无需修改即可编译(当然,编译器错误除外)。

当然,Rust 1.0 发布不仅仅意味着“你的代码将继续编译”。基本上,这意味着我们认为 Rust 的设计最终感觉是对的。更具体地说,它感觉是最小化的。该语言本身现在专注于一个简单的核心概念,我们称之为所有权和借用(稍后详细介绍)。利用所有权和借用,我们已经能够在库中构建我们所需的一切。这非常令人兴奋,因为我们可以编写的任何库,你也可以编写。这确实让我们有信心,Rust 不仅会实现其最初的目标,而且还会超越,并被用于我们甚至没有设想过的各种事物。

Rust 1.0 之路

Rust 经历了一个漫长的演变过程。如果你有一段时间没有关注 Rust,你可能会对你所看到的内容感到惊讶:在过去的一年中,我们一直在从根本上简化设计。一个突出的例子是,Rust 曾经具有多种指针类型,由各种符号表示:这些都已消失,只剩下引用类型(&T&mut T)。我们还能够整合和简化许多其他语言功能,例如闭包,这些功能曾经有多种选择。(其中一些更改仍在进行中。)

所有这些更改的关键在于关注所有权和借用的核心概念。最初,我们引入所有权作为在任务之间安全有效地传输数据的一种手段,但随着时间的推移,我们意识到相同的机制使我们能够将各种事物从语言中移出并放入库中。由此产生的设计不仅更易于学习,而且比我们以前认为的更“接近底层”。所有 Rust 语言构造都与机器操作有非常直接的映射,并且 Rust 没有必需的运行时或外部依赖项。当以其自身最少的配置使用时,甚至可以用 Rust 编写操作系统系统内核

尽管经历了这些更改,Rust 始终忠于其目标,即提供现代编程语言的安全性便捷性,同时仍然提供 C 和 C++ 提供的效率底层控制。基本上,如果你想亲自接触底层机器,但又不想花费数小时来追踪段错误和数据竞争,那么 Rust 就是你的语言。

如果你还不熟悉 Rust,请不要担心。在接下来的几个月中,我们计划定期发布一系列博客文章,探讨该语言。前几篇将重点介绍所有权的不同方面以及如何使用它来实现安全的内存手动管理、并发等等。之后,我们将转向 Rust 语言和生态系统的其他方面。

还剩下什么要做

我们已经取得了很大的进展,但在发布之前仍有很多工作要做。以下是我们目前正在进行的大型更改列表

  • 动态大小类型: 类型系统的这个扩展使我们能够统一处理在编译时大小未知(例如数组类型)的类型。这使我们能够支持包含数组或对象的用户设计的智能指针。Nicholas Cameron 最近提交了一个英雄般的提交,实现了大部分工作。
  • 非盒装闭包: 我们新的 闭包设计 统一了闭包和对象类型。大部分规范已经实现。
  • 关联类型: 我们正在将我们的 trait 系统移动到使用关联类型,这确实有助于减少编写高级泛型库所需的泛型注释级别。Patrick Walton 完成了初步实现。
  • Where 子句: 我们正在添加一种称为 where 子句的灵活的新形式约束。Patrick Walton 已经实现了对基本语法的支持,并且我已经在分支上实现了其余功能,该分支应该很快就会着陆。
  • 多重分发 trait: 我们正在扩展 trait,以便它们可以一次匹配多个类型,这为更符合人体工程学的 API 开辟了很多新的机会。我已经在分支上对此工作进行了原型设计。
  • 析构函数: 我们正在改进我们的析构函数语义,使其不需要将内存归零,这应该可以提高编译和执行时间。Felix Klock 已经实现了必要的分析,并且正在将其着陆。
  • 绿色线程: 我们正在从标准库中删除对绿色线程的支持,并将其移到外部包中。这使得 Rust 模型与底层操作系统更紧密地匹配,从而使程序更高效。Aaron Turon 已经 编写了 RFC,现在正在开始这项工作。

在库级别,我们目前正在对 libstd 进行全面扫描,以确定哪些部分是稳定的,哪些部分是不稳定的。你可以在这里监控进度。(但请注意,许多“不稳定”的项目只是名称会稍作更改以符合约定或其他小调整的内容。)

Cargo 和库生态系统

我早些时候写道,Rust 1.0 与其说是一个终点,不如说是一个起点。这是非常正确的。Rust 1.0 的目标是成为构建高效库的灵活基础——但如果没人能找到它们或者难以安装,那么库就没有任何好处。

进入 Cargo,Rust 包管理器。Cargo 最近一直在快速开发,并且已经非常实用。到 1.0 发布时,我们还计划启动并运行一个中央存储库,这意味着创建和分发 Rust 库(我们称之为“crates”)将很简单。哦,当然,Cargo 及其相关的服务器都是用 Rust 编写的。

发布过程

Rust 发布长期以来一直遵循火车时刻表,我们不打算更改这一点。但是,一旦我们开始发布稳定版本,我们还将建立更多的基础设施。我们的计划是采用许多其他项目(例如 FirefoxChromeEmber.js)使用的“通道”系统。

这个想法是有三个通道:Nightly、Beta 和 Stable。Nightly 通道是如果你想要最新和最棒的东西时使用的:它包括不稳定的功能和库,这些功能和库仍然可能以不向后兼容的方式更改。每六周,我们会创建一个新的分支,并将其称为 Beta。此分支排除了所有不稳定的部分,因此你知道,如果你使用 Beta 或 Stable,你的代码将继续编译。同时,现有的 Beta 分支会升级到 Stable 版本。我们希望生产用户更喜欢在 Beta 分支上进行测试,并使用 Stable 分支进行发布。在 Beta 上进行测试可确保如果我们在不经意间破坏了你所依赖的任何内容,我们会提前收到一些通知。

关于 1.0 版本,具体计划是发布 1.0 beta 版,然后按照相同的流程过渡到正式的 1.0 版本。但是,如果我们在 1.0 beta 版中发现严重缺陷,我们可能会推迟并运行一个或两个额外的 beta 阶段。毕竟,与其最终投入到有缺陷的东西,不如多等一会儿。

展望未来

在许多方面,Rust 1.0 与其说是一个终点,不如说是一个起点。当然,我们计划继续开发 Rust:我们有很多想要添加的功能,其中许多功能已经在计划中。但是,对我来说最令人兴奋的工作不是 Rust 团队将要完成的工作。相反,我希望拥有一个稳定的基础将使 Rust 社区和生态系统的增长速度比现在更快。我迫不及待地想看看它会带来什么。