« 主页

聊一聊 Rust 编程语言 2026年01月

发布于

版权声明:眯眼探云原创,可随意转载,请保留该版权声明及链接:https://tyun.fun/post/109.rust-language-2026-01/

每月博客的时间间隔越拖越长,儿子笑话我,要不你改季刊好了。

真是个好主意!

我自己倒也没那么纠结,在我看来,生活是有自己的节奏的,每段时间都有每段时间的重点,写作虽然偶尔会中断一下,但也总会继续。就像我的锻炼一样。顺着生活的节奏,既能把事情处理好,也感到充实又自在,完全不需要给自己强加一些不必要的压力。

进入正题,今天来聊一聊 Rust 编程语言,现在可是采用 Rust 语言的好时机。

我是一名程序员,Rust 对我而言一直有着很强的吸引力:C 级别的性能+内存占用,没有GC,高级语言般的表达能力,多编程范式的使用,优秀、统一的工具链,强大的编译器……每一个细节,都透露出对编程语言的深刻理解,充满智慧的平衡取舍,简直就是这个世界上最完美的编程语言。

完美的东西,通常有着不小的代价,那就是 Rust 的上手曲线非常陡峭,非常陡峭。通常认为,对于一个经验丰富的程序员,大概需要 3-6 个月才能熟练使用 Rust。但现在不一样了,现在 AI 很强,而且很擅长 Rust,可以写出高质量的代码,也可以帮助自己快速学习,更快掌握 Rust 语言。

接下来从几个方面来聊一聊 Rust:

  1. 工程管理 & 工具链
  2. 多范式编程语言
  3. 内存 & 并发
  4. 一小细节:错误处理
  5. 现在是采用 Rust 的好时机

工程管理 & 工具链

计算机底层处理的是 0 和 1,我们对不同 0 和 1 的组合进行编码,让计算机执行,就有了程序。但人脑能够处理的复杂度是有限的,太多 0 和 1 我们就分不清楚了。所以我们就给 0 和 1 的不同组合赋予指令编码,就有了汇编语言。但汇编语言还是太麻烦,而且和硬件强相关,于是就有了 C 语言。我们用计算机处理的问题越来越复杂,针对不同类型的问题,就有了越来越多新的编程语言。

如果只是处理个 add(a, b),那显然 C 语言足够了,汇编也是能接受。我们可以把代码放到一个文件中。随着项目逐渐扩大,有好几百行,放到单一的文件中,浏览起来就会变的比较麻烦,也容易不小心动到不相关的代码。这时候就适合将内容拆分,放到不同的文件中。如果有了几千行,几万行,就得用模块组织起来,否则人脑就处理不了这个复杂度了。

现代的软件项目更是超级复杂,全世界的人一起协作,一个客户端程序,很容易依赖几十,甚至上百个外部模块。如果你了解前端开发,一定知道 npm 的依赖地狱,单就管理外部依赖,已经成为了一件复杂度极高的事情。

说了这么多,其实是想说,一门编程语言要真正能撑的起大型项目,必须得有相应的软件工程管理的方法,以及配套的工具。Rust 官方提供了完善的包管理方法,以及相应的工具链。这会让你在软件工程方面节省大量的时间:一方面是工具本身非常好用,另一方面是你省去了去对比各种工具的大量时间。

  • 工具链管理工具:rustup
  • 包管理工具:cargo
  • 代码格式化工具:rustfmt
  • 编译器:rustc
  • 文档管理:cargo doc
  • 测试工具:cargo test

多范式编程语言

我们这一代程序员(80)大多是从面向对象编程(OOP)一路走来,设计模式也是最常见的面试内容。OOP 相对于命令式编程,解决了一些问题,但也引入了一些新的问题,比如:

“The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.”

(面向对象语言的问题在于,它们随身携带了所有的隐含环境。你想要的只是一个香蕉,但你得到的是一只拿着香蕉的大猩猩,以及整个丛林。)

— Joe Armstrong

