您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 百科

从 C++ 切换到 Rust,工作体验大幅提升!

时间:2023-03-28 10:57:54  来源:CSDN  作者:

【CSDN 编者按】开发者 Nikita Lapkov :从 C++ 切换到 Rust 后,日常工作体验得到了极大地提升。

原文链接:https://laplab.me/posts/switching-from-cpp-to-rust/

作者 | Nikita Lapkov 译者 | 弯月

责编 | 王子彧

出品 | CSDN(ID:CSDNnews)

我从事专业的 C++ 编程工作已经四年多了,然而,三个月前我找到了一份新工作需要使用 Rust。我想通过本文,分享一下我个人关于在两种语言之间切换的经验和想法。

声明:本文不打算比较 C++ 和 Rust,文中的观点源自个人的经历。

C++ 和 Rust 的工作介绍

我认为,个人从事的工作会极大地影响对语言的体验,下面我来简单介绍一下背景。

我使用 C++ 大多从事的是编写数据库的工作。数据库不是常见的应用程序,通常它们独占服务器,可以使用大量的系统调用,而且在有些情况下甚至可以完全绕过内核。另一方面,这意味着数据库是研究特定语言的一个有趣的样本,因为你需要关注性能,为客户提供良好的用户体验,同时还需要保证正确。

鉴于公司的保密协议,所以我不能分享工作细节。我运行 Rust 的环境是具有高负载和高标准性能要求的数字运算异步服务器。它有点类似于数据库,但用户体验可能并不那么重要。

就本文而言,我认为这两者非常相似。

反复谈及的方面

Rust 具有良好的内存安全保证。这个话题已被反复讨论,所以不在此赘述。虽然我已经使用 C++ 四年多了,但即便是已经过审查和合并的代码,偶尔也会遇到内存问题引发的服务器崩溃。很难说有多少这样的代码进入了生产环境,因为人们只是在发生段错误时重新启动服务器。模糊测试确实可以确保覆盖一些奇怪的案例,但终究不是灵丹妙药。总的来说,我认为交付 Rust 代码比 C++ 代码更安心。

构建系统

在日常工作中,最令我厌烦的工作莫过于构建 C++ 代码。作为一名开发人员,我希望能够编写一个简短的命令来构建整个项目。“在构建服务器之前,你只需要运行这两个命令……”,这句话简直太可怕了,因为这表明构建过程是多步骤的。每次都需要运行这两个命令?只有当这两个文件发生变化时,需要运行这两个命令,这句话什么意思?如果我使用 sanitizers 构建项目,这些命令会如何变化?构建过程不支持 sanitizer 是什么意思?为什么构建脚本突然开始输出链接错误?

我说了这么多,其实就想表达一个观点:缺乏统一的构建系统真的很令人苦恼。Bazel 是朝着正确方向迈出的一步。CMake 至今仍是我的噩梦。

在经历了这一切后,我感觉 Rust 将我从地狱拉到了天堂。你只需编写一个简短的命令来构建整个 Rust 项目。更重要的是,这个世界上所有其他的 Rust 项目使用的都是同一个构建系统,因此你无需将构建脚本从他们的系统转换到自己的系统。你只需要 Cargo.toml 中的一行代码,就可以将构建过程所有的依赖项都包含进来。它甚至会自动将正确的编译标志传递进来。

编译器

来自两个编译器的错误消息真的很让人崩溃,你需要付出大量努力才能正确理解和修复。

在 C++ 中,错误消息的大小都是以千字节为单位衡量的。终端模拟器中的无限滚动是绝对必须的,因为 C++ 编译器太喜欢输出文本了。几年后,你会形成某种直觉,只要看到错误多少就能判断自己是应该阅读错误还是看看代码。通常错误消息越大,随便看看代码的作用就会大于阅读错误消息。我感觉,如果 C++ 不改变模板的定义方式,这个问题永远无解。

在 Rust 中,编译器错误(在修复所有拼写错误之后)通常是非常糟糕的消息。通常,这些错误消息表明你需要通过某种方式重新组织代码,或花一些时间调整生命周期,所以你不可能错误地使用内存。虽然这个过程需要时间,而且很烦人,但正确的方法是认真听取编译器的建议。说起来很惭愧,通常听取建议有助于编写更好的代码。此外,错误消息可以完整地显示在一页内,很方便阅读。

