宣布 Rust 1.54.0

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

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

如果您之前通过 rustup 安装了 Rust,获取 Rust 1.54.0 就像运行以下命令一样简单:

$ rustup update stable

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

1.54.0 stable 版本有什么新特性

属性可以调用函数式宏

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

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

宏也可以嵌套在属性中。例如,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 平台的 intrinsic 函数已经稳定,它们提供了对 WebAssembly SIMD 指令的访问能力。

值得注意的是,与之前稳定化的 x86x86_64 intrinsics 不同,这些 intrinsics 没有要求只能在启用相应目标特性时调用。这是因为 WebAssembly 从设计之初就实现了在执行前安全地验证代码,因此指令保证能被正确解码(或根本不解码)。

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

默认重新启用增量编译

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

在 Rust 1.52 中,当从磁盘缓存加载增量编译数据时,增加了额外的验证。这导致许多预先存在的潜在健全性问题被暴露出来,因为验证将这些隐藏的错误变成了内部编译器错误(ICEs)。作为回应,编译器团队决定在 1.52.1 补丁中禁用增量编译,让用户避免遇到 ICEs 和潜在的健全性问题,代价是编译时间变长。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 的发布。没有你们所有人,这是不可能的。感谢!