【Rust日报】2026-11-04 换个字段顺序就能编译
内容提要
本期Rust社区动态包括:有帖子展示结构体字段顺序可绕过trait求解器溢出,评论指出这与Sized约束及blanket impl有关;rustc_codegen_gcc在AArch64完成rustc自举,UI测试增至7958项;gccrs十月补充107个intrinsic,并推进外部crate路径解析与类型检查;Formal Web用Vello/Wgpu构建多进程网页引擎,可更换JS引擎,并与Servo、Blitz对比。
延伸解读
字段顺序影响编译的机制
文章指出,结构体字段顺序会改变 trait solver 的行为。当最后一个字段是 i32 时,S 满足 Sized,solver 能对 A<S> 应用 blanket impl 得到 (),从而打破循环;若最后一个字段是 unsized,则无法走通。评论进一步说明,只有末尾字段可以是 unsized,且循环源于 blanket impl 上隐含的 T: Sized 约束。
绕过限制的临时方案与长期方向
作者给出的临时办法是调换字段顺序,或在只有一个字段时在末尾补一个空的 ()。评论提到,即使把 GAT 写成 type A<T: Trait>: Sized 也不能打断循环。nightly 上可通过 #![feature(sized_hierarchy)] 让 Trait: PointeeSized 并实现 impl<T: PointeeSized> Trait for T,这样 i32 在前也能编译。
rustc_codegen_gcc 自举进展
报告显示,rustc_codegen_gcc 在 AArch64 上完成了 rustc 全量自举,依赖两个 Rust 仓库 PR 和 sret ABI 实现。UI 测试通过数从 7699 增至 7958,失败数从 21 降到 17。项目已迁到 josh-sync 以减轻同步负担,下一步是修已知问题、补测试,然后进行 crater run。
gccrs 十月进展与剩余障碍
gccrs 十月补上 107 个缺失 intrinsic,以对齐 rustc 行为,core 编译依赖它们。外部 crate 路径解析正在推进,并新增多 crate 测试防回归。类型检查还剩递归类型和 slice intrinsic 上的 bug,这是完整编译 core 前的主要障碍。11 月计划继续类型检查和后端,并开始实现 Linux 内核 alloc crate 需要的 CoercePointee。
Q&A
为什么在Rust中调整结构体字段顺序就能解决trait求解器溢出错误?
因为结构体的最后一个字段可以是unsized类型,而其他字段必须是Sized。当最后一个字段是i32(Sized)时,编译器可以推导出整个结构体是Sized,从而将blanket impl应用到GAT上,打破循环约束;如果最后一个字段是unsized,则无法应用blanket impl,导致溢出。
rustc_codegen_gcc在AArch64上自举rustc有什么进展?
2026年11月,rustc_codegen_gcc在AArch64上完成了rustc的全量自举,这依赖于两个Rust仓库PR和sret ABI的实现。UI测试通过数从7699增加到7958,失败数从21降到17。下一步是进行crater run。
gccrs在十月份主要完成了哪些工作?
gccrs在十月份补上了107个缺失的intrinsic,并推进了外部crate的路径解析和类型检查。还增加了多crate测试以防止回归。类型检查还剩递归类型和slice intrinsic上的几个bug。
Formal Web网页引擎与Servo和Blitz的主要区别是什么?
Formal Web的图形栈是多进程的,使用Vello和Wgpu,GPU操作在单独进程中;JavaScript引擎可替换(默认V8,也支持Boa和Nova);在Apple平台上可接Core Animation和IOSurface。而Servo的图形栈没有将GPU操作放入单独进程,底层是OpenGL;Blitz没有做进程隔离,也不能替换JavaScript引擎。
在Rust中,为什么同一个x.abs()调用两次会返回不同的结果?
因为第一次调用时编译器尚未确定x的具体类型,走了自定义trait impl中返回42的abs方法;加上let _: i64 = x;类型标注后,编译器确定x为i64,第二次调用走标准库的i64::abs,返回5。
gccrs项目目前距离编译实际有用的程序还有哪些障碍?
gccrs还需要解决类型检查中的递归类型和slice intrinsic上的bug,这是完整编译core之前剩下的障碍。此外,还需要实现CoercePointee特性(Linux内核alloc crate需要),并继续完善后端。