【Rust日报】2026-10-30 编译器打开了 83 个 nightly 特性

💡 原文中文,约5100字,阅读约需12分钟。
📝

内容提要

本期Rust社区周报要点:rustc源码启用了83个nightly特性,其中约九成并非必需,主要用于提升可读性;Pivot数据库分析ClickBench的GROUP BY查询发现,一半时间耗在等待内存上,采用radix分区可将DRAM读取量从4.5GB降至1.5GB;mbrotli和mzstd开始用Lean 4对照RFC 7932和8878进行形式化验证;µcad以5MB WASM运行128位定点几何引擎,输出SVG和STL。

🔎

延伸解读

nightly 特性是编译器源码的“可读性工具”

rustc 启用的 83 个 nightly 特性中约九成并非运行必需,主要让源码更好写、更好读。构建时通过 RUSTC_BOOTSTRAP=1 仅为编译器自身打开这些开关,文章明确提醒不要在自己的项目里使用该变量,因为它会关闭稳定性保证,代码可能在任意更新后失效。

GROUP BY 慢在等内存,而非算力

Pivot 的 ClickBench 实验显示,朴素 HashMap 聚合有 50.1% 的 CPU slot 停在内存上,按需 DRAM 读取达 4.5 GB。改用 radix 分区后,内存停顿降至 23.5%,DRAM 读取降到 1.5 GB,耗时从 3.6 秒降到 2.7 秒。这说明 CPU 显示 100% 时,优化重点可能是减少内存访问而非指令数。

形式化验证补的是“是否符合 RFC”

mbrotli 和 mzstd 用 Lean 4 对照 RFC 7932 和 8878 证明部分函数,但文章强调它们还不是完整验证的编解码器。差分测试只能回答“是否和 C 一样”,回答不了“是否符合 RFC”;C 库出错时差分测试不会报。CVE-2026-111497 和 mbrotli 0.5.16 的 RFC 偏差正说明这一层检查的必要性。

µcad 的取舍:小体积与有限输出

µcad 把编译器和 128 位定点几何引擎打进 5 MB WASM,输出目前只有 SVG 和 STL,尚不能出 STEP。作者正考虑对接 OpenCASCADE,当前内核是基于 Manifold 的最小 CSG。文档页当时返回 404,作者表示会在几周内补文档,且不愿放入 AI 生成的文档。

❓

Q&A

rustc 源码里打开了多少个 nightly 特性?这些特性对编译器运行是必需的吗?

rustc 源码里一共打开了 83 个不同的 nightly 特性。作者估计大约 90% 的特性拿掉之后,编译器还能按同样的方式工作,它们主要让编译器源码更好写、更好读。

deref_patterns 这个特性有什么作用?它目前能用在哪些类型上?

deref_patterns 允许 match 模式直接穿过 Box、String、Vec 等实现了 DerefPure 的类型。它只对标准库实现了 DerefPure 的类型(如 Box、String、Vec、Rc、Arc、Cow)生效,自定义类型需要额外使用 deref_pure_trait 特性才能手动实现。

Pivot 数据库在 GROUP BY 查询中遇到了什么性能问题?他们如何优化?

Pivot 发现 GROUP BY 查询一半时间花在等待内存上,CPU 显示 100% 但实际在等 DRAM。他们改用 radix partitioning:先按 hash 高 12 位将行分到 4096 个分区,再对每个分区单独聚合。优化后内存停顿从 50.1% 降到 23.5%,DRAM 读取量从 4.5 GB 降至 1.5 GB。

mbrotli 和 mzstd 为什么要用 Lean 4 进行形式化验证?它们目前验证到什么程度?

现有的差分测试只能检查是否与 C 实现一致,无法回答是否符合 RFC。形式化验证可以证明代码符合 RFC 7932 和 RFC 8878。目前 mbrotli 和 mzstd 已开始用 Lean 4 证明部分函数符合 RFC,但还不是完整的已验证编解码器。

µcad 是什么?它的技术特点有哪些?

µcad 是用 Rust 写的 CAD 领域语言,带一个几何引擎。它使用 128 位定点数,编译器和几何引擎打包成 5 MB 的 WASM 二进制,输出 SVG 和 STL 格式。目前内核是基于 Manifold 的最小 CSG,正在考虑对接 OpenCASCADE。

default_field_values 特性解决了什么问题?在 rustc 中是如何应用的?

default_field_values 允许在结构体字段定义上直接写默认值,构造时只需指定非默认字段。在 rustc 中,Parser 有 20 个字段,其中 16 个带默认值,构造时只写 4 个与输入有关的字段,其余用 .. 省略。这避免了 ..Default::default() 要求整个结构体实现 Default 的限制。

🏷️

标签

➡️

继续阅读