Rust周刊2026W38 | mold重写Rust、认证级Rust裸机、Slint 1.18发布、lint提速3133倍

本周主线是Rust向系统底层与安全关键领域的持续渗透。mold作者宣布将这一最快链接器之一从C++重写为Rust;嵌入式侧出现首个通过安全认证的Rust裸机实现,Nvidia与AMD也把Rust推向GPU与边缘AI。工具链稳定了Vec::from_fn与Allocator等API。Slint 1.18引入弹簧动画,Clippy一条lint提速3133倍。

🦀 Rust 工具链更新

🔧 编译器

⚡ 性能优化

本周 compiler 集中优化内存与性能:减少 rustc_builtin_macros 中的克隆、只读取一次 hygiene 数据以加速语法上下文哈希,并将 liveness tracing 的 drop_live_at 改为 DenseBit、DenseBitSet 的字存储改用 Box<Word>。这些改动可降低编译期内存占用并提升增量编译与哈希相关操作的效率。

🔧 改进

增量编译现在会回收旧的编译会话(garbage-collect old incremental compilation sessions),有助于控制长期开发时增量缓存的体积。

📚 标准库

✅ 稳定化

稳定化 Vec::from_fn、core::mem::DropGuard 与 unsafe_cell_access。开发者现在可以直接用函数生成 Vec、借助 DropGuard 简化清理逻辑,并在安全代码中更灵活地访问 UnsafeCell。

🆕 新功能

实现 Thread::os_id,让开发者可获取线程底层的 OS 线程 ID,便于与外部系统或日志体系对接。

⚡ 性能优化

在 Extend 实现中预留容量(reserve items),减少扩容与重复分配带来的开销。

🔧 改进

将 Box 上的大部分 impl 泛化(generalise impls on Box),提升与自定义分配器及类型的兼容性。

🧹 Clippy

🐛 Bug修复

修复 map_clone 在类型改变 coercion 后仍给出建议,以及 collapsible_match 对条件编译代码误报的问题,减少错误建议带来的噪音。

🧹 Lint规则

允许 manual_swap 在 const 上下文中生效,扩展了该 lint 的适用范围。

🔌 Rust-Analyzer

🐛 Bug修复

修复大量 panic 与解析问题,包括无效字段名 JSON、字面量表达式上的文档注释、anon const 的 owner 不匹配、trait solver 自递归、builtin derive 泛型 self 类型的 impls_trait、eager 宏递归溢出,以及文档注释偏移计算错误。IDE 稳定性明显提升。

⚡ 性能优化

向上遍历祖先时缓存宏展开的根节点(cache macro-expanded roots),提升补全与跳转等操作的性能。

🔧 改进

"Implement default members" 不再填充 unstable 方法,避免生成无法编译的实现。

📦 Cargo

🐛 Bug修复

修复多个影响工作流的问题:git CLI 出错时现在会提示哪些配置未被转发、install 默认使用打包的 lockfile、trim-paths 在单个 JSON 文档中正确 unremap 文件。这减少了安装与调试时的困惑。

🧹 Lint规则

将 manual_readme 和 non_kebab_case_bins 的 lint 级别降为 allow,减少对现有项目的告警干扰。

🔧 改进

在 messages 测试中显式指定 --edition,并补充更全面的 workspace 特性统一(feature unification)测试,提升 Cargo 行为的可靠性与回归保障。

📝 新增·更新 RFC

📖 文档改进

修复 RFC 3308 中损坏的 Zig 链接,并修正多篇 RFC 文本中的拼写错误,提升规范文档的可读性与准确性。

🖋️ rustfmt

🐛 Bug修复

修复三处格式化问题:不再把 raw identifier 误当作 raw string 前缀、修正宏内 max_width 的调整、为 inline const block 中的 const 预留宽度。格式化结果更符合预期,减少意外改动。

📋 跟踪 issue

✅ 稳定化

多项功能进入稳定化跟踪:debug_closure_helpers、funnel_shifts、mem::conjure_zst、Result::into_{ok,err}、windows 的 inherit_handles、WebAssembly wide-arithmetic,以及 alloc 的 Allocator trait。稳定后开发者可直接使用这些 API 而无须 nightly。

