编译器打开了 83 个 nightly 特性
《What stable Rust stands on》统计了 rustc 源码里打开的 nightly 特性。作者 Kivooeo1 2026 年 10 月 28 日发到 r/rust,采集时 119 分、26 条评论。统计的提交是 f45772e。作者数了编译器每个 crate 的 lib.rs 里 feature 属性的不同名字,一共 83 个。
文章写,这些特性对编译器运行不是必需的。作者估计大约 90% 拿掉之后,编译器还能按同样的方式工作。这些特性主要让编译器源码更好写、更好读。其中不少在 nightly 上已经能用,并不只是 rustc 内部的专用开关。
稳定版 rustc 自己用 Rust 写。构建时先下载最新 beta,叫 stage0,再用它编译新的编译器。beta 默认禁止不稳定特性。构建会把 RUSTC_BOOTSTRAP 设成 1,只为编译器自身打开 nightly 特性。文章写,这个变量不该用在自己的项目里。它关掉稳定性保证,代码可能在任意一次更新后坏掉。
按打开它的编译器 crate 数量,前几名是:
deref_patterns:21 个 crate。match可以穿过Box、String、Vectry_blocks:16 个 crate。try { ... }里可以直接用?option_into_flat_iter:14 个 crate。把Option包着的可迭代值变成迭代器,None时为空default_field_values:13 个 crate。结构体字段定义上直接写默认值iter_intersperse、file_buffered、rustc_attrs:各 11 个 crate
deref_patterns 从 nightly 1.79 就有,跟踪 issue 是 #87121。稳定版上,对 Vec<String> 做切片模式要先转成 Vec<&str>,字符串字面量也匹配不上 String。打开这个特性之后,编译器会同时穿过 Vec 和 String。rustc 的 MIR 里,赋值存成 Assign(Box<(Place, Rvalue)>)。有了它,查找 x = &y 这种赋值可以一次匹配进 Box。
它只对实现了 unsafe 标记 trait DerefPure 的类型生效。标准库给 Box、String、Vec、Rc、Arc、Cow 等实现了。自己的类型不会自动有。自定义类型要再用 nightly 特性 deref_pure_trait,才能 unsafe impl DerefPure。文章写,目前还没有 RFC。DerefPure 这一段这一阶段也不打算稳定。
编译器以前用 box_patterns,写法是 Assign(box (lhs, ref rhs))。这个特性不会稳定。2026 年 5 月起,一批 PR 从 #156193 开始,按 crate 换掉。#156749 在 2026 年 8 月合入,把 box_patterns 从编译器里删掉。作者是这篇 PR 的指定 reviewer。特性说明现在只剩一句:由 deref_patterns 取代。
default_field_values 从 nightly 1.85 就有。RFC 3681 已接受,跟踪 issue 是 #132162。rustc_parse 的 Parser 有 20 个字段,16 个带默认值。构造时只写 4 个跟输入有关的字段,剩下用 ..。resolver 有 96 个字段,57 个带默认值。..Default::default() 要求整个结构体实现 Default,还会先造一个完整的临时值。Parser 的 psess: &ParseSess 没有合理的 Default。#[derive(Default)] 会用字段上声明的默认值。默认表达式必须能在 const 上下文里用。文档和 style guide 还没补完。还有讨论要不要允许非 const 默认值,例如 seed: u64 = rand()。
原文链接:https://kivooeo.github.io/blog/what-stable-rust-stands-on/
GROUP BY 一半时间在等内存
《It's the memory latency, stupid》是 Pivot 数据库写的性能文章,用 ClickBench 的 GROUP BY 说明 CPU 显示 100% 时,时间可能花在等内存上。作者 bobbymk10 2026 年 10 月 29 日发到 r/rust,采集时 91 分、14 条评论。
文章用的查询是 SELECT count(*), UserID FROM hits GROUP BY UserID。hits 大约 9900 万行,UserID 大约 1700 万个不同值。机器是 Cherry Servers 上的 AMD EPYC 9124,16 核,128 GB DDR5。查询钉在单核上,因为这版朴素聚合不能多核跑。作者写,云主机拿不到他们要的 DRAM 计数器,所以用了裸金属。
朴素写法是一个一直变大的 HashMap:每行 counts.entry(key).or_insert(0) += 1。第一次 3.9 秒,第二次 3.6 秒。第二次数据已经在 page cache 里。perf 显示,50.1% 的 CPU slot 停在内存上,16.1% 在退休微操作。按需从 DRAM 读取 76190837 次,一次 64 字节,合计 4.5 GB。
改法是 radix partitioning。先按 hash 的高 12 位把行分进 4096 个分区,分区里存 (hash, key)。全部分完之后,再对每个分区单独建 HashMap 做聚合。第二次跑是 2.7 秒。内存停顿降到 23.5%,退休操作升到 32.2%。退休的微操作从大约 114 亿增加到大约 194 亿。因内存停住的 slot 从大约 83.6 亿降到大约 37.9 亿。按需 DRAM 读取从 4.5 GB 降到 1.5 GB,对应 25688280 次 cache line。
文章给出的 Pivot 单核实现是 1848 毫秒,按需 DRAM 约 954 MB。同一查询在 16 核上是 171.773 毫秒。
原文链接:https://pivotlake.io/blog/its-the-memory-latency-stupid/
mbrotli 和 mzstd 开始对照 RFC 做证明
《Towards formal verification: mbrotli and mzstd》说明 mbrotli 和 mzstd 开始用 Lean 4 证明部分代码符合 RFC 7932 和 RFC 8878。作者 Mnwamnowich 2026 年 10 月 29 日发到 r/rust,采集时 86 分、11 条评论。文章写,它们还不是已验证的完整编解码器。
mbrotli 对 Google Brotli 1.2.0 的 quality 0 到 11,mzstd 对 zstd 1.5.7 的每个 level,都承诺写出和 C 参考实现相同的字节。现有检查包括差分测试、AFL++、ClusterFuzzLite、Miri 和 AddressSanitizer。两个 crate 都 forbid(unsafe_code)。文章写,这些能回答“是否和 C 一样”以及“会不会破坏内存”,回答不了“是否符合 RFC”。C 库错的地方,差分测试不会报。
文章举了 CVE-2026-111497。他们 2026 年 10 月 24 日写过这篇。C Brotli 解码器有越界写。根因是格式:RFC 7932 里,只有一种 block type 的 category,block count 是 16777216,需要更多的流是非法的。C 解码器快路径忽略了这个失败,继续用 block switch 没有建好的状态。mbrotli 没有这个 CVE 意义上的越界写。mbrotli 0.5.16 在同一处也不符合 RFC:block count 从 u64::MAX 开始,RFC 称为非法的流也能解码。mbrotli 0.5.17 修了这一点。
证明流水线在两个仓库里一样。Charon 用自己的 nightly 编译普通 crate,抽出列出的函数以及它们调用的 MIR。Aeneas 把 MIR 译成 Lean。加减乘、移位、转换和下标都变成 Result monad 里的操作,debug 构建会 panic 的地方这里会失败。手写的 Rfc.lean 转录 RFC,并检查码表长度是否连续、默认分布是否加总到表大小、RFC 里的例题是否算对。CI 里 ci-lean.yml 重新生成翻译,和已提交的不一致就失败,然后再编译证明。他们把 mbrotli 的 short_window_distance 里 - 4 改成 - 5,把 mzstd 两字节 Frame_Content_Size 里 + 256 改成 + 255。漂移检查会失败,重新生成后对应定理证不出来。
mbrotli 的第一批证明在 2026 年 10 月 25 日进入,PR #13。第二天同样的设置移植到 mzstd。两边都用 Lean 4.35.0。mbrotli 生成翻译约 2100 行,手写 RFC 和证明约 3200 行,覆盖 RFC 7932 第 4、5、7.2 节,以及 RFC 9841 的大窗口。mzstd 生成翻译约 1200 行,手写约 2800 行,覆盖 RFC 8878 第 3 节和 4.1.1。CI 用 Mathlib 缓存,证明检查不到一分钟。
文章写,已验证的函数里还没发现 bug。RFC 8878 印出的 Table 18 最后两行和正文不一致。现行 Zstandard 格式文档改了这两行。他们的转录跟正文,Rfc.lean 的自检用修正后的行。
原文链接:https://m-compressors.github.io/2026/formal-verification-mbrotli-mzstd/
µcad 用 5MB WASM 跑几何语言
µcad 是用 Rust 写的 CAD 领域语言,带一个几何引擎。作者 WilstonOreo 2026 年 10 月 28 日发到 r/rust,采集时 80 分、13 条评论。仓库是 mucad-lang/mucad。在线试用在 https://play.mucad.org/?example=11。
作者 2026 年 5 月在 RustWeek 现场用 µcad 写了 Rust logo,视频挂在帖子上。作者写,下周会在博洛尼亚的 RustLab 再讲一次 µcad 编译器。
几何引擎用 128 位定点数。语言编译器和几何引擎打进一个 5 MB 的 WASM 二进制,外面大约 1000 行 TypeScript。编译器 API 是手写的。作者写,最近开始用 Claude,主要用在 WASM API 和 Web Viewer。文档页 docs.mucad.org/reference/latest 当时返回 404。作者回复说接下来几周会补文档,不想在这个项目里放 AI 生成的文档。
输出现在是 SVG 和 STL。作者在看和 OpenCASCADE 对接。OpenCASCADE 是 FreeCAD 用的 CAD 内核。现在的内核是基于 Manifold 的最小 CSG。评论问能不能出 STEP,作者写现在只能出 SVG 和 STL。分辨率可以在示例里用 Alt+Up/Down 调。
原文链接:https://github.com/mucad-lang/mucad
From Rust中文社区 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论