写点什么

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

  • 2022-12-05
    北京
  • 本文字数:2263 字

    阅读完需:约 7 分钟

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

本文最初发布于 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] 项目中才有可能。

程序的二进制文件可能会很大

说到来自嵌入式世界的no_std,这是我特别感兴趣的一个点。我还没有机会为内存有限的低端设备和外设编写 Rust 代码。尽管这现在不是我关心的问题,但 Rust 二进制文件的开销确实非常大。


我读过一些关于这个话题的博客和论文,特别是 Jon Gjengset 的视频,非常有趣,因为他们概要介绍了一个真实的实践过程。但我想说的是,对于内存有限的目标设备,Rust 要成为 C 语言的有力竞争者还有很长的路要走。我觉得,在#![no_std] 领域,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

2022-12-05 10:0014457
用户头像
刘燕 InfoQ高级技术编辑

发布了 1123 篇内容, 共 602.8 次阅读, 收获喜欢 1982 次。

关注

评论

发布
暂无评论
发现更多内容

【高并发】你知道吗?大家都在使用Redisson实现分布式锁了!!

冰河

并发编程 多线程 高并发 异步编程 6月月更

24小时无人自助洗车要如何加盟?

共享电单车厂家

自助洗车加盟

看完这篇异地多活的改造,我决定和架构师battle一下 / 得物技术

得物技术

架构 容灾 双活 双活容灾 异地多活

孩子上网冲浪更安全,这份儿童节礼物值得拥有

最新动态

DataPipeline:让数据生产力的历史进程,再前进一步

DataPipeline数见科技

DataOps 数据管理

字节跳动数据库的过去、现状与未来

火山引擎开发者社区

数据库 微服务 分布式数据库

移动端异构运算技术-GPU OpenCL编程(进阶篇)

百度Geek说

2022云原生网络趋势 | K8s托管整个基础设施、多云、边缘计算、安全等场景,将云原生网络带向新战场

York

云原生 网络 Kube-OVN cni 6月月更

哪些人比较适合加盟自助洗车

共享电单车厂家

加盟自助洗车

为什么PO的角色在Scrum框架中不可替代

ShineScrum

Scrum 产品经理 PO 产品负责人

从冬奥跳台飞跃向千家万户:联通“臻宽带”的起跳瞬间

脑极体

自助洗车机还能加盟你不知道吧?

共享电单车厂家

自助洗车机 自助洗车加盟

有了这个云端Mock功能,你的简历起码提升30分!

Liam

前端 Postman 前端教程 API文档 前端工具

InfoQ 极客传媒 15 周年庆!无限生长未来可期!

InfoQ写作社区官方

热门活动 InfoQ极客传媒15周年庆

那些年,我们在Apache SeaTunnel 2.1.0部署中踩过的坑【含源码分析】

Apache SeaTunnel

Apache 大数据 开源 workflow Seatunnel

博睿数据拨测入场加速广电深度融合

博睿数据

智能运维 博睿数据 智慧广电

洗车行业前景好不如开个自助洗车店

共享电单车厂家

自助洗车加盟 开自助洗车店

将不费吹灰之力成为卷王的秘籍传授于你!

龙智—DevSecOps解决方案

Jira插件 龙智自研插件 Jira飞书插件

特别的儿童节,OceanBase 送上一份特别的惊喜

OceanBase 数据库

oceanbase

顶级好用的 React 表单设计生成器,可拖拽生成表单

蒋川

低代码 开发工具 React 表单 组件

6元自助洗车机一般都什么价位

共享电单车厂家

自助洗车加盟 6元自助洗车机

关键点标注的酷炫,你想象不到

澳鹏Appen

人工智能 数据标注 数据训练 关键点检测 关键点

C#入门系列(一) -- 初识C#语言

陈言必行

C# 6月月更

了解es6语法简介

小恺

6月月更

将虚幻引擎5与Perforce Helix Core集成使用吧!

龙智—DevSecOps解决方案

perforce 虚幻引擎5 Helix Core

Redis 忽然变慢了如何排查并解决?

码哥字节

redis Redis 核心技术与实战 6月月更

八大误区,逐个击破:担忧安全防护与合规性?这可能是您对云最大的误解

龙智—DevSecOps解决方案

Atlassian atlassian云版 Atlassian白皮书

展示 Postlight 的 WordPress + React Starter Kit

海拥(haiyong.site)

WordPress 6月月更

OpenHarmony 3.1 Release版本关键特性解析——OpenHarmony新音视频引擎——HiStreamer

OpenHarmony开发者

Open Harmony

雅加达利用SAS优化抗疫救助资金发放,帮助中小微企业度过难关

E科讯

使用Sonar来优化您的基础架构代码

龙智—DevSecOps解决方案

漏洞 SonarQube

程序员上手 Rust 2年后感悟:它的确强大,但想要取代C还远着呢_AI&大模型_Nabil Elqatib_InfoQ精选文章