查询循环:一桩编译器谋杀谜案

来源:ferrous-systems.com

📋 概述

Ferrous Systems(Rust 生态的核心贡献者)以「谋杀谜案」的叙事风格,深入剖析了增量编译引擎中最棘手的 bug 类型之一:查询循环(Query Cycles)。在现代编译器中(如 rustc 的查询系统、Salsa 框架、Buck2 等构建系统),编译过程被建模为一系列可缓存的纯函数查询。当查询之间存在循环依赖时——比如类型推断需要函数签名、而函数签名又依赖类型推断的结果——系统就会陷入无限递归或死锁。文章通过一个虚构的「犯罪现场调查」追溯了查询循环的发现、诊断和修复过程,揭示了依赖图分析循环断点策略惰性求值等编译器架构层面的设计权衡。虽然以 Rust 生态为背景,但核心问题适用于任何基于查询的增量计算系统。

🔑 核心要点

💡 金句

A compiler murder mystery — where the victim is your build time and the suspect is hiding in the dependency graph. ——一桩编译器谋杀谜案——受害者是你的构建时间,嫌疑人藏在依赖图中。
← 返回 Lobsters 首页