另外一个经典的问题就是组合 vs 继承。稍微多了解一点编程知识,都知道一个 OOP 的一个设计原则:组合优于继承。但观察实际的情况,大家是真爱写继承啊,整个思维都是跟着继承走的。

OOP 当然有其优点,但想要把一切都装进 OOP,那是很遭罪的。只有不受 OOP 的思想束缚,写代码的时候才能真正通过编程语言,灵活的表达自己的想法。比如组合优于继承这种事,做起来就容易多了。

新的现代通用型编程语言,自然也都注意到了这些问题,Kotlin、Go、Swift、Rust 等等都不再以 OOP 为主打,而是非常务实的,融合不同编程语言范式的优点进行设计。

那就语法而言,怎样才算是一门好的编程语言呢?在我看来,其中一个很重要的方面,就是代码的可读性好不好。代码的可读性好不好,其中一个方面,就得看功能逻辑和异常逻辑代码的比例。

相信写过 Java 语言的人都不喜欢搞异常处理,try-catch-finally 那真是又臭又长,要把异常处理好,一屏幕的代码,有一半都得留给异常处理。这样显然会非常影响你阅读和理解真正的功能部分的代码,降低了可读性。

所以写脚本语言非常爽,一大原因就是基本不考虑异常,只把核心逻辑写下来就行。当然代价就是线上运行经常会出奇怪的问题,查起来很头痛。

Rust 在这方面做的非常好,通过一些巧妙的处理方式,既能确保异常被合理的处理,同时保持异常处理部分的代码非常简洁。后面会详细的讲一讲。

内存 & 并发

高性能的编程,内存的使用是一件麻烦的事情,产生了很多运行时的问题。手动管理内存,虽然高效,占用内存低,但运行时的各种内存问题令人头痛不已,内存泄露,越界,以及各种指针问题。自动管理内存通常需要依赖 GC,有着较大的运行时,需要用到更多的内存,而且还容易因为 GC 引起卡顿,而且依然会有内存泄露的问题。

Rust 通过所有权机制来解决这个问题。原理其实也不复杂,就是通过所有权限制了同一时间,只能有一个 Owner 持有对象,也只能有一个持有者可以修改对象。其他人要用都是“借用”。借用也有规则限制:要么同时有多个不可变借用(只读),要么只能有一个可变借用(读写)。也就是说,只要你拿到这个对象的可变借用,你就可以放心的改,不用担心影响到其他地方。只要 Owner 超出其作用域,内存自然会被释放,这就确保了内存我释放且只被释放一次。

同样在所有权的基础上,在并发的场景,数据的保护也是这个思路。Rust 鼓励优先在进程间传递数据,而不是共享数据。如果实在需要共享数据,也通过规则的强约束,实现安全的共享内存,避免了数据竞争。

和其他编程语言不同的地方在于,其他编程语言通常是给出方法和技巧,由程序员来控制。Rust 则是通过编译器来确保这些方法的使用。因此,只要能通过编译,你就会感到非常的安心:稳了!

虽然这些基础规则看起来比较简单,但真正要应用起来,会有许多延伸规则,就会变的复杂起来,因此很多 Rust 新手的必经之路,就是和编译器搏斗。在搏斗过程中,逐渐掌握 Rust 的使用方法。

Rust 内存占用有多低呢?我很早以前,使用了 Rocket 框架,写了一个非常简单的 API 服务器,使用 Sqlite 数据库,整个整个服务也就不到 5MB 的内存。对于 Java 语言,这是不可想象的。

一小细节:错误处理

现代的新语言,大多都很务实,Rust 也是。所谓的务实,就是不追求理想化,而是直面实际的问题,并给出深思熟虑的解决方案。

相对而言,比如函数式编程语言,在我看来就是一种偏理想的编程语言。希望通过函数式这种优美的编程方式,去解决所有的问题。在这里只是作为举例对比,并不是否定偏理想的编程语言,函数式编程自然有其可取之处,也有其适用的场景,Rust 语言中也包含了函数式编程的范式。而且正是这些语言的极限探索,才推动编程语言的良性发展。

