< 返回版块

sunowfox 发表于 2025-08-19 07:57

Tags:rust 随想

1 初识rust

大概在17~18年的时候,当时主要在做充电桩,经过几轮的迭代后,对软件模块化,分层设计有了一些心得。最开始使用的是c++和qt来开发的,可能是代码组织的不太好,总有些偶尔莫名其妙死机的问题。每次出现都得花一两周时间排查,折腾几次后,反思可能自己的水平驾驭不了C++,后面花了半年重构了程序,全部采用c语言,即使使用了简单的C了,偶尔还是会出现死机问题。但毕竟比c++好解决一些了。然后花大部分的时间去研究怎么用C写出安全代码。但c实在太古老了,不仅编程效率低,而且一些原生的缺陷根本不是靠一些技巧能够解决的。

这时偶然在网上看到说有一种编程语言rust,静态编译语言,运行效率跟c一样高,关键没有内存问题。于是就找了一些资料看了下,发现是一门很新的语言,15年才发布了1.0版本。对没有内存问题这个特性很好奇,到底怎么做到的,于是买了一本书,好像是《深入浅出rust》,里面比较系统介绍了rust语言特性,但当时只对原理感兴趣,重点看了所有权,生命周期那些篇章,有点豁然开朗的感觉。了解知识,有个说法叫第一性原理,rust正是从第一性原理出发,通过所有权,生命周期,彻底解决静态编译型语言中的内存问题。并由此引申出来的无畏并发特性。使语言天然从最核心支持并发编程。

2 使用rust

又过了几年,因工作的原因,期间并没有深入了解或者使用rust。但一直有关注语言的发展动态。大概21年的时候,陈天有开了一门rust的付费课程,不贵,几十块钱,第一时间就报名了,想着有机会是不是可以学一学。就当作兴趣或者拓宽知识面了。但是这个课程也就跟完了基础篇,后面又放下了。无论学啥,一定要用起来,不然很难坚持下来。

到了23年的时候,工作上有个新项目成立,是个ems网关,需要支持modbus,dlt645等协议,需要通过mqtt协议与后台连接,需要本地网页进行参数设置。说起来也不难,但性能要求比较高,单台需要支持1万个数据采集点同时采集。这时上个项目刚完成,是个智能仓库网关,因为全部采用c,导致开发周期都有点延后了。这时对c都有点抵触了,就想着何不试一试rust呢。

通过前期调研,rust中有现成的modbus协议库tokio-modbus,支持并发和同步,有现成的redis接口库,有现成的mqtt接口库,有这些基础库就已经省了很多时间了,虽然c中也有这些成熟的库,但c的移植可不像rust一样,拿过来就能用的。这些只是项目要用到的库,更不要说语言支持的anyhow,thiserror,log,还有极为方便的serde,所以就决定下来使用rust开发了。

于是花了大概20天时间,期间刚好有个十一假期,把陈天的课程全部看了一遍,把rust语言圣经(Rust Course))全部看了一遍。就算入门了,这里要说下,rust语言圣经比较适合初入门的人看,以比较简洁活泼的语言由简入深的讲解比较基础的知识点。陈天的课程放在初入门后在看比较好,讲的比较深入,涉及到的点也比较多。当然rust语言是一门还在发展中的语言,这么多年前的教程,有些知识点可能也过时了。rust的入门可能跟其他语言有点不一样,像c,c++可能只要先学了20%的知识点,就可以上手,以后边做边完善剩下的80%,rust不一样,你必须先学会80%的知识点,才能上手。边做边熟悉和巩固原来的知识点。

后来就这样磕磕碰碰的上路了,刚开始确实有点难受的,跟编译器反复斗争了一段时间后,慢慢的就感觉越用越上手了,当然当年刚兴起的大语言模型功不可没。甚至为了利用大语言模型的能力,还充值了微软github copilot,这大大缩短了新手期的时间和难度,以前如果说学习rust曲线很陡峭,很难,我基本同意,但如果结合大语言模型的话,我觉的入门或者开发并没有想象中的难。

项目开发中,为了赶进度,直接在tokio-mobus工程上添加了rtu-over-tcp客户端的支持,甚至也添加了对dlt645电表协议的支持。当时对语言了解不深,所谓的添加支持,只是将源码逐层拷贝一遍,改改文件名,添加一些不同的解析封装而已,里面有很多份一模一样的代码。后续有时间和机会的话,好好整理一下,甚至可以将dlt645协议的部分独立一个crates出来。

自从使用rust开发这个ems网关项目后,一发不可收拾,后续只要有新的项目,都选择使用rust来做了。甚至还花了几个月的时间,将原先c开发的智能仓库网关重新用rust开发了一遍。一些单片机的蓝牙项目也使用rust的embassy框架来实现。一些产品测试工具也使用egui或者axum来实现。rust能实现的地方,就懒得在切换到其他语言去折腾了。

3 心得体会

这几年使用下来,rust给人的感觉就是快速,可靠,舒坦,写完的代码,只要编译通过了,就可以放心运行起来。如果有问题,也是逻辑上的问题。只要程序中不用unsafe,不用panic基本上不会出现逻辑之外的异常。

因为编译器的强大和类型系统的完整性,修改代码心智负担很小,只要把编译错误都解决了,修改的代码就不会出现意外的问题。当然有些编译器没法检查的地方,还得小心处理,比如对字符串的处理,像match分支用字符串时,就需要小心字符串别写错了。

库管理很便捷,在cargo.toml中包含库版本就能直接使用了,这跟c/c++的繁琐简直不是一个维度的东西。升级库也很方便,但升级需要小心一些兼容性问题。

单元测试很方便,特别在ai的支持下,很多时候,都是写完代码了,直接让ai生成单元测试。

生命周期的概念要清楚,但实际中很少用到,一般应用还没有到要使用引用来提高性能瓶颈的程度。

当然也有一些不尽如人意的地方,比如如果写并发代码,在代码最里层用到了异步,那么整个调用链都得用异步,逐层添加async/await, 这感觉就很繁琐。

用std库写的代码跟不用std库写的代码没法通用,这样就造成,单片机嵌入式的代码和有操作系统的代码没法互相移植。它们基本上是两套不一样的东西。

对于c/c++系的开发者来说,只要接触了rust,就不会回头了,这就像开过了电动车就不会还想开油车一样。这也是rust的生态位。随着rust的发展,rust生态的完善,会有越来越多的底层或者高性能应用迁移到rust。

技术是迭代式进步的,也许十年二十年又会有其他新的语言兴起,取代了rust。但至少目前来看,rust代表着静态编译型语言的未来。

评论区

写评论
tinnkai 2025-08-19 11:02

体会写的不错,我算了算也学了3年多了没有机会上手项目

chenzhc 2025-08-19 10:19

[强]

1 共 2 条评论, 1 页