likes
comments
collection
share

【Rust 新手小册】Day 1. 为什么要学习 Rust

作者站长头像
站长
· 阅读数 4

本期内容介绍:

   1. 深入探索 Rust 的原因            

   2. Rust 的优势特性介绍 

01 深入探索 Rust 的原因

背景

大家可能或多或少都接触过 Rust 语言的相关信息。

前段时间,微软 Azure CTO 呼吁使用 Rust 代替 C/C++。Elon Mask 也说自己是 Rust 的粉丝,但是却选择使用 C++。这种关于语言的口水战是长久以来都是不可避免的,大家理性看待就好。

【Rust 新手小册】Day 1.   为什么要学习 Rust

在 Rust 语言领域,我们也可能经常会听到某个公司用 Rust 重写了某个项目,获得了哪些收益。毕竟在 Rust 语言里面有一句玩笑话,“一切能用 Rust 实现的,终将会用 Rust 重写”。

【Rust 新手小册】Day 1.   为什么要学习 Rust

我们也经常会听到关于 Rust 语言的初创公司获得融资的消息。

【Rust 新手小册】Day 1.   为什么要学习 Rust

除了这些在 Rust 语言编写之外的信息,我们也会接触到编写 Rust 的相关信息,比如与编译器斗智斗勇,泛型约束过长以及强大的宏编程。

深入探索 Rust 的原因

通过了解以上信息,大家已经有了对于 Rust 语言的初印象。那么 CloudWeGo 为什么要选择 Rust 这门语言进行深入探索呢?这不得不提到 Rust 的发展历程。

  • Rust 发展

Rust 语言由 Graydon Hoare 私人研发,他是专门给语言开发编译器和工具集的工程师,他希望开发一种保证安全的同时又能拥有高性能的语言。2006 年,他开始进行研发。2008 年,他被 Mozilla 聘用,当时 Mozilla 要开发 Servo 引擎,想要保证安全的同时又能拥有高性能,于是他们一拍即合,Graydon Hoare 得到了 Mozilla 的赞助。2010 年,Rust 语言首次发布 0.1.0 版本,用于 Servo 引擎的研发。2010 - 2015 年期间,Rust 经历了 GC 移除等一系列演进,以保证高性能。2015 年,Rust 发布 1.0 版本,这也表示正式官宣 Rust 趋于稳定。2015 - 2018 年,Rust 达成了生产力的承诺,也就是它的工具文档还有编译器变得更加智能,也对开发者更加友好了。2018 - 2021 年,Rust 做了更多异步生态的完善,这也使得这门语言渐渐走向成熟。

【Rust 新手小册】Day 1.   为什么要学习 Rust

  • Rust in 2022

2022 年已经是 Rust 连续第七年位居 Stack Overflow 最受开发者喜爱的编程语言榜榜首。

【Rust 新手小册】Day 1.   为什么要学习 Rust

为了给管理和开发 Rust 项目的维护者提供一些支持,Rust 成立了基金会。有了 AWS、谷歌这些大公司的支持,Rust 的发展也有了一定的保障。同时,Rust 即将融入到 Linux 6.1 版本中,除了 C 语言之外,Rust 是 Linux 内核迄今为止接受的唯一语言,这足以看出 Rust 在业界的重量级和影响力。

【Rust 新手小册】Day 1.   为什么要学习 Rust

此外,作为 WebAssembly 领域的首选语言,由 Rust 编写的 WebAssembly 运行时 Wasmtime 发布了 1.0 版本,这也意味着它达到了稳定状态和生产可用性。

【Rust 新手小册】Day 1.   为什么要学习 Rust

最近 Reddit 的论坛上 Rust 的订阅人数突破了 200K,首次超越了 Go 语言的订阅者人数。

【Rust 新手小册】Day 1.   为什么要学习 Rust

  • Rust 2024

Rust 的未来发展会是什么样子的呢?借助 Rust 官方团队成员的一句话来说明,“the year of everywhere”,也就是说使用 Rust 语言编写的开源项目会有爆发性的增长。那么为什么可以预测它会被大范围使用呢?这完全得益于 Rust 对于易用性的建设规划。2021 - 2024 年,Rust 有一个 2024 规划,主题叫做 Scaling Enpowerment(扩展授权)。之所以取这个名字,是因为 Rust 有一个目标——“empower everyone to build reliable and efficient software”。Rust 最关注也是大家经常诟病的一点,就是 Rust 的整个学习曲线非常陡峭,所以在这个规划中写道 “Flatten the learning curve”。

【Rust 新手小册】Day 1.   为什么要学习 Rust

02 Rust 的优势特性介绍

Hertz 设计之初调研了大量业界优秀的 HTTP 框架,同时参考了近年来内部实践中积累

CloudWeGo 选择 Rust 语言进行探索,是因为 Rust 语言具有以下三大特性。

高性能

  • 基于 RAII 的内存管理

RAII 是将内存资源和对象绑定在一起。在创建对象时将资源分配出去,在销毁对象时把内存资源直接释放掉。相比于 JAVA / Go 等带有 GC 的语言,在 Rust 语言中,失效的对象相对应的内存资源可以得到立马释放,不需要等待某一个时间点由 GC 进行统一的内存回收,避免了性能损失。

  • 严格的约束

Rust 语言的译器对程序员的代码要求会更严格,除了实现正常功能之外,它还能获取到一些额外的编译信息,以辅助编译器做极致的优化。

  • 零成本抽象

