当前位置: 首页 > article >正文

程序员上手 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

相关文章:

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

作者 | Nabil Elqatib 译者 | 平川 策划 | 刘燕 本文最初发布于 Nabil Elqatib 的个人博客。 接触 Rust 开发快两年了。我觉得,回顾下自己在这个过程中的一些感想和汲取的经验教训,应该会很有趣。 下图是我第一次向一个 Rust 存储库提交代码。虽然时间是…...

2025届最火的五大降重复率神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 用于极大助力写作的辅助工具一键论文生成器,借助先进智能算法与自然语言处理技术…...

从Ubuntu双系统到形变图:手把手搞定StamPS+SBAS完整流程(含ISCE安装避坑指南)

从Ubuntu双系统到形变图:手把手搞定StamPSSBAS完整流程(含ISCE安装避坑指南) 当第一次接触InSAR处理时,最令人头疼的往往不是算法原理,而是软件环境的搭建。本文将带你从零开始,在Ubuntu双系统环境下完成St…...

从模型转换到性能评估:用RKNN-Toolkit v1.7.1跑通Mobilenet-V1完整流程实录

从模型转换到性能评估:RKNN-Toolkit v1.7.1实战全流程解析 在边缘计算领域,瑞芯微的NPU平台凭借其出色的能效比和性价比,正成为越来越多AI应用的首选硬件。而RKNN-Toolkit作为连接算法模型与硬件NPU的桥梁,其重要性不言而喻。本文…...

Hearthstone-Script终极指南:如何用Java/Kotlin打造智能炉石传说自动化脚本

Hearthstone-Script终极指南:如何用Java/Kotlin打造智能炉石传说自动化脚本 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 在炉石传说这款…...

从“拒绝访问”到注册成功:深度复盘Win10/Win11下MSCOMM控件安装的全流程避坑指南

从“拒绝访问”到注册成功:Win10/Win11下MSCOMM控件安装全流程避坑指南 当你在Windows 10或11系统上尝试运行某个老旧的工控软件或VB6程序时,突然弹出一个令人沮丧的错误提示:"没有注册类(MSCOMM)"。这个看似简单的错误背后&#x…...

GitHub 中国区前100名,哪些是真开发者?哪些是Markdown工程师?

GitHub 中国区前100名,哪些是真开发者?哪些是Markdown工程师? 大家好,我是彪哥, 本次分析的数据来源于开源项目《中国区 GitHub 用户排行榜》, 仓库数据及分析来自开源工具《悟空 GitHub 数据分析工具》&am…...

为什么你的技术演示应该告别手动排版?md2pptx让PPT制作变得简单高效

为什么你的技术演示应该告别手动排版?md2pptx让PPT制作变得简单高效 【免费下载链接】md2pptx Markdown To PowerPoint converter 项目地址: https://gitcode.com/gh_mirrors/md/md2pptx 还在为技术演示的格式调整而头疼吗?md2pptx是一款开源的Ma…...

5个场景让你的Mac音质焕然一新:eqMac音频均衡器完全指南

5个场景让你的Mac音质焕然一新:eqMac音频均衡器完全指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer 🎧 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 还在为MacBook音质平平而烦恼?无论是视…...

从RSA加密到同余方程:手把手教你用扩展欧几里得算法求乘法逆元(附Python代码)

从RSA加密到同余方程:扩展欧几里得算法实战指南 在计算机科学和密码学领域,模逆元是一个看似简单却至关重要的概念。想象一下,你正在设计一个安全通信系统,或者解决一个算法竞赛中的数论问题,突然遇到了这样一个等式&a…...

【花雕学编程】Arduino BLDC 之6.5 寸轮毂电机自动跟随底盘的几种典型控制逻辑

基于 Arduino 平台控制 6.5 寸 BLDC(无刷直流)轮毂电机实现自动跟随底盘,是机器人开发中非常经典且实用的场景。6.5 寸轮毂电机因其集成了电机、减速箱和轮毂,具备大扭矩、结构紧凑的特点,非常适合此类应用。这里梳理了…...

实时操作系统(RTOS)核心原理与嵌入式开发实践

1. 实时操作系统与嵌入式系统编程概述在工业自动化、航空航天和医疗设备等关键领域,嵌入式系统必须对事件做出及时响应。实时操作系统(RTOS)作为这类系统的核心软件平台,其设计哲学与传统通用操作系统存在本质差异。我曾参与过一款…...

从Python打包exe到逆向分析:一次搞定pyinstxtractor和uncompyle6的使用

Python逆向工程实战:从打包exe到源码还原的完整指南 逆向分析Python打包的exe文件是一项兼具挑战性和实用性的技能。无论是安全研究人员、开发者还是技术爱好者,掌握这项技术都能让你在面对未知Python程序时游刃有余。本文将带你深入探索Python逆向工程的…...

嵌入式系统与CPS核心技术解析与应用实践

1. 嵌入式系统与信息物理系统概述1.1 基本概念与技术特征嵌入式系统是以专用计算机为核心,嵌入到对象体系中完成特定功能的智能化电子系统。与通用计算机系统不同,嵌入式系统具有三个显著特征:专用性:针对特定应用场景优化设计&am…...

别再用Sigmoid了!聊聊ReLU和LeakyReLU如何拯救你的深度网络训练

别再用Sigmoid了!聊聊ReLU和LeakyReLU如何拯救你的深度网络训练 深夜调试模型时,你是否遇到过这样的场景:损失函数曲线像被冻住一样纹丝不动,反向传播的梯度在深层网络中逐渐"消失"?这很可能是因为你还在使用…...

