内容提要
Rust 团队在 nightly 版本中启用了下一代借用检查器 Polonius 的 Alpha 版本,计划在数月内稳定。该检查器支持流敏感分析,能解决 NLL 无法编译的代码,如条件分支中的借用问题。性能略有回归,但可接受,用户可通过 `-Zpolonius=off` 禁用。团队将监控问题并优化,目标在年底前稳定,之后暂停功能开发。
延伸解读
流敏感分析的实际收益
Polonius Alpha 的核心改进是流敏感分析,它能识别借用是否在某个分支中仍然活跃。例如,在 `get_mut_or_default` 函数中,`Some` 分支的借用不会在 `None` 分支中存活,因此代码可以编译。这解决了 NLL 因流不敏感而拒绝的常见模式,让开发者可以更自然地编写条件分支中的借用逻辑。
性能回归与权衡
启用 Polonius Alpha 后,编译时间可能略有增加。根据对 crates.io 下载量前一万名 crate 的测试,大多数 crate 的回归很小,但少数 crate 可能遇到 2-3 倍的编译时间增长。团队认为这种代价相对于新增的借用检查能力是可接受的,但用户若遇到严重回归,可通过 `-Zpolonius=off` 临时禁用。
已知限制与未来方向
Polonius Alpha 并非完美,它无法编译某些在旧版 Polonius 下可用的代码,例如涉及循环中借用更新的复杂场景。团队计划在稳定后暂停功能开发,转而优化性能和修复回归。这意味着短期内不会增加更多借用检查特性,但已解决大多数常见问题。
Q&A
Rust 的 Polonius Alpha 借用检查器在哪个版本中启用?
Polonius Alpha 是在 Rust 的 nightly 版本中启用的,用于测试,计划在数月内稳定。
Polonius Alpha 相比 NLL 的主要优势是什么?
Polonius Alpha 支持流敏感分析,能够处理 NLL 无法编译的代码,例如在条件分支中借用不活跃的情况。
能否给出一个 Polonius Alpha 能编译但 NLL 不能的代码示例?
一个简单的示例是:fn reborrow(a: &mut u8) -> &mut u8 { let b = &mut *a; if true { b } else { a } }。更常见的示例是 get_mut_or_default 函数,其中在 None 分支中借用不活跃。
Polonius Alpha 的性能表现如何?
Polonius Alpha 的性能相比 NLL 略有回归,但整体可接受。在下载量前一万的 crate 中,只有少数出现显著回归,最坏情况是 2-3 倍变慢。
如何禁用 Polonius Alpha 并回退到 NLL?
可以通过传递 -Zpolonius=off 给 rustc,或设置 RUSTFLAGS=-Zpolonius=off,或在 .cargo/config.toml 中配置 rustflags 来禁用。
Polonius Alpha 计划何时稳定?
团队计划在年底前稳定 Polonius Alpha,之后将暂停功能开发,但会继续优化性能。