🆕 新功能

新增 NonZero 转换、为 NumBuffer 实现 Default、允许 thread_local! 中省略 ('static) 生命周期,并新增 Cargo 的 build.profile 与 install.profile 配置。

🔧 改进

讨论改进 CommandExt::exec 中全局环境指针的处理、Index projection 移动检查、一元操作数类型的延迟推断,以及程序运行时同样设置 OUT_DIR;社区流程上允许观察者参与会议、建议与 mods 讨论 LC 候选人。

🛠 Project/Tooling Updates

Slint 1.18 发布

Slint 1.18 为工具包带来 FlexboxLayout,引入了 web 界备受喜爱(或声名狼藉)的布局系统,配有熟悉的 API 与可换行的元素。桌面 UI 框架长期落后于移动端------在那里弹簧动画与弹性布局让界面显得流畅,而开发者却困在僵硬的固定缓动曲线与手动调节 z 序之中。本次发布带来运行时 z 序调整、弹簧动画、基于路径的位移、数组 push/remove/insert 及配套 Model API、可自定义的结构体默认值,以及更精简的编译器,产出更小、构建更快的二进制文件。

📖 Observations/Thoughts

CO3:迈向最优 FFI

一项 Rust 扩展承诺让你跨 FFI 边界导出代码时完全"感觉不到"边界的存在------泛型也不例外。三年多来,从内罗毕的街头到某区块链账本团队,一位开发者一直在追寻一个能统一所有双向互操作尝试的通用模型;他认为现有 FFI 框架只解决了这片空间中的零碎片段,其中的类型映射仍不完整,健全性也常被拿来换取便利。零成本抽象、运行时标记分发、静态参数插值以及 disjoint_impls 变通方案,有望汇聚成一幅完整且健全的愿景,指向语言设计的前沿。

为什么构建一个 Rust LSP 如此困难 · Rust Glancer

构建 Rust LSP 意味着要从残缺的信息中给出有用的答案------看似简单的问题其实很难,而困难的问题则难上加难。自 rust-analyzer 的博客在 2023 年陷入沉寂以来,开发者失去了了解 Rust 工具链真实运作方式的重要窗口,LSP 的内部机制变得不透明且常被误解。本文基于构建实验性 Rust LSP------Rust Glancer------的多年经验,提供一场关于语言服务器如何运作的架构巡览:服务器的两个对立端点、出人意料的注意事项,以及为何构建一个如此困难,意在激发对 LSP 内部机制的求知欲。

用 Verus 开发可证明正确的 Rust 代码

Rust 的类型系统能阻止无数 bug,但"更正确"仍不等于"真正正确"------Verus 能对所有可能的输入机械地加以证明。即便是 Rust,也无法阻止越界访问被写出来、无法保证结果符合你的预期,也无法防止机密信息泄漏;AWS 的 Nitro 隔离引擎在验证不安全代码与并发代码时,遇到的正是这一缺口。你将看到 Rust 风格标注、亚秒级反馈回路与 AI 辅助证明生成如何为真实系统(从证书校验器到 Kubernetes 控制器)带来数学意义上的保证。

快速 Tokio 应用的原则

几乎所有真实世界的 Tokio 应用,其 poll 耗时都远超 Alice Ryhl 建议的 10--100 微秒------这是多数团队直到上生产才注意到的危险信号。由于异步性能取决于那一刻运行时上还在跑什么,因此几乎没有放之四海而皆准的硬性规则,而公平性、批处理、争用与隔离之间的平衡也很难拿捏。文章给出若干通用原则------为延迟而拆分、为吞吐而批处理、更频繁地让出、谨慎使用互斥锁、限制并行度、用多个运行时隔离工作负载------以及那些阻塞执行器其实无妨的例外情况。

📚 Rust Walkthroughs

尝试让一个循环自动向量化

一个看起来显然可以向量化的循环,往往偏偏拒绝向量化,悄无声息地放弃了 4 到 8 倍的 SIMD 吞吐。编译器之所以保守,是因为指针别名、非仿射边界与隐藏的循环携带依赖会阻断这一变换------所以真正的瓶颈在于证明独立性,而非硬件。文章走了一遍诊断流程:阅读向量化报告、重构代码、施加别名提示,并量化究竟是哪一处修改最终解锁了向量化器。

Rust 支持继承吗?支持、不支持、也许------全在同一份文件里

Rust 没有继承,但一个驱动 crate 却能在同一份文件里对这个问题同时回答"支持""不支持"和"也许"。由于 trait 实现无法被继承,两款 SSD168x 芯片变体必须各自重复六个转发方法,把共享的控制器包成内部字段,只为暴露出显式的构造函数。而这正是开发者伸手去够 C++ 式 extends 时所怀念的东西。文章梳理了一个 no_std 电子纸驱动中的具体模式------包装器、trait 默认实现、组合------展示何时该模仿继承,何时该放手。

在不发生符号冲突的前提下交付 Rust 静态库

一个通过了全部测试的 Rust SDK,可能在客户用不同 Rust 版本编译它的那一刻就链接失败------内部的 Rust 符号与依赖符号从 staticlib 中泄漏出去,与使用者自己的一份发生冲突。这正是某团队在交付闭源音频 SDK 时被卡住的原因,尽管他们的封装层工作得完美无缺,而现有工具只在 Windows 上打补丁。文章剖析了这些冲突的成因,并一步步走过 lib-patcher------他们为安全交付预编译静态库而构建的开源工具。

📌 newsletters

Rust 趋势周刊第 82 期------连链接器都在用 Rust 重写

mold 的作者------现存最快的链接器之一------正把它从 C++ 重写为 Rust。这是一位领域专家为指针密集、性能关键的系统代码选择 Rust,而非追逐热潮的新手;这次重写也将被用来检验 Rust 能否比肩 C++ 的速度,而不是以性能换安全。与此同时,GCC 的 Rust 后端迎来里程碑,Wasmi 解释器速度几乎翻倍,但异步 Rust 仍让新手望而却步。本期涵盖这些里程碑,以及一场关于学习曲线的坦诚讨论,并给出粗糙边缘正被逐渐磨平的早期迹象。

嵌入式 Rustacean 第 80 期

嵌入式 Rust 刚刚跨过其迄今最重要的合法性里程碑:全球首个通过安全认证的 Rust 实现跑上了裸机,同时 Nvidia 将 CUDA Rust 正式化,AMD 也把 Rust 推进 GPU 技术栈。多年来开发者一直认为 Rust 无法满足认证级安全要求,也难以打入长期由 C++ 与专有 SDK 把持的厂商锁定 GPU 与边缘 AI 工具链。第 80 期汇总了 zigbee-rs 0.1.0、esp-hal 1.2.0、运行于 Zephyr 1.0.0 的 Arduino Core、边缘生成式 AI、新任项目主管、调试调查,以及生态指南与学习资源。

📌 research

把一条 Clippy lint 优化 3133 倍

一条 Clippy lint 提速了 3133 倍------靠的是直击一个多数开发者以为无解的问题。这条 lint,clippy::nonstandard_macro_braces,用来捕获不合惯用法的花括号写法,比如用 println! {} 而非 println!(),但 Clippy 是在宏展开之后运行的,那时原始的花括号风格已被抹去:Rust 没有定义宏调用映射,要恢复它就得攀爬卫生信息与源码 span。文章一步步走过这场调查,展示跳过冗余工作如何把一次棘手的查找变成巨大且可度量的提速。

📌 rust-walkthroughs_1

Rust 异步可视化指南

Rust 中的每个 await 都只是一个状态机枚举------编译器机械地把异步函数改写成普通函数,其中毫无运行时魔法。但正是这层脱糖成了困惑之源:自引用状态机逼出了 Pin<&mut Self>,又在 poll、Pending 与 waker 之上叠了三层语法糖。这份可视化指南追踪一个极小的程序------读一个名字、打印"ready..."、休眠一秒、问好------并跟踪其编译器 MIR 输出,逐步展示这几行代码实际是如何运行的,终于让 Rust 的异步故事豁然开朗。

Rust 项目------写一个 Redis 克隆------版本 3.0.0

用 Rust 从零构建一个生产级 Redis 克隆,你会比看任何教程都更快地掌握 TCP 服务器、并发客户端与命令处理。多数 Rust 学习者止步于玩具示例,从未触碰真实系统所要求的复制、原子事务或多客户端并发这些混乱现实。本实践指南跟随同名 CodeCrafters 挑战,走过绑定 TCP 端口、搭建服务器,再逐步攻克更难的任务。它涵盖基础挑战加两项扩展------复制与事务------展示你能把一个自建数据库推到多远。

能用 ESP32 作为 STM32 的 SWD 编程器吗(用 Rust)?

一块 ESP32 DevKit 可以替代专用的 ST-Link,作为 STM32F103 Blue Pill 的 SWD 编程器------无需调试探针。麻烦在于 ARM 的串行线调试协议并非即插即用:它只跑在两根双向引脚(SWCLK 与 SWDIO)上,逼得你必须从零实现底层时序与 AP/DP 握手。本教程走通用 Rust 构建一个 SWD 探针,把 ESP32 与 Blue Pill 跨各自独立的 USB 供电轨连接起来,与目标的调试端口通信,并成功读取其 DP IDCODE。

WebAssembly 中的时间与 panic 陷阱:能编译,却在浏览器里崩溃

wasm32-unknown-unknown 没有时钟,因此 SystemTime::now() 能干净地编译、通过所有 CI 检查,然后在浏览器里一运行就 panic。cargo test、cargo check、clippy 与 trunk build 全部显示绿色,因为它们从不真正执行这个 wasm 二进制文件,开发者只能对着 RuntimeError: unreachable executed 或悄悄出错的值发愣,而用户撞上的是一个坏掉的页面。文章走过了构建一个本地优先 Rust 应用时踩中的陷阱,从时间开始,并分享了修复方案,包括用 web-time 平替 std::time。

一把锁定乾坤

真正搞垮长时间运行的 Postgres 迁移的,是悄无声息的客户端空闲超时------而非重复执行------因为空闲连接会在操作进行中丢掉会话级咨询锁。事务级锁会自动释放,而 Kubernetes Job 仍有并发重跑的风险;会话级排他咨询锁则承诺在多个事务之间只有单个迁移实例,但前提是连接不能断。本文借助对锁获取、显式释放与会话清理的 bpftrace 追踪,展示如何观察 PID、把锁接入既有组件,并对遗留数据库安全地运行一次性清理脚本。

死亡运算符:Rust 中的检查算术

在 Rust 中,给 255 这个 u8 加 1 并不会得到 256:debug 构建在溢出时 panic,而 release 构建则悄悄回绕到 0。每种数值类型都有固定位宽,超出其范围的运算结果无法被表示------而 Rust 在不同构建配置下不一致的处理方式,把这个硬性限制变成了潜藏细微 bug 的温床。文章走过二进制表示、溢出究竟如何发生,以及 Rust 提供的 checked、wrapping 与 saturating 算术运算符,用于有意识地处理它。

Rust 泛型:从静态分发到动态分发

你的第一个 GPUI 应用------用 Rust 构建桌面 UI


往期精选


阅读原文

相关推荐
Source.Liu1 小时前
【A11】时间单位与精度设计笔记
rust
是枚小菜鸡儿吖1 小时前
同版式截图批量打码:用华为云码道做一个本地小工具!
人工智能·后端·ai·华为云码道
+VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue图书借阅管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
IT_陈寒2 小时前
Vite这坑我踩了,说说静态资源加载那些事儿
前端·人工智能·后端
我不会起名字3222 小时前
一天一道力扣Hot100(37):深度优先算法--括号生成
java·数据结构·c++·后端·python·算法·go
打工仔折腾 AI2 小时前
数据库上 K8s 之后谁来管?拆解金仓 KES-Operator 的声明式运维方案
人工智能·后端·python·性能优化·ai agent 实战
mldong2 小时前
改了工作流引擎的流程定义,在跑的审批单有的跟着变、有的不变
后端·架构