零成本抽象可以理解为你用不到功能,就不需要为之付出代价。例如,Rust 这门语言是几乎没有运行时的,也就是说你在实现一个纯同步代码的功能时,产物里面是不会包含异步运行时的开销的。

下图是从各语言 Benchmark 里面截取的纯计算 case。 可以看出 Rust 的性能是非常优秀的,可以与 Go 语言、C++ 等相媲美。

【Rust 新手小册】Day 1.   为什么要学习 Rust

可靠性

1. 内存安全

内存安全是由两方面保障的,分别是所有权和生命周期。

  • 所有权

所有权指的就是任何资源有且只能有一个绑定对象。如下图所示,这相当于栈上有一个 S1 指针,指向了堆上面的一块内存资源。之后把 S1 复制给 S2,这个行为在不同语言中有不同的处理方式。在其他语言中,这一次的复制行为就会默认是一次拷贝,此时 S1 和 S2 都可以访问那一块堆上的内存资源。但是在 Rust 语言中,这是一次移动语义,也就是说这次复制把这一块内存资源的所有权从 S1 转移到了 S2,S1 也会因此失效而无法使用。

【Rust 新手小册】Day 1.   为什么要学习 Rust

所以把它打印出来使用的时候,编译器就会报错,这个值已经被移动了。这解决了内存安全中的第一个痛点,即对于同一块内存资源的二次释放问题。

【Rust 新手小册】Day 1.   为什么要学习 Rust

  • 生命周期

生命周期是对于引用的限制,它保证的是被引用的对象存活时间一定长于引用者。这就意味着你引用的对象一定是有效的。如下图所示,r 引用了 x,但是在第六行对 r 进行操作的时候,x 已经在大括号的作用域里面消亡了。

【Rust 新手小册】Day 1.   为什么要学习 Rust

此时编译器也会报错。这就解决了内存安全中的第二个痛点,悬垂指针的问题。

【Rust 新手小册】Day 1.   为什么要学习 Rust

2. 并发安全

Rust 语言中是通过 Send 和 Sync 这两个标记的 Trait 实现的,Trait 可以理解为编程语言里面的一个接口。Send 和 Sync 里面都是没有任何方法声明以及方法体的,所以二者仅仅是作为一个标记信息,提供给编译器,辅助编译器拒绝一些线程不安全的代码。

【Rust 新手小册】Day 1.   为什么要学习 Rust

  • Send: 实现 Send 的类型可以在多线程间转移所有权。

这个拒绝的过程是怎样的呢?以在并发安全里最常见的 Data Race 为例,在不同线程间对同一个变量进行读写的数据争用,下图中 spawn 方法代表的含义是在 Rust 里面开始一个线程、做一些事情。

我们可以看到它对于函数 F、类型 T 都有 Send 的约束。这个 Send 的意义是实现 Send 类型,它可以在多线程间转移所有权,也就是说现在有线程 A 和线程 B,如果 T 的所有权从线程 A 转移到了线程 B,那么可以避免线程 A 和线程 B 同时对 T 进行读写操作,以免发生数据争用。

【Rust 新手小册】Day 1.   为什么要学习 Rust

  • Sync: 实现 Sync 的类型可以在多线程间共享引用。

类型 T 所映射的是引用,这就是 Sync 这个标记可以发挥的作用。如果是一个引用的类型需要实现 Send,那么就必须保证这个类型实现了 Sync 标记,以此避免数据竞争。

想了解更多关于 Send 和 Sync,可以查看下方链接。The Rustonomicon: doc.rust-lang.org/nomicon/sen…**

Rust 语言是一门工程实践语言。它不需要遵循某一个特定的编程范式,开发这门语言的编程人员也同时在用这门语言完成一些生产工作。因此 Rust 语言有以下四个特点:

  • 智能的编译器

调查研究表明,由于 Rust 语言的编译器报错信息更加详尽智能,使用 Rust 语言的开发者在开发过程中 Stack Overflow 使用更少一些。

  • 完善的文档

Rust 秉持“注释即文档”的理念。如果你想用某个库实现一定的功能,通常按照它的示例说明就可以快速上手。

  • 齐全的工具链

Rust 是一个多平台支持的语言。

  • 成熟的包管理

它可以帮助你更好地处理一些依赖。而且每当遇到一个新项目,你能够快速找到一个入口去上手。

最后,最重要的一点是,如果使用 Rust 这门语言,你完全可以信任别人的代码。因为如果别人的代码里有内存安全或者并发安全问题,基本都是编译不过的。

Benefits

了解 Rust 这门语言的三大优势后,我从个人的角度出发,分享一些 Rust 语言值得被选择的理由。

第一,Rust 帮助你成为更好的程序员。Rust 这门语言足够底层,毕竟它可以融入到 Linux 内核中。在编写 Rust 的过程中,我们不可避免地会接触到一些底层相关的知识。此外,Rust 的编译器非严格。在写代码的过程中,它会强制你去思考,从你所写的代码一直思考到内存堆栈引用、变量作用域等一系列内容。

第二,互联网的野蛮生长迟早会到尽头,硬件的摩尔定律也在失效,后续可能就是存量优化的阶段,这个时候 Rust 这门语言就非常合时宜了。

第三,Rust 语言开发的项目会更稳定,也更好维护。因为它把运行时可能出现的一些问题提前到编译时期进行处理。

【Rust 新手小册】Day 1.   为什么要学习 Rust


项目地址

GitHub:github.com/cloudwego

官网:www.cloudwego.io

【Rust 新手小册】Day 1.   为什么要学习 Rust