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 稳定版中的新内容

属性可以调用函数式宏

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 内联函数已稳定

wasm32 平台的一些内联函数已稳定,这使得可以访问 WebAssembly 中的 SIMD 指令。

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

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

增量编译默认情况下重新启用

在 1.52.1 中默认情况下被禁用之后,增量编译在这个版本中默认情况下重新启用。

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

从那时起,我们进行了一系列回顾,贡献者一直在努力解决报告的问题,其中一些修复在 1.53 中发布,大多数修复在这个版本中发布。 2

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

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

稳定的 API

以下方法和特征实现已稳定。

其他更改

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. 问题的跟踪问题是#84970