程序员上手 Rust 2 年后感悟:它的确强大,但想要取代 C 还远着呢

张开发
2026/4/21 12:36:14 15 分钟阅读

分享文章

程序员上手 Rust 2 年后感悟:它的确强大,但想要取代 C 还远着呢
作者 | Nabil Elqatib译者 | 平川策划 | 刘燕本文最初发布于 Nabil Elqatib 的个人博客。接触 Rust 开发快两年了。我觉得回顾下自己在这个过程中的一些感想和汲取的经验教训应该会很有趣。下图是我第一次向一个 Rust 存储库提交代码。虽然时间是 2021 年 1 月但彼时我接触 Rust 已经有几个周了。初识 Rust在 2020 年 12 月找到一份新工作之前我早就听说过 Rust。以我嵌入式开发的视角看我认为 Rust 是一种现代而强大的语言最终可能成为 C/C的合法继承者。我隐隐有一种担优我可能会错过一个新时代的开始。剧透事实证明Rust 并没有取代 C/C不过它正在稳步增长。它越来越受开发人员欢迎甚至谷歌也对它怀有浓厚的兴趣。我的感受首先需要声明一下我没有正式学习过 Rust。相反我只是通过开发、阅读代码和来回翻阅文档来学习。回想起来我认为这并不是一个好的做法。我坚信在实际使用这门语言进行开发之前必须花一些时间利用官方提供的学习资料来快速地理解这门语言、它的哲学和生态系统。Rust 的学习曲线比较陡峭我记得Rust 是作为一种强类型语言向人“推销”的它承诺提供强大的工具通过在编译期间跟踪对象生命周期和所有引用变量的作用域来防止内存安全 Bug见下一小节。Borrow-checker 出场在使用静态类型和Rc以及其他微妙的语言构件处理多个 crate 时这个看起来非常简单的想法Rust 文档中关于这部分的内容非常全面变成了一场噩梦。当时我很难理解这个新概念最容易钻的空子是不断地克隆变量这样做不好特别是在处理大型数据结构时而且还有一个副作用就是使我花了更多的时间才最终掌握它。幸运的是编译器提供了非常有用的提示和文档链接我必须说它们非常有用。Cargo 不是一个严谨的验证工具这是一个非常普遍的误解是我最近与一位非 Rust 工程师同事聊天时了解到的。在他看来Rust 程序因为运行时内存越界故障而恐慌panic是不可想象的。遗憾的是Cargo 编译器并不是一种包治百病的灵丹妙药显然欺骗它成功编译只会在运行时失败的程序很容易。下面这个例子使用了一种非常常见的 Rust 数据结构let mut v vec![]; v.push(0); v.clear(); let _ v[0]; // panics或者更棘手let mut v Vec::new(); #[cfg(target_os windows)] v.push(a); let _ v[0]; // panics在编译时检测越界访问需要对代码进行更深入的分析这可以显著降低编译速度在我看来编译时间已经太长了。Rust 可能会让人捉摸不透这一节和我最近观察到的一个行为有关。我们的团队发现在特定条件下生产环境中的其中一个 crate依赖项的依赖项开始出现恐慌。简单来说就是当与rustls-tls-native-roots特性一起使用时如果系统证书损坏那么特定版本的reqwest会引发错误和恐慌。这让我很惊讶因为它使得处理依赖关系多了几分风险。尽管现在大多数 crate 都是开源的但人们也不能为了评估使用“风险”而把所有源代码都检查一遍。而且大多数 crate 的文档比较糟糕也没法提供很好的支持。有一个类似于 cargo tree 的工具可以分析项目的依赖关系让开发人员可以概览容易出现恐慌的 crate会非常有帮助。习惯上快速处理这个问题的一个替代方法是重写 Rust 的panic_handler但很遗憾这只有在#! 项目中才有可能。程序的二进制文件可能会很大说到来自嵌入式世界的no_std这是我特别感兴趣的一个点。我还没有机会为内存有限的低端设备和外设编写 Rust 代码。尽管这现在不是我关心的问题但 Rust 二进制文件的开销确实非常大。我读过一些关于这个话题的博客和论文特别是 Jon Gjengset 的视频非常有趣因为他们概要介绍了一个真实的实践过程。但我想说的是对于内存有限的目标设备Rust 要成为 C 语言的有力竞争者还有很长的路要走。我觉得在#! 领域Rust 还需要找到一种方法来提供可行的恐慌处理程序库不再依赖开箱即用的格式化函数因为它们非常消耗内存。James Munns的这篇文章让我大开眼界。Rust 工具有很棒的互操作性这点也给我留下了深刻的印象。我参与过一个项目包含 900K行与 Rust 互操作的 C 代码。这并没有多难因为 Rust 让这个过程变得非常简单而且因为有许多 crate 和示例这个用例似乎也已经比较完善。借助 FFI 机制为外部代码编写 Rust 绑定也相对简单我不能说所有语言但 C 语言家族C/ C /Objective-C都得到了很好的支持。这不是说没有多少工作要做了因为你还需要编写一些“管道”代码来把所有东西串联起来这有代价但我认为相当低。此外Rust 坚持自己的哲学要求将可疑的底层代码声明为不安全的这一点很好实际上基本上所有 FFI 函数都是不安全的因为 Rust 无法控制用另一种语言编写的代码。Rust 很强大最后说一个积极的方面。Rust 是一种非常丰富的语言有可能让系统编程取得巨大的进步。严格的所有权和借阅有助于确保数据访问安全高效。它的现代语法和设计使得开发人员更容易理解和使用这门编程语言的软件模式和最新范式。此外虽然说的不多但 Rust 在线程并发运行方面做得非常好可以保证不出现竞态条件及类似问题。小结我真的很喜欢 Rust 开发。如果在 2020 年甚至 2022 年要选择一种新的软件开发语言那么我一定会毫不犹豫地选择 Rust。我看到了它的巨大潜力希望接下来的几个月里它可以获得嵌入式系统世界的更多关注。最近发布的 Rust Linux 内核模块显示出了其广阔的前景和光明的未来。就我个人而言我希望更多地参与塑造 Rust 的未来为它的软件做出贡献同时不断学习它的概念及那些纷繁芜杂之处。声明本文为 InfoQ 翻译未经许可禁止转载。原文链接https://n-eq.github.io/blog/2022/11/01/rust-fiddling-2-years

更多文章