又到了一年中的这个时候:又一篇特性工作组冲刺总结。哦,天哪,这是一个忙碌的冲刺。
如果您不熟悉特性工作组,我们在 第一轮冲刺文章 中发布了一个简短的总结。简而言之,特性工作组 的总体目标是创建一个高性能、可扩展且干净的 Rust 特性系统实现。
2020 年第二轮冲刺
虽然今年的第一轮冲刺在某种程度上缺乏方向,我们很大程度上是“边做边摸索”,但这一轮冲刺要顺利得多。这部分归功于我们在第一轮冲刺中确定的工具和程序,例如 技能树 或用于跟踪进度的运行 冲刺文档。
应有的肯定
我们得到了许多人的大量参与,其中一些是新的,一些是旧的。为此,非常感谢❤
- 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 类型
- 有时会忽略生命周期
- 没有常量以及一些缺失的类型和特性
- 一些使事情正常工作的技巧
话虽如此,rustc 集成 PR 已经落地,新的实验性 Chalk 求解器在 -Z chalk
标志下可用。只是提前警告一下:(还)不要使用它。它仍处于实现的早期阶段,不起作用的情况会比起作用的情况多。但是,这是一个开始,并且从这里开始只会变得更好和更完整。
Chalk 中的常量规划
在本次冲刺开始之前,我们决定要为 Chalk 中的常量计划一次设计会议。我们在 4 月 7 日举行了会议。然而,我们没想到会在本次冲刺中开始实施。但是,唉,已经有一个 PR 打开以在 Chalk 中实现常量。这有助于发现 Chalk 中的一些设计决策。我们预计它可能会很快落地。
朝着 rustc 和 Chalk 的共享类型库迈进
目前,rustc 和 Chalk 以略微不同的方式表示类型。此外,Chalk 缺少一些。在当前的 MVP 实现中,rustc 和 Chalk 类型之间的转换是“深度且迫切的”,这意味着我们做了大量的工作来使用 Chalk 作为特性求解器。最终目标是创建一个共享类型库。举行了一次编译器团队会议,主要从 rustc 方面“批准”了这一点。然而,到目前为止,大部分工作都集中在 Chalk 上,以添加缺失的内置类型和特性。
impl Trait
的基本支持
Chalk 中对 我们在本次冲刺期间实现了对 impl Trait
的初始支持。它尚未支持某些功能,例如泛型。但是,有一个打开的 PR 来扩展该功能。
朝着移除 rustc 中的泄漏检查迈进
在 rustc 特性求解器中,目前有一个针对生命周期的特殊检查,称为“泄漏检查”。在不深入探讨技术细节的情况下,这种方法存在一些设计缺陷,并且它的存在会阻止诸如惰性规范化(const 泛型和 GAT 所需)之类的功能。但是,完全删除泄漏检查存在一些向后兼容性问题。但是,取得了一些进展。
向 Chalk 添加递归求解器
当 Chalk 最初编写时,它使用有状态的递归求解器。然后将其更改为使用称为 SLG 的 prolog 求解方法。SLG 使用更无状态的方法,其中可以重用子目标的答案。
虽然 SLG 更完整,但存在一些设计权衡。一个特别的例子与我们如何处理关联类型有关。我们完全有可能并且将在未来解决这些设计问题。但是,与此同时,我们复活了旧的递归求解器。Rust-analyzer 已切换为使用它,并且结果是积极的。
目前,我们将继续致力于解决 SLG 求解器的设计问题。最终,我们希望评估两者并选择一个坚持使用。
创建可重现的 Chalk 测试文件
我们经常会收到错误报告,其中 Chalk 没有报告预期的结果。而且,正如任何维护过软件的人都知道的那样,获得最小的复现是困难的。更困难的是,Chalk 理解的目标和程序是实际 Rust 代码的“降级”形式,这意味着我们不仅要创建一个最小的 Rust 示例,还要创建一个最小的 Chalk 示例。
为了帮助简化此过程,我们已经开始为 Chalk 制作一个日志记录垫片,以生成 Chalk 可以运行并重现该错误的程序。更重要的是,无论 Chalk 的用户是 rustc、rust-analyzer 还是其他任何用户,它都应该能够无缝使用。
Chalk 书中的文档
我们致力于使我们所做的工作对任何感兴趣的人都可用,无论是那些在 Chalk 上工作的人、在 rustc 上工作的人还是仅使用 Rust 的人。作为这项工作的一部分,我们之前开始出版 Chalk 书。在本次冲刺期间,我们添加了一些文档。此外,以前在 rustc-dev-guide 中的 Chalk 相关文档现在已移至 Chalk 书中。
2020 年第三轮冲刺
我们尚未决定下一次冲刺的目标。我们将在 19 日星期二美国东部时间下午 4:00 在 zulip 的每周会议上进行冲刺计划。然后,我们计划在下周正式开始冲刺。如果您有兴趣提供帮助或加入讨论,请随时光临!