Rustc Trait 系统重构计划更新:稳定 `-Znext-solver=coherence`

2024 年 12 月 4 日 · lcnr 代表 Rustc Trait 系统重构计划

自从我们在 类型团队更新博客文章中上次总结我们的进展以来,已经过去了半年。随着下一代 trait 求解器现在在 beta 版本中默认用于一致性检查1,现在是时候进行另一次更新了。下一代 trait 求解器旨在完全取代现有的负责证明 trait 约束、规范化关联类型等等的类型系统组件。这应该修复许多长期存在的(健全性)错误,支持未来的类型系统改进,并缩短编译时间。有关更多详细信息,请参阅之前这篇博客文章

在四月份,稳定在一致性检查中使用新求解器的 FCP 已经通过。不幸的是,检查深度递归类型的自动 trait 边界导致新实现的指数级爆炸,导致 CI 捕获的挂起。修复此挂起需要我们添加一个复杂的缓存优化,以有效地处理循环,同时仍然保持正确2。然后我们合并了稳定化 PR,但 5 天后将其还原,因为它导致了 nalgebra 中单独的挂起。幸运的是,这次的修复要简单得多,这使得我们能够在不久之后再次稳定 -Znext-solver=coherence

虽然新求解器目前仅用于一致性检查,但这已经消除了一些不一致和理论上的健全性问题,请参阅稳定化报告以获取完整摘要。如果您遇到任何奇怪的挂起、意外的重叠错误或无用的诊断,请打开一个GitHub 问题

然后,我们将重点转移到再次完全使用新求解器进行引导。我们在这方面取得了重大进展,并且能够完全编译 rustccargo允许 try-build 成功。我们目前正在研究剩余的编译时基准测试失败。我们打算开始优化新实现,并测试越来越多的 crate,直到一个完整的 crater 运行 将会很有用。

展望未来

为了解除下一代 trait 求解器的稳定化,我们需要修复多个问题,这些问题也会影响当前的实现。这是由于实现之间的细微差异导致新求解器触发了旧求解器避免的错误。不幸的是,新实现正确工作而旧实现不正确的情况不太相关,因为还没有人编写依赖于下一代 trait 求解器行为的代码。

我们还将花费大量精力来改进使用新 trait 求解器时的错误消息。在很多情况下,它们仍然明显比现状更糟糕。

我们仍在努力进行第一次 crater 运行,并且意识到多个重大问题。我们预计在未来几个月内解决其中的大部分问题。因此,虽然我们还没有到错误报告有用的地步,但我们打算很快明确要求测试 -Znext-solver=globally。要了解我们的进展,请查看-Znext-solver 跟踪问题或加入我们在 zulip上的讨论。

  1. 这将稳定为 1.84 版本。

  2. 旧的实现通过不正确地重用缓存条目,即使它们不适用,从而避免了这些挂起。由于细微的原因™,我们认为这不是一个可利用的健全性问题。