回头继续来讲 Rust 语言务实的一面,只举一个很小的例子,那就是错误处理。在我看来,很少有其他语言能够像 Rust 语言这样,把错误处理做到了如此的程度。

Rust 语言中,如果一个方法有可能出错,则必须将返回结果声明为 Result<T,E>。这种处理方式有多种好处。一是性能好,错误直接是一个值的返回,相比而言 java 异常需要捕获调用栈,有不少额外开销。更重要的是,这种显式的方式,要求你必须处理错误,而不能假装看不见。

在大多数语言中,处理异常的方式是 try-catch,有多难受相信不用我再说了。而 Rust 语言精心设计了错误的处理,针对不同的错误处理方式都提供了便利的语法,让错误处理变的非常优雅,且不会被漏掉:

  • 最基本的当然就是不想处理,直接 unwrap 就好了。
    • 这种情况下,如果出现了异常,程序就会崩溃。虽然这是偷懒的做法,但它是显式的,你不会遇到藏在哪里找不到的错误。
    • 也可以使用 expect,出错时依然会崩溃,但会附带上 expect 中的错误信息。
  • 要想完整的处理成功和错误的结果,就可以通过 match 语法,优雅的处理两个分支情况。再也不要 try-catch 了!
  • 有时想忽略错误,那就 unwrap_or,返回一个默认值。
  • 如果想把错误抛给上层处理,那就使用 ? 传递错误。当一段代码中有好些环节都可能出异常问题,使用 ? 传递错误,代码读起来简直超级优雅。而且你还可以使用 with_context(第三方库) 给每个异常附上额外的信息。

经过这样的仔细设计,错误处理在 Rust 中变的非常直观。

优雅!

现在是采用 Rust 的好时机

Rust 语言,难就难在上手,务实的设计的确考虑到了问题的方方面面,但同样意味着程序员也需要去理解和掌握这些方法。这不是一门适合入门新手的编程语言,即使是编程老手,也需要不少的上手时间。通常推荐的方法是先读一遍 《The Rust Programming Language》,然后在和 Rust 的编译器的搏斗中积累经验。

但现在有了大语言模型,上手 Rust 的难度大大降低了。

现在几乎所有的大语言模型都非常擅长写 Rust,因为大量开源 Rust 代码仓库的质量都非常高,都是大模型的优质语料。一方面是因为能写 Rust 的通常都是经验丰富的程序员,另一方面是编译器就限制了你很难写出低质量的代码。

所以现在上手 Rust 大概可以是这样的流程:

  • 先读一遍《The Rust Programming Language》,这依然是省不了的。
    • 中文版叫《Rust权威指南》,当前是第二版。
  • 了解 Rust 相关的工具链。
  • 描述你的需求,让 AI 和 Rust 的编译器搏斗。
  • 在 AI 的辅助下读懂 AI 写的代码,根据自己的需要做微调。
    • 读代码比写代码的难度,可是低多了。

你看,AI 不够可靠,但 Rust 的编译器够可靠,Rust 非常复杂,但 AI 不怕复杂。

这简直就是新时代完美的编程方式!

没有银弹

在我心中 Rust 是一门非常完美的语言,但不同的场景使用不同的工具才是理性人的选择。比如分析数据,Python + Notebook 拥有着无法被撼动的地位;开发 iOS App,现在就得用 Swift;开发 Android App, 现在就得用 kotlin。

Rust 也有其适用的领域,最常见的比如系统编程,嵌入式编程,wasm。随着使用 rust 的人变多,现在 rust 的适用领域也在逐渐拓展,比如高效的服务端程序,新的编程 IDE zed 也是纯 rust 开发的,性能都非常好。

小结

一门编程语言,涉及到的方方面面是非常多的,一篇小短文能介绍的东西非常有限。但我希望能在这篇小短文中,稍稍展示一下 Rust 的优点,能够引发一点你对 Rust 的兴趣,足矣。

Thanks for reading~