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 开始,这变得更加符合人体工程学。
宏也可以嵌套在属性中。例如,concat! 宏可以在使用 stringify! 包含替换内容的宏中构建文档注释
make_function!
wasm32 intrinsics 稳定化
许多 wasm32 平台的 intrinsic 函数已经稳定,它们提供了对 WebAssembly SIMD 指令的访问能力。
值得注意的是,与之前稳定化的 x86 和 x86_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 实现已稳定。
BTreeMap::into_keysBTreeMap::into_valuesHashMap::into_keysHashMap::into_valuesarch::wasm32VecDeque::binary_searchVecDeque::binary_search_byVecDeque::binary_search_by_keyVecDeque::partition_point
其他变更
Rust 1.54.0 版本还有其他变更:查看 Rust、Cargo 和 Clippy 的变更详情。
rustfmt 在 1.54.0 版本中也得到了修复,可以正确格式化嵌套的非内联模块。这可能会导致 1.53.0 rustfmt 忽略的文件在格式化时发生变化。详情请参阅此处。
1.54.0 的贡献者
许多人共同努力促成了 Rust 1.54.0 的发布。没有你们所有人,这是不可能的。感谢!