又到了这个时间:特性工作组的另一次冲刺总结。天哪,这次冲刺可真够忙的。
如果你对特性工作组不熟悉,我们在第一次冲刺的帖子中发布了一个简短总结。简单来说,特性工作组的总体目标是创建一个高效、可扩展且整洁的 Rust 特性系统实现。
2020 年第 2 次冲刺
虽然今年的第一次冲刺多少有些缺乏方向,我们很大程度上是“边做边摸索”,但这次冲刺要顺利得多。这部分归功于我们在第一次冲刺中确定下来的工具和流程,例如技能树或用于跟踪进度的持续更新的冲刺文档。
鸣谢
有许多人参与其中,有新面孔也有老面孔,在此向大家表示衷心感谢 ❤
- Wilco Kusee
- Élie Roudninski
- Florian Diebold
- Jack Huey
- Charles Lew
- Niko Matsakis
- Nathan Whitaker
- Adam Bratschi-Kaye
- super-tuple
- David Ross
- Christofer Nolander
- Michael Bryan
- Mark McCaskey
- Wonwoo Choi
- Zahari Dichev
- Mikhail Babenko
- Mark Drobnak
真不少!
rustc 集成 MVP
正如在第一次冲刺的帖子中提到的那样,之前将 Chalk 集成到 rustc 的实验性工作已于今年早些时候被移除。那次集成是旧的,且不是基于当前的 Chalk 代码库。在上次冲刺结束时,我们开始了重新集成。计划是(并且仍然是)使用新的 Chalk 框架开始一个“最小可行产品”(MVP)(好奇者,新的集成使用 `chalk-solve` crate 而不是 `chalk-engine`)。这个 MVP 有几个目标和限制:
- rustc 类型和目标被深度且急切地转换为 Chalk 类型
- 生命周期有时会被忽略
- 没有常量,且缺少一些类型和特性
- 有一些 hack 以使其工作
话虽如此,rustc 集成 PR 已经合并,新的实验性 Chalk 解算器可以在 `-Z chalk` 标志下使用。提前警告:现在还不要使用它。它的实现还处于非常早期阶段,_不能_ 工作的情况远多于 _能_ 工作的情况。**但是**,这是一个开始,并且只会从这里变得更好、更完整。
Chalk 中 Const 的规划
在这次冲刺开始之前,我们决定规划一次关于 Chalk 中常量的设计会议。我们在 4 月 7 日举行了那次会议。然而,我们没想到_这次_冲刺就开始实现它。但不管怎样,目前已有一个实现 Chalk 中常量的 PR 正在进行。这有助于揭示 Chalk 中的一些设计决策。我们预计这个 PR 可能会很快合并。
向着 rustc 和 Chalk 共用的类型库迈进
目前,rustc 和 Chalk 表示类型的方式略有不同。此外,Chalk 还缺少一些。在当前的 MVP 实现中,rustc 类型和 Chalk 类型之间的转换是“深度且急切的”,这意味着我们做了大量工作才能将 Chalk 用作特性解算器。最终目标是创建一个共享类型库。编译器团队召开了一次会议,主要从 rustc 方面“开绿灯”支持此事。不过,到目前为止的大部分工作都在 Chalk 端,用于添加缺失的内置类型和特性。
Chalk 中 `impl Trait` 的基本支持
我们在这次冲刺期间合并了对 `impl Trait` 的初步支持。它尚不支持一些功能,例如泛型。但有一个开放的 PR 正在扩展其功能。
移除 rustc 中泄露检查的进展
在 rustc 特性解算器中,目前存在一个针对生命周期的特殊检查,称为“泄露检查”。暂不深入技术细节,这种方法存在一些设计缺陷,并且它的存在阻碍了诸如惰性规范化(lazy normalization)之类的功能(这是常量泛型和 GATs 等功能所必需的)。然而,完全移除泄露检查会带来一些向后兼容性问题。但是已经取得了一些进展。
为 Chalk 添加递归解算器
Chalk 最初编写时使用了一个有状态的递归解算器。后来改用了一种称为 SLG 的 Prolog 解算方法。SLG 使用一种更无状态的方法,其中子目标的答案可以重用。
虽然 SLG 更完整,但存在一些设计权衡。一个特别的例子与我们如何处理关联类型有关。未来完全有可能并且我们将解决这些设计问题。然而在此期间,我们复活了旧的递归解算器。Rust-analyzer 已切换到使用它,并且结果是积极的。
目前,我们将继续努力解决 SLG 解算器的设计问题。最终,我们期望对两者进行评估并选择一个来坚持使用。
创建可重现的 Chalk 测试文件
我们经常会收到 Chalk 未能报告预期结果的错误报告。正如任何维护过软件的人都知道的,获取最小可重现示例很困难。更困难的是,Chalk 理解的目标和程序是实际 Rust 代码的“低级”形式,这意味着我们不仅要创建一个最小的 _Rust_ 示例,还要创建一个最小的 _Chalk_ 示例。
为了帮助简化这个过程,我们开始为 Chalk 制作一个日志记录 shim,以生成 Chalk 可以运行并重现 bug 的程序。更重要的是,它应该能够无缝使用,无论 Chalk 的使用者是谁,无论是 rustc、rust-analyzer 还是其他任何东西。
Chalk 手册中的文档
我们致力于让我们所做的工作对任何感兴趣的人开放,无论是那些从事 Chalk、rustc 工作的人,还是仅仅使用 Rust 的人。作为这项工作的一部分,我们之前开始出版了一本 Chalk 手册。在这次冲刺中,我们添加了更多文档。此外,以前在 rustc 开发者指南中的 Chalk 相关文档现已移至 Chalk 手册。
2020 年第 3 次冲刺
我们尚未决定下一次冲刺的目标。我们将在周二(19日)下午 4:00 EST 在 zulip 上进行每周例会冲刺规划。然后我们计划在之后一周正式开始冲刺。如果你有兴趣提供帮助或加入讨论,随时欢迎参加!