类型系统

在 Rust 的类型系统中表达想法是一种享受。

首先,非常感谢没有鸭子类型的泛型。TrAIts 清楚地表达了类型希望看到的合约结构或函数。这也有助于编译器生成有用的错误消息。我们获得的错误消息不再是:“对第 Y 行的方法 clone 的无效引用”,而是“类型X没有实现 Clone”,清晰明了。

其次,枚举非常强大。Result 和 Option 是非常强大的概念,每个人都在使用。这两个枚举是所有库(包括标准库)表达容易出错的计算和可选值的通用语言。在 C++ 中,我们有 (1) 返回错误代码;(2) 返回无效值;(3) 引发异常;(4) 进程崩溃。所有有问题的选项和每个库都使用不同的选项。除了 Result 和 Option 之外,我发现定义标记枚举的功能也非常方便。

总结

总的来说,切换到 Rust 后,我感觉日常工作体验得到了极大地提升。Rust 的工具非常友好,语言富有表现力且功能强大。我非常喜欢 Rust,而且我希望Rust 将来的发展能够避免 C++ 的一些陷阱。



Tags:Rust   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search: Rust  点击:(2)  评论:(0)  加入收藏
Rust 标准库 1.77.2 发布,修复高危漏洞
IT之家 4 月 10 日消息,Rust 的优势之一就是安全,但这并不代表该编程语言就没有漏洞。安全专家近日发现了追踪编号为 CVE-2024-24576 的漏洞,攻击者利用 Rust 标准库中的一个安...【详细内容】
2024-04-10  Search: Rust  点击:(4)  评论:(0)  加入收藏
在Rust中使用Serde的详细指南
在处理HTTP请求时,我们总是需要在一种数据结构(可以是enum、struct等)和一种可以存储或传输并稍后重建的格式(例如JSON)之间来回转换。Serde是一个库(crate),用于高效、通用地...【详细内容】
2024-03-26  Search: Rust  点击:(17)  评论:(0)  加入收藏
Rust 写脚手架,Clap你应该知道的二三事
有感而发最近,在和前端小伙伴聊天发现,在2024年,她们都有打算入局Rust学习的行列。毕竟前端现在太卷了,框架算是走到「穷途末路」了,无非就是在原有基础上修修补补。所有他们想在...【详细内容】
2024-03-11  Search: Rust  点击:(20)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown —— 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  Search: Rust  点击:(11)  评论:(0)  加入收藏
Rust中的数据可视化指南
可视化是数据分析和解释的一个关键方面。虽然Rust主要以其性能和安全特性而闻名,但它也为数据可视化提供了强大的工具。在这个全面的指南中,我们将深入研究Rust中的数据可视化...【详细内容】
2024-03-07  Search: Rust  点击:(31)  评论:(0)  加入收藏
如何在Rust中操作JSON,你学会了吗?
sonic-rs ​还具有一些额外的方法来进行惰性评估和提高速度。例如,如果我们想要一个 JSON​ 字符串文字,我们可以在反序列化时使用 LazyValue​ 类型将其转换为一个仍然带有斜...【详细内容】
2024-02-27  Search: Rust  点击:(47)  评论:(0)  加入收藏
记一次Rust内存泄漏排查之旅
在某次持续压测过程中,我们发现 GreptimeDB 的 Frontend 节点内存即使在请求量平稳的阶段也在持续上涨,直至被 OOM kill。我们判断 Frontend 应该是有内存泄漏了,于是开启了排...【详细内容】
2024-02-27  Search: Rust  点击:(12)  评论:(0)  加入收藏
Rust 最受欢迎的这些库
今天分享主题是,关于一些值得注意的 Rust 库,这些库可以根据它们的功能和在编码中的受欢迎程度进行选择。什么是 Rust 库?在 Rust 中,常被称为 “crate” 的库,是一个打包的单元...【详细内容】
2024-02-19  Search: Rust  点击:(50)  评论:(0)  加入收藏
异步Rust:构建实时消息代理服务器
在本文中,我们将深入研究使用Rust构建实时消息代理服务器,展示其强大的并发特性。我们将使用Warp作为web服务器,并使用Tokio来管理异步任务。此外,我们将创建一个WebSocket客户...【详细内容】
2024-02-01  Search: Rust  点击:(58)  评论:(0)  加入收藏
▌简易百科推荐
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31    简易百科  Tags:编程语言   点击:(132)  评论:(0)  加入收藏
探究微处理器开发中的汇编语言的优势与挑战
在计算机编程中,汇编语言是一种低级语言,它可以直接控制计算机的硬件资源。与高级语言相比,汇编语言具有更高的运行效率和更好的控制能力,但同时也更加复杂和难以理解和维护。在...【详细内容】
2023-12-19  松鼠宝贝    Tags:汇编语言   点击:(99)  评论:(0)  加入收藏
选择适合微服务的编程语言,让你的工作事半功倍!
讨论编程语言就像是一场政治辩论。每个开发者都会过分捍卫他/她所使用的编程语言。然而,编程语言应该被看作是它们真正是的东西,即一种工作工具。每种编程语言都有特定的目的...【详细内容】
2023-12-14  爱发白日梦的后端  微信公众号  Tags:编程语言   点击:(178)  评论:(0)  加入收藏
编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
应该90%的IT专业的朋友写的第一段代码就是打印"holle world",每个大学老师都会通过这个方式吸引你对课程产生兴趣。也许有的朋友学的是JAVA开发,有的学的是c,在几年前应该很...【详细内容】
2023-12-11  IT仔的笔记本  微信公众号  Tags:编程语言   点击:(216)  评论:(0)  加入收藏
TypeScript中的null和undefined的区别
在TypeScript中,null和undefined是两个特殊的值,用于表示变量的缺失或未定义。尽管它们在某些情况下可能看起来相似,并且都可以表示"没有值",但它们在语义和用法上存在一些重要...【详细内容】
2023-12-07  科学随想录  微信公众号  Tags:TypeScript   点击:(135)  评论:(0)  加入收藏
面向AI开发的六种最重要的编程语言
作者丨FATIH KÜÇÜKKARAKURT 译者 | 布加迪审校 | 重楼出品 | 51CTO技术栈(微信号:blog51cto)在AI开发界,你使用的编程语言很重要。每种语言有其独特...【详细内容】
2023-12-07    51CTO  Tags:编程语言   点击:(121)  评论:(0)  加入收藏
NLP问题实战:基于LSTM(RNN)和Transformer模型
译者 | 朱先忠审校 | 重楼简介GPT等语言模型最近变得非常流行,并被应用于各种文本生成任务,例如在ChatGPT或其他会话人工智能系统中。通常,这些语言模型规模巨大,经常使用超过数...【详细内容】
2023-11-29    51CTO  Tags:NLP   点击:(273)  评论:(0)  加入收藏
一文了解低级和高级编程语言
中文是一种尽量用简短文字表达更多含义的语言,所以很多时候一句话的含义很容易曲解成别的意思。最近,有人提出C语言是一种中级语言的概念,所以特意介绍一下低级语言和高级语言...【详细内容】
2023-11-23  数字随行  微信公众号  Tags:编程语言   点击:(232)  评论:(0)  加入收藏
JetBrains 发布 2023 调研报告:77% 开发者使用 ChatGPT
IT之家 11 月 21 日消息,JetBrains 日前公布了《2023 开发人员生态系统现状》调研报告,汇集了来自全球 26,348 位开发者的调研结果。《开发者生态系统现状报告》涵盖广泛的主...【详细内容】
2023-11-21    IT之家  Tags:JetBrains   点击:(238)  评论:(0)  加入收藏
Go vs Rust:文件上传性能比较
一、设置所有测试都在配备16G内存的 MacBook Pro M1 上执行。软件版本为: Go v1.20.5 Rust v1.70.0测试工具是一个基于 libcurl 并使用标准线程的自定义工具,能够发送多部分请...【详细内容】
2023-11-20  技术的游戏  微信公众号  Tags:Rust   点击:(174)  评论:(0)  加入收藏
站内最新
站内热门
站内头条