特性工作组 2020 年第二轮冲刺总结

2020 年 5 月 18 日 · Jack Huey 代表 特性工作组

又到了一年中的这个时候:又一篇特性工作组冲刺总结。哦,天哪,这是一个忙碌的冲刺。

如果您不熟悉特性工作组,我们在 第一轮冲刺文章 中发布了一个简短的总结。简而言之,特性工作组 的总体目标是创建一个高性能、可扩展且干净的 Rust 特性系统实现。

2020 年第二轮冲刺

虽然今年的第一轮冲刺在某种程度上缺乏方向,我们很大程度上是“边做边摸索”,但这一轮冲刺要顺利得多。这部分归功于我们在第一轮冲刺中确定的工具和程序,例如 技能树 或用于跟踪进度的运行 冲刺文档

应有的肯定

我们得到了许多人的大量参与,其中一些是新的,一些是旧的。为此,非常感谢❤

真多啊!

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 上,以添加缺失的内置类型和特性。

Chalk 中对 impl Trait 的基本支持

我们在本次冲刺期间实现了对 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 的每周会议上进行冲刺计划。然后,我们计划在下周正式开始冲刺。如果您有兴趣提供帮助或加入讨论,请随时光临!