You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Rust 新版解读 | 1.71 | C-unwind API
> Rust 1.71 官方 release doc: [Announcing Rust 1.71.0 | Rust Blog](https://blog.rust-lang.org/2023/07/13/Rust-1.71.0.html)
通过 [rustup](https://www.rust-lang.org/tools/install) 安装的同学可以使用以下命令升级到 1.71 版本:
```shell
$ rustup update stable
```
## C-unwind API
1.71.0 稳定了 `C-unwind` 和其他 `-unwind` 后缀的ABI具体见[列表](https://github.com/rust-lang/rust/issues/74990#issuecomment-1363473645)
非强制unwinding的结果在这个RFC的[表格](https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md#abi-boundaries-and-unforced-unwinding)里。
带有 `-unwind` 后缀的ABI在由于 `panic` 或者 C++ 的异常(exception) 而执行 unwinding 时,穿过 ABI 边界会更安全,除此以外和没有 `-unwind` 后缀的 ABI 基本等效。使用 `panic=unwind` 可以有效地让异常从一种语言堆栈展开(stack unwind)到另一种语言而不需要中止进程(只要这个异常的产生和捕获都是在同一种语言内进行的)。而 `panic=abort` 通常会立刻中止进程。
这次稳定不会影响已有的ABI比如 `C`通过这些ABI的 unwinding 仍然是 UB 未定义行为。未来的 Rust 版本会按照这个RFC来修复这些ABI通常会在边界处abort。我们鼓励需要unwind穿过ABI边界的用户使用新的 ABI 来确保未来的兼容性。
译者注:或许以下一些概念对理解上面这个更新内容有一些帮助:
* [FFI](https://doc.rust-lang.org/nomicon/ffi.html)
* [what-is-stack-unwinding](https://stackoverflow.com/questions/2331316/what-is-stack-unwinding)
* [Rust Unwinding](https://doc.rust-lang.org/nomicon/unwinding.html)
## 调试器可视化属性
1.71.0 稳定了新的属性:`#[debug_visualizer(natvis_file = "...")]` 和 `#[debug_visualizer(gdb_script_file = "...")]`。它们允许植入 Nativis 描述和 GDB 脚本到 Rust 库里来改善通过调试器查看这些库数据结构时的输出结果。Rust本身有给标准库打包类似的脚本如今这个特性让库作者也可以给其用户提供类似的体验了。
具体细节查看:[the-debugger_visualizer-attribute](https://doc.rust-lang.org/nightly/reference/attributes/debugger.html#the-debugger_visualizer-attribute)
## raw-dylib 动态库链接
在 Windows 平台上,通过在 `#[link]` 里使用新的选项 `kind="raw-dylib"`Rust 现在支持使用动态库且编译期不需要依赖这个动态库。
这避免了要求用户安装这些库这在跨平台交叉编译的时候尤为困难也避免了在crates指明需要链接的库的具体版本。
使用新的属性 `#[link_ordinal]` Rust 也支持通过动态库的符号顺序而不是符号名称来进行符号绑定。
## 线程局部常量初始化
其实是 1.59 稳定进标准库的功能(没有在更新说明和文档里提过)。[文档](https://doc.rust-lang.org/stable/std/macro.thread_local.html)
```rust
use std::cell::RefCell;
use std::thread;
thread_local!(static FOO: RefCell<u32> = RefCell::new(1));
FOO.with(|f| {
assert_eq!(*f.borrow(), 1);
*f.borrow_mut() = 2;
});
// each thread starts out with the initial value of 1
let t = thread::spawn(move|| {
FOO.with(|f| {
assert_eq!(*f.borrow(), 1);
*f.borrow_mut() = 3;
});
});
// wait for the thread to complete and bail out on panic
t.join().unwrap();
// we retain our original value of 2 despite the child thread
FOO.with(|f| {
assert_eq!(*f.borrow(), 2);
});
```
## Others
其它更新细节和稳定的API列表参考[原Blog](https://blog.rust-lang.org/2023/07/13/Rust-1.71.0.html#stabilized-apis)