Rust 1.54.0 版本发布公告

2021年7月29日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 新版本 1.54.0 发布。Rust 是一种编程语言,旨在赋予每个人构建可靠和高效软件的能力。

如果您之前通过 rustup 安装了 Rust,那么获取 Rust 1.54.0 非常容易,只需运行:

$ rustup update stable

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

1.54.0 稳定版有哪些新功能

特性(Attributes)可以调用类似函数的宏

Rust 1.54 支持在特性(attributes)内部调用类似函数的宏。类似函数的宏可以是基于 macro_rules! 的宏,也可以是像 macro!(...) 这样调用的过程宏。 这种用例的一个显著例子是将来自其他文件的文档包含到 Rust 文档注释中。例如,如果您的项目的 README 文件代表了一个良好的文档注释,您可以使用 include_str! 直接合并其内容。以前,各种变通方法允许类似的功能,但从 1.54 版本开始,这更加符合人体工程学。

#![doc = include_str!("README.md")]

宏也可以嵌套在特性(attribute)内部。 例如,concat! 宏可以用于从宏内部构建文档注释,该宏使用 stringify! 来包含替换。

macro_rules! make_function {
    ($name:ident, $value:expr) => {
        #[doc = concat!("The `", stringify!($name), "` example.")]
        ///
        /// # Example
        ///
        /// ```
        #[doc = concat!(
            "assert_eq!(", module_path!(), "::", stringify!($name), "(), ",
            stringify!($value), ");")
        ]
        /// ```
        pub fn $name() -> i32 {
            $value
        }
    };
}

make_function! {func_name, 123}

阅读此处了解更多详情。

wasm32 intrinsics 稳定化

wasm32 平台的许多 intrinsics 已经稳定化,这使得可以访问 WebAssembly 中的 SIMD 指令。

值得注意的是,与之前稳定化的 x86x86_64 intrinsics 不同,这些 intrinsics 没有安全要求,即仅在启用适当的目标特性时才被调用。 这是因为 WebAssembly 从一开始就被编写为在执行代码之前安全地验证代码,因此可以保证指令被正确解码(或根本不解码)。

这意味着我们可以将一些 intrinsics 公开为完全安全的函数,例如 v128_bitselect。 然而,仍然有一些 intrinsics 是不安全的,因为它们使用原始指针,例如 v128_load

增量编译默认重新启用

在此版本中,增量编译已默认重新启用,此前在 1.52.1 版本中默认禁用。

在 Rust 1.52 中,从磁盘缓存加载增量编译数据时添加了额外的验证。 这导致许多先前存在的潜在健全性问题被发现,因为验证将这些静默错误更改为内部编译器错误 (ICE)。 作为回应,编译器团队决定在 1.52.1 补丁中禁用增量编译,允许用户避免遇到 ICE 和潜在的不健全性,但代价是编译时间更长。1

从那时起,我们进行了一系列回顾,贡献者一直在努力解决报告的问题,其中一些修复程序在 1.53 版本中落地,而大部分修复程序在此版本中落地。2

目前仍有两个已知问题可能导致 ICE。 由于缺乏自动崩溃报告,我们无法确定未解决问题的影响程度。 但是,根据我们从受 1.52 版本影响的用户收到的反馈,我们认为剩余问题在实践中很少见。

因此,增量编译已在此版本中重新启用!

稳定的 API

以下方法和 trait 实现已稳定。

其他更改

Rust 1.54.0 版本中还有其他更改:请查看 RustCargoClippy 中的更改内容。

rustfmt 也在 1.54.0 版本中修复,以正确格式化嵌套的行外模块。 这可能会导致格式化与 1.53.0 rustfmt 忽略的文件不同的文件。 有关详细信息,请参见此处

1.54.0 版本贡献者

许多人齐心协力创造了 Rust 1.54.0。 没有你们大家,我们不可能做到。谢谢!

  1. 1.52.1 版本说明包含对这些事件的更详细描述。

  2. 这些问题的跟踪 issue 是 #84970