Rust 1.0 正在路上!我们已经确定了一系列具体的功能清单,并正在努力实现它们。我们计划在年底左右发布 1.0 测试版(beta)。如果一切顺利,该测试版将在测试期结束后成为 1.0 正式版。1.0 发布后,未来的 1.x 版本将向下兼容,这意味着现有代码将无需修改即可继续编译(当然,编译器bug除外)。
当然,Rust 1.0 的发布不仅仅意味着“你的代码将继续编译”。基本上,这意味着我们认为 Rust 的设计终于感觉对了。更具体地说,它感觉*极简*。语言本身现在专注于一个简单的核心概念,我们称之为所有权(ownership)和借用(borrowing)(稍后详细介绍)。通过利用所有权和借用,我们得以在库中构建出我们所需的一切。这非常令人兴奋,因为我们能写的任何库,你也能写。这确实让我们有信心,Rust 不仅能实现其最初的目标,还能超越它们,用于我们甚至尚未设想的各种事物。
通往 Rust 1.0 之路
Rust 经历了漫长的演变。如果你有一段时间没有关注 Rust,你可能会对其现状感到惊讶:过去一年里,我们一直在彻底简化设计。一个突出的例子是,Rust 曾经有多种指针类型,用各种符号表示:这些都已移除,只剩下引用类型(&T, &mut T)。我们还能够整合和简化许多其他语言特性,例如曾经提供各种选项的闭包。(其中一些更改仍在进行中。)
所有这些变化的关键在于专注于*所有权和借用*的核心概念。最初,我们引入所有权是作为在任务之间安全高效地传输数据的一种手段,但随着时间的推移,我们意识到同样的机制使我们能够将各种事物从语言本身移至库中。由此产生的设计不仅更易于学习,而且比我们以前认为的任何时候都更“贴近底层硬件”。所有 Rust 语言结构都与机器操作有非常直接的映射,Rust 没有必需的运行时或外部依赖。在它最精简的配置中使用时,甚至可以用 Rust 编写操作系统内核。
尽管经历了这些变化,Rust 始终坚守其目标,即在提供现代编程语言的安全性和便利性的同时,仍能提供 C 和 C++ 所具备的效率和底层控制。基本上,如果你想亲自动手处理底层硬件,但又不想花费数小时追踪段错误(segfaults)和数据竞争(data races),那么 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 库(我们称之为“crate”)将变得简单。哦,当然,Cargo 及其相关服务器都是用 Rust 编写的。
发布流程
Rust 的发布长期以来一直遵循火车时刻表模式,我们不打算改变这一点。然而,一旦我们开始进行稳定发布,我们也会构建更多基础设施。我们的计划是采用许多其他项目(例如Firefox、Chrome和Ember.js)使用的“通道”系统。
其想法是存在三个通道:Nightly(每夜版)、Beta(测试版)和 Stable(稳定版)。如果你想要最新最好的东西,就使用 Nightly 通道:它包含不稳定特性和可能仍会发生向后不兼容变化的库。每六周,我们会创建一个新分支并称之为 Beta。这个分支排除了所有不稳定的部分,因此如果你使用 Beta 或 Stable,你的代码将继续编译。同时,现有的 Beta 分支被提升为 Stable 版本。我们预计生产用户会倾向于在 Beta 分道进行测试,并使用 Stable 分支发布。在 Beta 上测试确保我们在不小心破坏你依赖的任何东西时,能提前得到通知。
关于具体的 1.0 发布,计划是发布 1.0 测试版,然后遵循相同的流程过渡到官方的 1.0 正式版。然而,如果在 1.0 测试版中发现严重缺陷,我们可能会推迟并额外进行一到两个测试期。毕竟,宁可多等一段时间,也比最终承诺一个有缺陷的版本要好。
展望未来
在许多方面,Rust 1.0 与其说是终点,不如说是起点。自然地,我们计划继续开发 Rust:我们有很多想要添加的功能,其中许多已经排在计划中。但对我来说最令人兴奋的工作不是 Rust 团队将要完成的工作。相反,我期待拥有一个稳定的基础将使 Rust 社区和生态系统比现在发展得更快。我迫不及待地想看看会从中涌现出什么。