【Rust日报】2026-10-03 Google 用 Gemini 大规模迁移 C/C++ 到 Rust
内容提要
Google 使用 Gemini 4 Argon 将内部 C/C++ 代码迁移到 Rust,例如 libgav1 的 3.2 万行 SIMD 代码,速度达到原 Rust 移植的 2.7 倍。Rust 1.99.0 稳定了 C 可变参数等 API,Generic Const Arguments 进入 nightly 实现,i686 Windows 目标自 1.100.0 起降为只发布标准库。
延伸解读
AI 迁移的验证流程与风险控制
Google 使用 Gemini 4 Argon 迁移 C/C++ 到 Rust,涉及从 re2、libgav1 到 Fuchsia Zircon 内核的 80 万行以上代码。这些系统改动上线前需经过自动和人工审计、仿真测试和评审。这表明大规模 AI 辅助迁移并非全自动,而是嵌入严格的工程验证流程,以控制内存安全和功能正确性风险。
libgav1 迁移的性能启示
在 libgav1 案例中,Argon agent 替换了 3.2 万行 SIMD 代码,通过多轮按 profile 实验和查看编译器输出,写出能让编译器自动向量化的安全 Rust。最终内存安全解码器的视频输出与原移植一致,速度达到原 Rust 移植的 2.7 倍,更接近优化过的 C++。这说明 AI 可辅助生成高性能安全代码,但依赖迭代优化和编译器反馈。
Rust 1.99.0 的兼容性与 API 变化
Rust 1.99.0 稳定了 C 可变参数函数,支持 extern "C" 和 extern "C-unwind",并引入 VaList 和 VaArgSafe 约束。同时稳定了 Layout::for_value_raw 等原始指针 API,并更新 Box::leak 文档,建议改用 Box::into_non_null 或 Box::into_raw。这些变化影响与 C 交互及底层内存操作,开发者需注意安全要求和未来兼容性。
i686 Windows 目标降级的实际影响
从 Rust 1.100.0 起,i686-pc-windows-msvc 和 i686-pc-windows-gnu 降为只发布标准库,不再提供 host tools。这意味着 32 位 Windows 主机将无法安装工具链,需从 64 位 Windows 等受支持主机交叉编译。背景是 32 位 x86 CPU 已超过 15 年未销售,且构建 i686 工具链存在崩溃和 OOM 问题。其他 32 位平台不受影响。
Q&A
Google 如何使用 Gemini 将 C/C++ 代码迁移到 Rust?
Google 使用 Gemini 4 Argon 的 Argon agent 将内部 C/C++ 代码库迁移到 Rust,规模从 re2、libgav1 等核心库的数万行到 Fuchsia Zircon 内核的 80 万行以上。这些改动上线前需经过自动和人工审计、仿真测试和评审。
libgav1 的 Rust 移植中,Argon agent 做了什么优化?效果如何?
Argon agent 在已有 Rust 移植上替换了 3.2 万行 SIMD 代码,通过多轮按 profile 实验、查看编译器输出,写出能让编译器自动向量化的安全 Rust。结果是内存安全的解码器,视频输出与原移植一致,速度是该 Rust 移植的 2.7 倍,更接近优化过的 C++。
Rust 1.99.0 稳定了哪些主要新特性?
Rust 1.99.0 稳定了 C 可变参数(可在 Rust 中定义 extern "C" 和 extern "C-unwind" 的 C ABI 可变参数函数,类型为 VaList,受 VaArgSafe 约束),非 "C" ABI 的 naked 可变参数函数,以及从原始指针取大小和对齐的安全要求,并稳定了 Layout::for_value_raw、mem::size_of_val_raw、mem::align_of_val_raw 等 API。
Rust 1.99.0 对 Box::leak 的文档更新了什么建议?
文档更新了 Box::leak:不建议之后再把这块内存释放掉。原因是这类写法会和当前以及以后可能的编译器优化互相干扰,自定义分配器稳定后问题更大。文档建议改用 Box::into_non_null 或 Box::into_raw。这条说明也适用于标准库里其他 leak 函数。
Generic Const Arguments (GCA) 是什么?它解决了什么问题?
GCA 是一组 nightly 特性,用来替换自 2021 年 min_const_generics 稳定以来就存在的 generic_const_exprs。它让带泛型参数的更多表达式进入 const 泛型,新支持的表达式要写在 gca! 宏里。稳定版上 const 泛型参数只能是泛型参数本身或完全具体的常量,GCA 扩展了这一点。
GCA 目前支持哪些表达式?有哪些限制?
GCA 的 gca! 宏里可以用泛型参数,但目前不支持算术和函数调用;gca!(1 + 1) 或 gca!(foo()) 会报错,而 { 1 + 1 } 和 { foo() } 可以。gca_adts 支持在 const 泛型里构造结构体、枚举、数组和元组,例如 gca!(TupleStruct(N))、gca!(MyEnum::Record { x: N })、gca!([N1, 12])。数组重复表达式 gca!([N1; 2]) 目前还不支持。gca_const_items 允许 const item 进入类型系统,需要 -Znext-solver。
i686 Windows 目标降级的具体内容是什么?从哪个版本开始?
从 Rust 1.100.0 起,i686-pc-windows-msvc 从带 host tools 的 Tier 1 降为不带 host tools 的 Tier 1;i686-pc-windows-gnu 从带 host tools 的 Tier 2 降为不带 host tools 的 Tier 2。标准库构建仍会分发,编译器等 host tools 不再提供。i686-pc-windows-msvc 作为 Tier 1 目标仍会跑 CI。
为什么 Rust 要降级 i686 Windows 目标?
背景是:只支持 32 位的桌面和服务器 x86 CPU 已经超过 15 年没有销售,通用 32 位 Windows 支持在 2025 年 10 月结束。即使在现代 x86_64 硬件上,构建 i686 Windows 工具链也出过问题:用 i686 MSVC 目标构建的编译器二进制会崩溃,GNU C++ 工具链在构建 LLVM 时会 OOM。对应说明见 RFC 3999 和 MCP 1020。