极速还是虚火?对Rust重写的现实审视

极速还是虚火?对Rust重写的现实审视

💡 原文英文,约2300词,阅读约需9分钟。
📝

内容提要

RIIR(用Rust重写)运动在2026年依然活跃,但需理性看待。Rust在内存安全、性能和并发方面有优势,Linux内核和Windows采用Rust是最大验证。然而,重写会引入新bug,并非所有项目都成功,如Prisma和Loglog Games。二进制体积、平台支持和许可问题是实际挑战。最佳策略是增量扩展而非全面重写,并建立严格测试套件。

🔎

延伸解读

重写并非万能:新bug与失败案例

文章强调,任何重写都会引入新bug,即使是经验丰富的团队也不例外。例如,Cloudflare的unwrap、uutils的日期格式错误、sudo-rs的密码回显,以及Linux内核中Rust代码的首个CVE,都说明了这一点。此外,Prisma、Loglog Games和curl/hyper集成等项目的失败,表明Rust并非所有场景的最佳选择。因此,在决定重写前,需充分评估风险,并建立严格的测试套件。

性能提升的真相:并非全归功于Rust

文章指出,某些Rust重写项目性能提升,部分原因是重写本身带来的优化机会,而非Rust语言特性。例如,uutils的sort因并行归并排序而快于GNU sort,但其他工具可能仅因重写而受益。真正体现Rust优势的是PNG crate,其通过自动向量化和流式DEFLATE解压实现近两倍于libpng的性能。因此,评估性能提升时需区分语言贡献与重写红利。

二进制体积与许可:不可忽视的实践挑战

Rust二进制体积较大,但可通过多调用二进制格式(如uutils)或UPX压缩解决,uutils的多调用二进制甚至小于GNU coreutils。此外,许可选择对项目影响深远:GPL可能限制商业使用,而宽松许可可能引发社区担忧。文章建议根据项目目标和社区做出有意识的选择,而非默认决定。

增量扩展优于全面重写

文章强烈建议采用增量扩展策略,而非全面重写。通过在新组件中使用Rust,同时保留现有代码,可以降低风险并逐步获得收益。uutils的成功也得益于其运行官方GNU coreutils测试套件,目前通过率达92.2%。此外,重写耗时往往超出预期,小项目数月,大项目可达2-5年,因此谨慎规划至关重要。

Q&A

RIIR是什么意思?

RIIR是“Rewrite It In Rust”的缩写,意为“用Rust重写”。它起源于开源社区,在C或C++项目的issue中建议用Rust重写以获得内存安全和性能提升,后来成为Rust社区的一种文化现象。

Rust重写真的能提升性能吗?

有时能,但并非自动。例如,uutils的sort比GNU sort快近4倍,得益于Rust的并发模型实现的并行归并排序;PNG crate比libpng快近两倍,得益于自动向量化和流式DEFLATE解压。但有些性能提升只是因为重写时利用了30年的后见之明,而非Rust本身。

Rust重写有哪些风险?

主要风险包括:重写会引入新bug,即使有经验的团队也会犯错;二进制体积较大;平台支持和与其他语言的互操作可能存在问题;许可选择可能影响项目采用;重写耗时可能远超预期。

Rust重写的最佳策略是什么?

最佳策略是增量扩展而非全面重写。即保留现有代码,用Rust添加新组件,这样风险更低。如果必须重写,应建立严格的测试套件,如uutils使用GNU coreutils官方测试套件来跟踪兼容性。

Rust在Linux内核和Windows中的采用情况如何?

Rust在Linux内核中已不再是实验性,2025年维护者峰会宣布实验成功;Rust也已在Windows内核中运行。这被认为是RIIR运动最大的验证,Rust运行在数十亿设备上。

有哪些Rust重写失败的案例?

Prisma从Rust查询引擎迁移回TypeScript,因为技能差距、部署复杂性和运行时问题;Loglog Games在三年游戏开发后放弃Rust,因为迭代速度慢;curl/hyper集成在95%完成时被放弃,因为最后5%的难度和社区动力不足。

Rust二进制体积大的问题如何解决?

uutils通过多调用二进制格式解决,将所有工具编译成一个二进制,通过符号链接调用,体积从73MB降至13.8MB,甚至小于GNU coreutils的18.4MB,再用UPX压缩可到5MB。

Rust重写时如何选择许可证?

许可证选择有后果:更严格的GPL可能排除无法引入copyleft依赖的专有项目;更宽松的许可证可能招致开源社区批评,担心公司使用代码但不回馈。没有普遍正确的答案,取决于项目目标和社区,但应有意识地决定而非默认。

🏷️

标签

➡️

继续阅读