本期内容介绍:

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