发布 Rust 1.24

2018 年 2 月 15 日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的新版本 1.24.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。

如果您通过 rustup 安装了旧版本的 Rust,那么获取 Rust 1.24.0 就像这样简单:

$ rustup update stable

如果您还没有安装 rustup,可以从我们网站的相应页面获取 rustup,并在 GitHub 上查看 1.24.0 的详细发布说明

1.24.0 stable 版有什么新内容

本次发布包含两个非常令人兴奋的新特性:`rustfmt` 和增量编译!

rustfmt

多年来,我们一直想要一个能够自动将您的 Rust 代码重新格式化为某种“标准风格”的工具。本次发布很高兴地宣布,`rustfmt` 的一个 *预览版* 可以用于 1.24 stable。要尝试它,请这样做:

$ rustup component add rustfmt-preview

这里有两个重要方面:首先,您使用的是 `rustup component add` 而不是 `cargo install`。如果您之前通过 `cargo install` 使用过 `rustfmt`,应该先卸载它。其次,正如其名称所示,这是一个预览版。`rustfmt` 尚未达到 1.0,一些东西正在调整中,bug 也在修复中。一旦 `rustfmt` 达到 1.0,我们将发布 `rustfmt` 组件并弃用 `rustfmt-preview`。

在不久的将来,我们计划撰写一篇关于此发布策略的文章,因为它足够重要,值得单独成文,而且其影响范围也比本次发布更广泛。

欲了解更多,请查看 GitHub 上的 `rustfmt`

增量编译

早在 2016 年 9 月 (!!!),我们就写过一篇关于增量编译的博客文章。虽然那篇文章详细介绍了细节,但其基本思想是:当您在一个项目上工作时,您经常会编译它,然后稍微修改一些东西,然后再次编译。以前,编译器会编译您的 *整个* 项目,无论您修改的代码有多么少。增量编译的思想是,您只需要编译您实际修改过的代码,这意味着第二次构建会更快。

从 Rust 1.24 开始,这项功能已默认开启。这意味着您的构建应该会变得更快!在追求最低构建时间时,别忘了 `cargo check`。

这仍然不是编译器性能总体上或增量编译具体方面的终点。我们未来还有很多工作计划。例如,本次发布中另一项与性能相关的更改是:`codegen-units` 现在默认设置为 16。关于这项更改的一个小注意事项:它会加快构建速度,但会使最终二进制文件稍微变慢。为了获得最大速度,需要在您的 `Cargo.toml` 中将 `codegen-units` 设置为 `1`,以榨取每一滴性能。

更多内容即将推出!

其他不错的内容

我们还想在这里讨论另一项更改:未定义行为。Rust 通常力求最小化未定义行为,在安全代码中完全杜绝,在 unsafe 代码中也尽可能少。您可以调用 UB 的一个领域是当 `panic!` 跨越 FFI 边界时。换句话说,这样是行不通的:

extern "C" fn panic_in_ffi() {
    panic!("Test");
}

这无法工作,因为 `panic` 的精确机制必须与 “C” ABI 的工作方式协调一致(在本例中),或者与任何其他示例中的任何其他 ABI 协调一致。

在 Rust 1.24 中,这段代码现在将中止(abort)而不是产生未定义行为。

欲了解更多,请参阅详细发布说明

库稳定化

如果您是 `str::find` 的粉丝(它用于在 `&str` 中查找给定的 `char`),您会很高兴看到这个拉取请求:它现在快了 10 倍!这得益于 `memchr`。`[u8]::contains` 也使用了它,尽管速度提升没那么极端。

此外,本次发布稳定了一些新的 API:

最后,这些函数现在可以在常量表达式中使用,例如,用于初始化 `static`:

  • `Cell`、`RefCell` 和 `UnsafeCell` 的 `new` 函数
  • 各种 `Atomic` 整型类型的 `new` 函数
  • `{integer}::min_value` 和 `max_value`
  • `mem` 的 `size_of` 和 `align_of`
  • `ptr::null` 和 `null_mut`

欲了解更多,请参阅详细发布说明

Cargo 特性

正如上面提到的,本次发布的主要特性是默认开启了增量编译。

欲了解更多,请参阅详细发布说明

1.24.0 的贡献者

许多人共同努力创建了 Rust 1.24。没有你们所有人,我们不可能做到。感谢!