在 nightly 版本中启用下一代特征求解器 | Rust 博客
摘要
Rust 博客宣布在 nightly 版本中启用下一代特征求解器,这是一次重大编译器更新,替换核心类型系统组件,修复超过 200 个问题,并计划进行稳定化。
<p><a href="https://lobste.rs/s/3giezs/enabling_next_generation_trait_solver_on">评论</a></p>
查看缓存全文
缓存时间: 2026/08/21 16:56
# 在 nightly 版本中启用下一代 trait 求解器 | Rust 博客
来源:https://blog.rust-lang.org/2026/08/21/enabling-next-solver-on-nightly/
经过近 4 年的积极开发,下一代 trait 求解器 (https://github.com/rust-lang/rust-project-goals/issues/113) 即将趋于稳定。我们已在 nightly 版本中默认启用它,以暴露任何剩余问题,并计划在未来数月内完成稳定化。这是 Rust 编译器自初始发布以来最大规模的单次变更。它彻底改变了我们证明 where 子句、规范关联类型等多种机制的方式。
**请尝试最新的 nightly 版本,并在遇到任何错误或回归问题时提交 issue (https://github.com/rust-lang/rust/issues)。**
这是编译器的内部组件。此次重构的主要益处将在未来显现。移除旧实现将解锁诸如 Type Alias Impl Trait 和 Return Type Notation (https://rust-lang.github.io/rust-project-goals/2026/rtn.html) 等特性,允许我们添加新的隐式默认 trait 约束(例如 `Move` 和 `Forget` (https://rust-lang.github.io/rust-project-goals/2026/move-trait.html)),并使我们能够修复剩余的类型系统健全性问题 (https://rust-lang.github.io/rust-project-goals/2026/roadmap-project-zero.html)。即便如此,此变更已修复了大量问题。作为保守估计,我们目前已知 GitHub 上有超过 200 个问题因这一变更而得到修复 (https://github.com/rust-lang/rust/issues?q=is%3Aissue%20state%3Aopen%20label%3Afixed-by-next-solver)。
此变更对编译时间也有显著影响;更多内容将在后文说明。在 nightly 版本上开发时,您可能会无意间依赖仅受新 trait 求解器支持的行为。这是一项极其庞大的变更,导致了相当数量的破坏性变化。其中大多数变更旨在改进类型推断或移除不理想的行为。我们正在一个置顶的 GitHub issue (https://github.com/rust-lang/rust/issues/160895) 中跟踪已知问题和破坏性变化。
## 我能做些什么?
请通过使用 `rustup update nightly` 更新到最新的 nightly 版本,并用它来测试您现有的项目和库。
> ⚠️ 尽管下一代 trait 求解器已在我们的 `main` 分支上启用,但此变更将从 8 月 22 日(星期六)开始仅在 nightly 频道上可用。您可以通过提供 `-Znext-solver=globally` 作为命令行参数来提前进行测试 ⚠️
请告诉我们您遇到的任何破坏性变化、编译时间性能回归或不良诊断信息。我们尚未在下一代 trait 求解器的错误消息上花费太多时间,因此我们同样感谢您使用此 nightly 版本来发现我们错误处理中不完善的诊断信息和其他错误。如果您遇到任何问题,请快速查看置顶的 GitHub issue (https://github.com/rust-lang/rust/issues/160895),确认受影响的 crate 是否已列出;如果没有,请提交一个新 issue (https://github.com/rust-lang/rust/issues/new?template=bug_report.md)!
要在 nightly 版本上禁用下一代 trait 求解器,您可以向 `rustc` 传递 `-Znext-solver=coherence`,使用 `RUSTFLAGS=-Znext-solver=coherence`,或者更改您项目的 `.cargo/config.toml` (https://doc.rust-lang.org/cargo/reference/config.html) 配置文件:
```toml
[build]
rustflags = ["-Znext-solver=coherence"]
```
## 这具体意味着什么?
我们将在完全稳定化下一代 trait 求解器时,更详细地介绍它、我们是如何走到这一步的以及它改变了什么。以下是其主要影响的快速摘要。
### `impl Trait` 处理
在类型系统中处理 opaque 类型——返回位置 `impl Trait` (RPIT),以及不稳定的 Type Alias Impl Trait (TAIT) 和 Return Type Notation (RTN) (https://rust-lang.github.io/rust-project-goals/2026/rtn.html)——的方式几乎完全改变。这修复了许多与之相关的错误和边界情况,并应使其行为在总体上更加一致。这一变更是稳定化 TAIT 和 RTN 所必需的。实现上的变更对 RPIT 影响不大,因为我们在对方法体进行类型检查时,会对方法签名中的 `impl Trait` 进行特殊处理。这意味着观察旧行为的唯一方式是通过递归函数调用。以下代码片段在现有实现下会出错,但在启用 `-Znext-solver` 时可以编译(godbolt 链接:https://rust.godbolt.org/z/3faWKn4aE):
```rust
fn foo(b: bool) -> impl Sized {
if b {
// 旧实现在此处会报错。
foo(false) + 1
} else {
0
}
}
```
### 高阶类型中的关联类型
最具影响的改变是我们处理引用绑定变量的关联类型的方式,即来自 `for<'a>` 绑定器的生命周期,例如类型 `for<'a> fn(::Assoc<'a>)`。虽然大多数用户不会直接遇到此类类型,但存在广泛使用的 crate 会涉及。此变更通过移除不正确的类型推断来影响现有代码,例如在 bevy (https://github.com/bevyengine/bevy/pull/18840) 和 minijinja (https://github.com/mitsuhiko/minijinja/pull/787) 中。它还修复了许多不必要的错误,例如以下示例(godbolt 链接:https://rust.godbolt.org/z/MMsEjTxeE):
```rust
trait OtherTrait {
type Assoc<'a>;
}
impl OtherTrait for u32 {
type Assoc<'a> = &'a u32;
}
trait Trait {}
impl Trait for (T, for<'a> fn(::Assoc<'a>)) {}
fn impls() {}
fn main() {
// 旧实现未能证明
// `impls` 的 where 约束。
impls::<(u32, for<'a> fn(&'a u32))>();
}
```
### 编译时间性能
与 jana (https://github.com/jdonszelmann) 合作撰写
我们在下一代 trait 求解器的编译时间性能上投入了大量时间。在许多情况下,它的表现比旧求解器慢呈二次方甚至指数级。特别是在过去几周,我们主要致力于改进性能。这项工作由许多人共同完成,Nick Nethercote (https://github.com/nnethercote)、jana (https://github.com/jdonszelmann)、Rémy Rakic (https://github.com/lqd) 和 mira (https://github.com/inkreasing) 做出了重大贡献。作为这项努力的一部分,Rémy Rakic (https://github/lqd) 对 crates.io (https://crates.io/crates?sort=downloads) 上下载量前 20,000 个 crate 的两种实现性能进行了比较。
下图展示了过去两个月中的性能变化。x 轴表示 1000 个 crate,y 轴表示其减速因子(对数尺度)。许多 crate 位于 1.0 附近(无减速),两端均有显著的异常值。颜色显示了随时间的变化情况。左侧和右侧可以发现主要的异常值。注意,这里的 crate 样本偏向于*这类* crate,因为它们对我们更有趣。
我们测试的前 20k 个 crate 中,几乎所有的 crate 在两种实现下性能基本相同。这张图显示,我们主要将精力集中在负向异常值上,并在这些方面取得了显著进展。虽然许多之前在新求解器下编译时间超过两倍长的 crate 仍然稍慢,但我们的工作使其中一些实际上编译得*更快*了。我们将在未来几个月继续改进其性能,与现有实现相比,仍有许多优化机会。
我的预期是,长期来看,几乎所有 crate 都将受益于下一代 trait 求解器。我尤其对一些 trait 密集型 crate 带来的巨大性能提升感到兴奋。例如,一个用 Rust 类型系统实现的国际象棋 (https://github.com/Dragon-Hatcher/type-system-chess) 在旧实现下会挂起,而在新实现下仅需一分钟。也有一些更实用的 crate 带来了巨大的性能提升,例如 `datafusion` crate (https://crates.io/crates/datafusion) 的编译速度现在快了 8 倍以上。有关最近性能工作的更多详细信息,请参见 jana 的这篇博文 (https://donsz.nl/blog/new-solver-performance)。
---
再次感谢您使用最新的 nightly 版本进行测试,并在遇到任何问题时提交 GitHub issue (https://github.com/rust-lang/rust/issues)!我们期待很快能完全稳定化下一代 trait 求解器。
相似文章
在 nightly 上启用下一代借用检查器
Rust 博客宣布在 nightly 构建中启用下一代借用检查器 Polonius Alpha,带来流敏感的借用检查,并为今年晚些时候的稳定化铺平道路。
2026 年是 Rust 编译器激动人心的一年(对我来说也是)
一篇博客文章,介绍了为什么 2026 年是 Rust 编译器具有里程碑意义的一年:新一代 trait 求解器、Polonius 借用检查器、接近稳定化的并行前端,以及 LLVM 带来的显著性能提升,所有这些都汇聚在同一时刻。
限制 trait 的可实现性与字段可变性
Rust 宣布对 RFC 3323 功能进行 nightly 测试,这些功能限制 trait 的可实现性和字段可变性,为密封 trait 模式和 getter 方法提供了直接替代方案。
如何在2026年9月加速Rust编译器
该文章报告了Rust编译器在两个月内平均编译时间减少了4.57%,重点介绍了rustdoc、Clippy的优化、LLVM升级,以及新的Polonius借用检查器和Penelope Hammertime特征求解器。
我稳定了never类型
经过十多年的不稳定和失败尝试,Rust中的never类型已经在nightly版本上稳定了,这标志着该编程语言的重大进展。