Adobe-GenP 3.0终极指南:一键快速激活Adobe CC全系列软件的完整教程

Adobe-GenP 3.0终极指南:一键快速激活Adobe CC全系列软件的完整教程 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 你知道吗?对于创意工作者…...

Windows电脑无法识别iPhone?终极解决方案:Apple-Mobile-Drivers-Installer

Windows电脑无法识别iPhone?终极解决方案:Apple-Mobile-Drivers-Installer 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地…...

从实验报告到项目实战:用Verilog在ISE里复现南邮数电实验(含全加器、数据选择器源码)

从实验报告到FPGA实战:Verilog数字电路工程化指南 引言:跨越理论与实践的鸿沟 实验室里的波形图和课堂上的逻辑表达式,如何变成真正可运行的硬件电路?这是许多电子工程专业学生面临的第一个工程化挑战。去年指导毕业设计时&#x…...

019、未来展望:IPFS、暗网与去中心化互联网的融合趋势

当内容寻址遇见匿名路由 IPFS的核心是内容寻址(CID),暗网(以Tor为例)的核心是匿名路由。二者在协议层本无直接关联,但在实际部署中却产生了有趣的互补。传统IPFS网络依赖公共DHT和引导节点,这些…...

技术书籍解毒指南:90分钟吸收法

在软件测试领域,技术迭代的速度常令从业者感到焦虑。从传统的手工测试到自动化测试,再到如今与DevOps、云原生、AI结合的智能测试,知识体系不断膨胀。《持续交付》《Google软件测试之道》《软件测试的艺术》等经典著作虽被奉为圭臬&#xff0…...

告别libpng!用这个轻量级C库lodepng,5分钟搞定PNG图片解码(附完整代码)

轻量级PNG解码实战:5分钟用lodepng替代libpng的完整指南 在嵌入式开发和资源受限环境中,处理PNG图像一直是个令人头疼的问题。传统方案如libpng虽然功能强大,但动辄几百KB的库体积和复杂的API让许多开发者望而却步。我曾在一个物联网门禁项目…...

GitHub Profile优化:软件测试工程师的吸引力法则与专业品牌构建

在数字化浪潮席卷全球的今天,GitHub早已超越了其作为代码托管平台的最初定位,演变为技术从业者展示专业能力、构建行业影响力的核心舞台。对于软件测试工程师而言,一个精心优化、内容充实的GitHub Profile不仅是技术实力的“数字自白书”&…...

用 Coze 搭建 RAG 问答助手:完整实战(以“问史通”为例)

一、项目背景 最近我用 Coze 搭了一个中国近现代史问答助手——问史通。 它的目标很明确:基于知识库检索结果回答问题,而不是自由发挥。这样做的好处是: 回答更聚焦,适合课程学习与知识问答能把回答范围限定在上传资料内&#xff…...

技术决策框架:避免选择瘫痪

在软件质量保障领域,我们测试工程师常常发现自己置身于一个充满技术选择的十字路口:是引入Selenium还是Cypress进行UI自动化?性能测试该用JMeter还是LoadRunner?API测试框架选RestAssured还是Postman Newman?面对层出不…...

Word报告自动化:用poi-tl的Markdown插件优雅生成多级标题并自动更新目录(Office版)

Word报告自动化:用poi-tl实现Markdown式标题管理与智能目录生成 在技术文档编写领域,我们常常陷入这样的困境:内容创作者更习惯用Markdown的简洁语法表达结构,而最终交付却不得不妥协于Word的复杂样式调整。poi-tl的MarkdownRende…...

从一个小D触发器开始:手把手带你用Quartus Prime Power Analyzer完成你的第一个芯片功耗评估报告

从D触发器到功耗分析:Quartus Prime Power Analyzer实战指南 在FPGA设计流程中,功耗分析往往是被初学者忽视却又至关重要的一环。想象一下,你精心设计的电路在仿真时表现完美,但实际部署后却因为功耗问题导致发热严重或电池续航大…...

YouTube API配额总不够用?手把手教你优化搜索请求,把1万次配额用到极致

YouTube API配额优化实战:如何将1万次配额效率提升300% 当你开发的视频分析工具突然因API配额耗尽而瘫痪,或是眼睁睁看着精心设计的功能因配额限制被迫降级——这种场景对使用YouTube Data API的开发者来说再熟悉不过。每日1万次的默认配额看似充裕&…...

Blender 3.6+ 渲染救星:一个节点组合搞定玻璃的‘油腻感’,让你的渐变材质瞬间干净

Blender 3.6 渲染救星:一个节点组合搞定玻璃的‘油腻感’,让你的渐变材质瞬间干净 你是否曾在社交媒体上看到别人渲染的玻璃材质清澈透亮,而自己的作品却总是雾蒙蒙一片?那种"油腻感"让本该晶莹剔透的玻璃看起来像是蒙了…...

别再只盯着代码了:从‘未知的大猩猩’看技术人的认知盲区与学习路径设计

技术人的认知盲区:如何发现并驯服你代码之外的"大猩猩" 在技术领域深耕多年的开发者们,往往会对自己的专业能力充满信心——直到某个深夜,生产环境突然崩溃,而你发现根本看不懂日志里那些陌生的错误堆栈;或是…...

终极Navicat重置脚本:macOS环境下14天试用期无限重置完整指南

终极Navicat重置脚本:macOS环境下14天试用期无限重置完整指南 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 对于…...