QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

程序员上手 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:0012245
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 544.2 次阅读, 收获喜欢 1978 次。

关注

评论

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

文心4.0,启动大模型时代的飞轮效应

脑极体

AI

Disruptor在流程编排中的应用与探索

ZA技术社区

金融科技 众安保险 ZA技术社区 keji

消除隐患 防患未然|AIRIOT智慧消防管理解决方案

AIRIOT

通过观测云快速了解真实用户体验

Yestodorrow

可观测性 用户增长 业务增长 真实用户体验

被誉为轻量云服务器“鼻祖”的腾讯云,遇到最硬核对手

平平无奇爱好科技

语音识别技术的挑战与机遇再探讨

来自四九城儿

“创新启变 聚焦增长”极狐(GitLab)媒体沟通会,共话智能时代软件开发新生态

Geek_2d6073

跬智信息(Kyligence)入选 IDC《中国数据智能市场生态图谱V4.0》

Kyligence

数据分析 指标平台

低代码:时代的选择

树上有只程序猿

低代码 低代码开发平台

大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求

汀丶人工智能

人工智能 计算机视觉 GPT 大语言模型

等不及了,2023云栖大会精彩剧透提前看!

阿里云CloudImagine

云计算 云栖大会

大模型背景下软件工程的机遇与挑战

CODING DevOps

快收藏!中小电商企业必用的ERP软件ODooo“奶妈级”教程来了

平平无奇爱好科技

稳定币揭幕:了解发展策略

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 链游开发 NFT开发

腾讯云发布新品数据编排平台(dop)-与大数据生态紧密结合,提供通用数据编排服务

腾讯云大数据

大数据

敏捷思维和免费敏捷管理工具

顿顿顿

敏捷项目管理 敏捷开发管理工具 scrum工具 scrum敏捷工具 敏捷开发工具

想做跨境电商不知道如何搭建网站?看这篇教程就够了

平平无奇爱好科技

Generative AI 新世界 | 大模型参数高效微调和量化原理概述

亚马逊云科技 (Amazon Web Services)

人工智能 机器学习 生成式人工智能 Amazon SageMaker 大语言模型

主打一个遥遥领先,这款轻量应用服务器真是太“硬”了

平平无奇爱好科技

数字化转型与架构-架构设计篇|系统组件有哪些?

数字随行

数字化转型

软件测试/测试开发丨深入了解性能测试:方法、工具和最佳实践

测试人

软件测试 性能测试 测试开发

阿里内推强推的并发编程学习笔记,原理+实战+面试题,面面俱到!

小小怪下士

Java 程序员 并发编程

TiDB 7.4 发版:正式兼容 MySQL 8.0

编程猫

网络安全(黑客)自学方向

网络安全学海

程序员 黑客 网络安全 信息安全 渗透测试

2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备, arr[i]表示i号设备的型号,型号的种类从0~k-1,一共k种型号, 给定一个k*k的矩阵map,来表示型号

福大大架构师每日一题

福大大架构师每日一题

Acrobat Pro DC 2023(PDF编辑软件)mac/win

iMac小白

Acrobat DC 2023 PDF编辑软件 Acrobat DC 2023破解版 Acrobat DC 2023下载

软件开发“自我毁灭”的七宗罪

高端章鱼哥

计划 软件开发

9款好用的在线流程图软件推荐!

彭宏豪95

效率 流程图 在线工具 科技 流程图绘制

使用指南|如何将 GreptimeDB 数据保存在阿里云 OSS

Greptime 格睿科技

数据库 阿里云 云原生 Greptime GreptimeDB

语音识别技术:端到端的挑战与解决方案

来自四九城儿

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