Rust周刊2026W37 | never 类型稳定、Rustls 十年零破坏、Allocator 逼近稳定
本周 Rust 底层能力落地:never 类型
!? 稳定,Allocator? trait 逼近稳定;Rustls 十年,0.23 线 43 版无破坏性变更并加入后量子密钥交换。SIMD 每秒扫描 150 GiB 文本、CUDA Rust 双路线cutile-rs/cuda-oxide。智能指针 map 稳定、clippy::all? 更名。
🦀 Rust 工具链更新
🔧 编译器
⚡ 性能优化
编译器现在更密集地存储 LiveLoans,并用 IndexVec 替代 BTreeMap 保存 polonius 变体,降低编译期内存与查找开销;空 token 流的处理也被优化,大型项目与增量编译场景可感受到更快。
🐛 Bug修复
修复增量编译在归一化本地 opaque 类型后未重新运行相关查询的问题,避免复用陈旧结果导致漏重编译或错误编译。
📦 Cargo
📝 文档
Cargo 补充了如何配置 lints 的说明,完善 trim-paths 的限制与细节(workspace remap 以 . 开头),并把术语从 target triple 统一改为 target tuple、清理过时注释。
🐛 Bug修复
修复 git 依赖体验:git-fetch-with-cli 下给出 PR 提示、可用时改用 git 自带的 429 重试、错误信息更简洁;同时修复 write_atomic 对相对符号链接的处理,以及 parser 中一个理论上的 use-after-free。
⚠️ 破坏性变更
trim-paths 配置收紧:选项仅保留 none|object|all,并从 release profile 移除默认 scope。依赖旧配置的项目需要调整才能继续构建。
🔧 改进
当搜索路径已经通过 --extern 传入时,不再重复传递 -L 参数,减少无谓的编译器参数与潜在路径冲突。
🧹 Clippy
🧹 Lint规则
unnecessary_self_imports 现在会检查嵌套 import,map_unwrap_or 支持 map(f).unwrap_or_default(),legacy_numeric_constants 的修复变为机器可自动应用,并新增对 intra-doc 链接失效的检查——更多问题会被提示或自动修好。
🐛 误报修复
修复多处误报与无效建议:std_instead_of_core 不再建议无法解析的路径、useless_conversion 忽略生成代码中的 From::from、regex_creation_in_loops 依据 MIR 循环结构判断、integer_division_remainder_used 不再在宏中触发、needless_pass_by_value 尊重 inline allow。
🔧 改进
useless_format 的建议更精确,is_in_test 能识别集成测试;clippy::all 被软重命名为 clippy::default,旧写法仍可用但新代码宜采用新名。
🔌 Rust-Analyzer
🆕 新功能
新增对 free 与 associated item 缺失函数体的诊断,并在补全标签详情中渲染 const 值,让开发者在 IDE 内更快发现空实现、确认常量取值。
🐛 Bug修复
修复一批解析与分析问题:属性路径中非首位的 Self、tuple 表达式块上的 inner attribute、#[unsafe()] 无内层 meta、fn 参数列表中的 self::、hover 1f64 被当作整数显示、term search 的类型统一错误,以及扫描 sysroot 中 proc-macro dylib 时不跟随符号链接。
🔧 改进
安装 cargo 工具时使用锁定依赖以保证可复现,并修正 NamedTempFile 构造;内部把 Expr::Unsafe 合并进 Expr::Block 简化 HIR。
📖 rustdoc
🆕 新功能
rustdoc 新增 --print 选项,可直接把生成结果输出到标准输出,便于脚本化处理与调试。
🎨 rustfmt
🐛 Bug修复
修复块文档注释收尾重写不幂等的问题(反复运行会持续改动同一文件),并阻止解析 cfg_select! 分支条目时进入死循环,格式化结果现在更稳定可重复。
📚 标准库
✅ 稳定化
智能指针的 map 系列函数已稳定化,开发者可在 stable Rust 上直接映射 Box、Rc、Arc 等指针内的值,无需 nightly。
🆕 新功能
UniqueArc 与 UniqueRc 的 (try_)map 新增自定义 allocator 支持,使用自定义分配器的项目可以在映射指针内容时保持分配器一致。
🐛 Bug修复
修复 Box 的 map/try_map 在释放路径上的 deallocate 调用,避免析构时使用错误分配器。
🦀 Official
2026 年 Rust 调试调查结果?
超过一半的 Rust 开发者完全不用调试器,而在自认为初学者的受访者中,大约有一半从未运行过调试器。Rust 的年度调查一直把调试列为最痛点之一,首次专门的调试调查(2026 年 2 月收集到 2300 多份回复)给出了具体数字:3% 的受访者因为调试问题离开了 Rust,另有 24% 将其部分归咎于此,而社区文化仍在把大多数人推向 print 语句。报告按专业水平拆解了究竟谁在真正调试、他们会伸手去拿哪些调试器,以及体验在哪些环节不尽如人意。
🛠 Project/Tooling Updates
Rustls 十年?
在 Rustls 首次提交十年之后,其 0.23 版本线已发布 43 个非破坏性版本,没有引入任何破坏性变更,却依然加入了 FIPS 认证密码学、后量子密钥交换与加密客户端问候(ECH)。这种“稳定叠加特性”的平衡在很大程度上由项目外部支撑:CNCF 与 Cure53 资助了第三方审计,ISRG 的 Prossimo 计划则向维护者付费以加速开发。文章回顾了这十年:从 2016 年 5 月的首次提交、四个月后抵达 0.1.0,到共同维护者队伍不断壮大,再到 Rustls 接下来的走向。
📖 Observations/Thoughts
对 Rust 支持良好的微控制器?
受治理的数据运行时代价几何?TeaQL 与 Diesel、SeaORM 在 MusicBrainz 上的对比?
TeaQL 更丰富的运行时模型——保留已加载、空值、未加载三种状态,构建身份一致的对象图,携带查询意图与审计边界——代价出乎意料地小:在 MusicBrainz 的 PostgreSQL 副本上,它在一个五查询图上的成绩落在 Diesel 的 3.4% 以内,并稳定优于 SeaORM。更丰富的 ORM 语义通常意味着要交一笔性能税,而更难的问题是:保持身份的关联加载能否在真实的关系图面前存续。文章走过三种形态迥异的关联形状、那个把任何“快但错”的运行淘汰出局的基数与校验和门禁,以及 MB01 那条七实体、176 次遍历路径背后的生成式类型化请求片段。
稳定 Rust 的 never 类型?
Rust 的 never 类型 !? 长期停留在编译器内部且不稳定,历经两年多的工作,终于在 8 月 24 日稳定下来。为此需要对更早的 Rust edition 做一处小型破坏性变更,因此维护者必须先证明它几乎不会触及真实世界的代码,才能将其落地。文章解释了像 ByteString? 这类不会失败的泛型转换在实践中的价值、它在哲学层面的意义,以及这次变更如何逐步铺开。
借助 SIMD 每秒搜索 150 GiB 文本?
在 2.5 GHz 的 CPU 上,逐字节扫描只有 2.14 GiB/s 的吞吐,而可用内存带宽为 18.70 GiB/s——朴素循环白白浪费了 8.7 倍,因为它是计算受限,而非内存受限。出路是分阶段爬升:SWAR 把目标字节广播到 64 位通用寄存器,每次迭代检测八个字节,达到 9.25 GiB/s,但仍在 64 位寄存器内消耗顺序 ALU 运算。文章梳理了这条演进路径,以及专用 SIMD 执行单元如何突破这一瓶颈,逐步逼近内存带宽的上限。
Async/Await 的设计空间探索?
Async/await 在各处看起来都是同一个特性,但七个现代运行时对同一个平凡程序产出了四种不同结果,而在该程序的三个变体上,没有两个运行时的行为是一致的。共同的承诺是让并发读起来像直线代码,然而 15 年的设计已经悄悄在“什么才算可观测行为”上产生了分歧,而不只是性能差异。论文描绘了九个这样的设计维度,从 Eagerness(调用是立即启动,还是一直冷着直到被 await)开始。
Rust:当空类型不是底类型?
Rust 刚刚为所有类型标注稳定了 !?,但那个被所有人称作“bottom”的类型其实是一个空类型——而类型中含有 !? 的表达式并不一定会强制转换为其他任何类型。这一区别很重要,因为 Rust 的子类型关系只在很窄的场合生效,所以来自底类型语言那套干净的 absurd<A>(x: !) -> A? 故事无法照搬,几乎让每个学到此处的人都感到意外。文章梳理了空类型与底类型的区分、为何空类型不需要子类型而底类型需要,以及强制转换在何处悄悄失效。
📚 Rust Walkthroughs
Rust 的 +simd128 究竟改变了我的 WebAssembly 什么?
Rust 的 +simd128? 标志在整个模块中发出了 205 条 SIMD 指令,然而在被基准测试的那个 Welford 循环里一条都没有落地——标志开了,证据看起来无可辩驳,却仍然不能证明编译器实际生成了什么。这一落差很重要,因为静态指令计数并不等于被执行的功:它说明不了 SIMD 是否真的跑在热路径上,于是“已加速”的构建可以顺利通过评审,而被测量的那个循环依旧停留在标量。文章沿着生成的代码与生成的 JavaScript 调用边界,追踪两个真实循环,用字节完全一致的 LTTB 构建作为阴性对照,并报告了三个独立 Node 进程在 100 万与 1000 万元素规模下的耗时。
Rust 控制流实战——构建一个猜数字游戏?
Rust 完全没有真值或假值概念,这一点会让任何以为它的控制流与其他语言完全一样的人栽跟头。早前的计算器一路直线跑完、没有任何分支,而一个会挑数字、回答偏高还是偏低并不断重试的游戏,需要条件与循环协同工作。文章走过用于比较的 if、让游戏持续运行的 loop、处理输入的 match,以及 break 与 continue,一步步构建出一个猜数字游戏。
反大小化未定大小的值?
游戏架构?
这个 Rust roguelike 明确列出的架构目标之一,是要有一个好的垃圾桶——单个组件必须容易被扔掉和替换,这不是比喻,而是设计要求。在 Rust 中原型化玩法机制很难,因为游戏开发到处都想要可变状态:关卡必须在并行线程中模拟,渲染逻辑必须与游戏逻辑分开运行,所有内容都必须从 toml 文件加载,好让非程序员也能改写剧情。文章梳理了《Leaves of Steel》背后的目标:手工打造的 SDL 引擎、受 Cogmind 启发且把窗口缩放与视图缩放当作一等公民的 UI,以及从生物到赛博格再到机械的单位连续谱。
CUDA Rust 简介:编写 GPU 内核的两条路线?
用 Rust 编写 GPU 内核如今分成两条工具链成本相差悬殊的路线:cutile-rs 运行在稳定版 Rust 1.89+ 与 CUDA 13.3 上,且无需定制 LLVM;而 cuda-oxide 要求锁定版本的 nightly 工具链和它自己的 rustc 代码生成后端。两者都宣称具备编译期内存安全,但其中一个已经跑在 HuggingFace 的 Grout 推理引擎和 mistral.rs 中,另一个还处于早期 alpha 阶段——而 NVIDIA 表示会把 CUDA Rust 培育到 2027 年。文章走过编译为 PTX 的 SIMT 内核、基于 tile 的编程、两种方案各自的安全契约,以及如何运行它们。
2026 年分配器现状——半年之后?
Rust 中的自定义分配器比以往任何时候都更接近稳定,而该 trait 有意只带两个必需方法就发布。多年来围绕恐慌分配器与栈展开的不健全问题迫使语言收紧规则,而缩减后的接口面积反而让 Allocator? 一上来就具备 dyn 兼容性。文章梳理了稳定之后的形态、Vec::new_in? 的用法、为何动态派发并非性能灾难,以及接下来的方向。
可视化 Rust 的虚表:dyn Trait 在内存中如何工作?
用 C++ 的框架去理解 Rust 是个陷阱:用旧语言去读新语言,新语言就会开始显得像是换了语法的 C++,而这恰恰抹掉了它真正革命性的地方。具体案例是多态——C++ 的虚函数把虚表指针放在对象内部并自动派发,Rust 的 dyn Trait 做同样的事,却采用明显不同的内存布局,而作为编译期替代方案的 CRTP 让一对一的比较更加混乱。文章剖析了形状调用 draw() 时内存中实际存在的东西,并附有 GitHub 上的实验。
以每秒 4.75 亿节点安全生成合法国际象棋着法?
一个名为 Watermelon 的 Rust 合法着法生成器在保持内存安全且自包含的前提下达到每秒 4.75 亿节点——作者也承认存在更快的生成器,所以重点在于它拒绝拿什么去交换。国际象棋引擎每次搜索都要生成、执行和撤销数百万个合法着法,而朴素的 64 格棋盘加上不加检查的索引,正是主流快速生成器用速度换来的地方。Watermelon 改把整个局面打包进八个 64 位位棋盘、总计 64 字节,让复杂的查询坍缩成几次廉价的位运算。文章走过位棋盘布局、核心引擎结构、基准对比,以及它如何驱动作者自己的引擎 Strawberry。
加速 ARM64 上的 gearhash(快 2 倍)?
在 0.1.4 版本中,gearhash 获得了 NEON 后端,在 ARM64 的典型分块尺寸下大约快了一倍,并且会在 aarch64 上自动启用,使用者无需任何改动。该 crate 于 2020 年发布时只有 SSE4.2 与 AVX2 路径,因为当时的 ARM64 意味着第一代 Graviton、没有能打的核;Apple Silicon 与后续几代 Graviton 改变了这一点。文章走过如何把论文中的串行 GEAR 滚动哈希转换成 SIMD 实现、内容定义分块的动机,以及实测结果。
从零构建一个压缩器?
八个布尔值以 JSON 表示要占 52 字节,以比特流表示只要 1 字节——信息完全相同,体积小了 52 倍。这种改写技巧之所以成立,是因为格式事先固定,所以像 gzip 的 DEFLATE 这类通用压缩器必须在任意数据中寻找冗余,而已经压缩过的 MP3 依旧占 54 MB,因为已经没有冗余可挤。文章从零构建一个压缩器,走过 DEFLATE 的核心技术,以及为什么有些文件会缩小、有些则不能。
用 Gloo + Yew 实现持久化的 Web 应用状态?
一位 Rust 开发者在项目中途放弃了 Leptos——不是因为缺功能,而是随着应用变大,在各视图之间传递 props 变得难以忍受。他的需求简单而严格:跨浏览器会话保留用户的改动,完全在客户端完成,不依赖任何服务端存储。这直接指向了 localStorage:它按源隔离,并在浏览器重启后依然存活,但 Leptos 的文档只是含糊一提,gloo_storage 自己的文档也只是一句话加上一串结构体列表。文章走过切换到 Yew 与 gloo storage 的过程、按源作用域的持久化实际上如何表现,以及如何接好能活得比一次会话更久的状态。
📦 Crate of the Week
本周 Crate:tokio-rcu?
本周的 crate 是 tokio-rcu,一个专为 async Rust 与 tokio 的语义打造的用户态 RCU 实现。
📌 foundation
Rust/C++ 互操作计划:2026 年 9 月进展更新?
六个月由 Google 资助的专项工程产出了一份包含 40 个 Rust/C++ 互操作问题与用例的清单,其中却只详细分析了 8 个,因为该计划的第一阶段把精力花在定义问题,而不是交付修复。Rust 必须在广泛的编程用例中与 C++ 互操作,而难点不在于编写绑定,而在于就连“什么才算有用的方案”都难以达成共识。进展更新涵盖了问题空间图谱、好方案的评判标准、已有与拟议的方案,以及尚存的解空间。
📌 miscellaneous
Awesome Rust 迁移?
Rust 重写已经悄然成为一门有资金支持的工程学科:Google 正用 Gemini 翻译 giflib 之类的 C/C++ 依赖,DARPA 出资翻译整个 C 语言,CISA 与 NSA 如今也要求厂商发布内存安全路线图。内存安全缺陷仍是 C 与 C++ 中严重漏洞的主体,因此这场运动建立在硬数据之上:Android 的内存安全漏洞占比首次降到总数的 20% 以下,而 Rust 的漏洞密度大约低 1000 倍。文章汇集了迁移遗留代码库背后的证据、案例研究、工具、研究与政策指引。
往期精选
- Rust周刊2026W36 | rustup 1.29.1 更名 target tuple、Wasmi 2.0 提速 2.2 倍、Box map 稳定化、aarch64 FFI 传参修复、Cargo feature 元数据
- Rust周刊2026W35 | never type 稳定化、next solver 登 nightly、arrayref 供应链投毒、min-publish-age 转正
- Rust周刊2026W34 | tokio_with_wasm 入驻浏览器、Cargo 默认 -Zembed-metadata=no、extern “custom” 稳定化、OxiSH 内存安全 SSH
- PHP周刊2026W37 | Symfony 三维护版齐发、Laravel AI SDK 0.11、LSP 服务器上线
- Python周刊2026W37 | asyncio 依赖图修复、内存越界写修补、3.15 默认 UTF-8
- 用 Rust 重写 Bun
扫码关注「右耳朵猫AI」

- 点赞
- 收藏
- 关注作者
评论(0)