宣布 Rust 1.71.0

2023 年 7 月 13 日 · Rust 发布团队

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

如果您之前通过 rustup 安装了 Rust,您可以使用以下命令获取 1.71.0:

$ rustup update stable

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

如果您想通过测试未来版本来帮助我们,可以考虑在本地更新到使用 beta 通道(rustup default beta)或 nightly 通道(rustup default nightly)。请随时报告您遇到的任何 bug!

1.71.0 稳定版中有哪些内容

C-unwind ABI

1.71.0 稳定了 C-unwind(以及其他以 -unwind 为后缀的 ABI 变体1)。

非强制展开(典型情况)的行为在此 RFC(提出此功能的文档)的此表格中指定。总结如下:

每个 ABI 大体上等同于没有 -unwind 的相同 ABI,除了使用 -unwind 时,当展开操作(panic 或 C++ 风格异常)跨越 ABI 边界时,其行为被定义为安全。对于 panic=unwind,这是一种允许一个语言中的异常在另一语言中展开栈而不会终止进程的有效方式(前提是该异常在源自的同一语言中被捕获);对于 panic=abort,这通常会立即中止进程。

对于本次初步稳定化,现有的 ABI(例如 "C")没有做出任何改变,跨越这些 ABI 的展开行为仍然是未定义行为。未来 Rust 版本将根据 RFC 中指定的行为修改这些 ABI,作为稳定此功能的最后一部分(通常是在边界处中止)。如果用户需要在 ABI 边界上展开,建议开始在代码中使用新的 unwind ABI 变体,以保持未来兼容性。

调试器可视化属性

1.71.0 稳定了对新属性 #[debug_visualizer(natvis_file = "...")]#[debug_visualizer(gdb_script_file = "...")] 的支持,这允许将 Natvis 描述和 GDB 脚本嵌入到 Rust 库中,以改进在检查这些库创建的数据结构时的调试器输出。Rust 本身已经为标准库打包了类似的脚本一段时间了,但此功能使库作者能够为终端用户提供类似的体验。

有关用法详情,请参阅参考资料

raw-dylib 连接

在 Windows 平台上,Rust 现在支持使用动态库中的函数,而无需在构建时就要求这些库可用,这通过使用 #[link] 的新选项 kind="raw-dylib” 实现。

这避免了要求用户安装这些库(特别是对于交叉编译来说很困难),也避免了在 crates 中打包库的存根版本进行链接。这简化了提供 Windows 库绑定的 crates。

Rust 还支持通过序号而不是符号名绑定到 DLL 提供的符号,这通过使用新的 #[link_ordinal] 属性实现。

升级到 musl 1.2

先前宣布的那样,Rust 1.71 将 musl 版本更新到 1.2.3。大多数用户不应受到此变化的影响。

Const 初始化的线程局部变量

Rust 1.59.0 在标准库中稳定了 const 初始化的线程局部变量支持,这使得代码生成更优化。然而,直到现在,此功能在发布说明和文档中都被遗漏了。请注意,此稳定化并不使 const { ... } 在其他上下文中成为有效的表达式或语法;那是一个独立的、目前仍不稳定的功能

use std::cell::Cell;

thread_local! {
    pub static FOO: Cell<u32> = const { Cell::new(1) };
}

稳定的 API

这些 API 现在在 const 上下文中已稳定

其他更改

查看 RustCargoClippy 中的所有更改。

1.71.0 的贡献者

许多人共同促成了 Rust 1.71.0 的发布。没有你们,我们不可能做到。感谢大家!