vlambda博客
学习文章列表

篇一 | 想全面了解 Rust 语言 ? 你想知道的都在这里


 

理清头脑混沌,觉醒心智天地




对 Rust 语言感兴趣,但被网上的各种评价 Rust 语言的观点和看法所困扰,到底 Rust 语言是什么样的一门语言呢?那么看本文就对了。
因为问题比较多,所以这是一个系列,争取每篇文章回答五个问题,目前大概需要三篇就可以回答完。


本文为系列的第一篇文章,试图解答以下问题中的前五个,如果你感兴趣的问题不在其中,请回复评论。
  1. Rust 创造者们是一群什么样的人?

  2. Rust 是一门什么样的语言?Rust 的哲学是什么?

  3. 学习 Rust 语言需要高智商吗?

  4. Rust 是 Better C++ 吗?

  5. Rust 学习曲线高吗?
  6. 零基础能否学 Rust 语言?

  7. 学 Rust 语言是否可以跳过 C 语言?

  8. Rust 只能开发底层系统软件?前端工程师可以学 Rust 吗?Rust可以全栈开发吗?

  9. Rust 语言适合刷算法题吗?

  10. Rust 语言要发展需要依赖杀手级应用吗?

  11. Rust 语言该如何学习?

  12. 听说亚马逊招了 Rust 核心团队的人?亚马逊会是 Rust 的 “爸爸” 吗?

  13. 目前已经将 Rust 用于生产的场景有哪些?状况如何?

  14. Rust适应哪些业务领域开发?Rust 在云原生&嵌入式&HPC 领域的可能?

  15. Rust 就业前景如何?

  16. 用 Rust 写的代码为什么比同样功能的Python还慢?

  17. 用 Rust 编译太慢了,能否提升编译速度?

  18. 澄清以下一些关于 Rust 语言的谣言:

    1. Rust 需要手动管理内存。

    2. Rust 用生命周期表示变量死活。

    3. Rust 编译器配备了先进的编译期 GC。

    4. Unsafe 关掉了所有检查,不安全,不能用。

    5. Rust 这么多限制,肯定有运行时开销。

    6. Rust 用户都是傻子,只要乖乖听编译器的写代码,不出错就行了,不用考虑底层的机制。

    7. Rust 连内存泄漏都保证不了,还谈什么安全?


要回答好这些问题并不容易,但是这些问题的答案,至少可以帮你指明一个方向。


Rust 创造者们是一群什么样的人?


Rust 最早是由 Mozilla 工程师 Graydon Hoare(https://github.com/graydon) 于 2006 年开始开发的。后来提交给了 Mozilla ,2010年对外公布过 0.1.0 版本,最早由 Ocmal 语言编写。

InfoQ 在 2012 年 专访过 Graydon (https://www.infoq.cn/article/2012/10/interview-rust )。  也是同年早期,因为 InfoQ 采访了Rust 语言团队,而当时由 JS 之父 Brendan Eich 担任 Mozilla CTO ,当时 Graydon 受他领导,可能被一些读者解读为:JS 之父发明的新语言 Rust。然而,JS 之父确实为 Rust 贡献了几十行代码,但Rust语言的创造者必须是 Graydon。JS 之父也在同年离开了 Mozilla。

为什么?因为是 Graydon 的理念诞生了 Rust 这门语言。如果你去看 Graydon 那篇采访稿,你就会知道。作为职业编译器工程师的 Graydon,看到了互联网的未来是安全和性能并重,并且他熟悉很多优秀编程语言的特性,他想把这些优秀语言特性融合到一门语言中。是他的这种理念创造了 Rust。

Graydon 在 2015 年 Rust 1.0 发布前期高调宣布(于 Reddit)离开 Rust 团队。他自称累了,不想当技术Leader,只想开开心心写代码。后来去了苹果 Swfit 团队,现在应该已经离开了苹果,自己创业了吧。

在 Graydon 身边,还有一群优秀的人:以 Niko 为核心的语言核心团队的人。可以在Rust官网 Governance 页面看到 Rust 语言各个团队的成员信息:https://www.rust-lang.org/governance 。在这个页面上,你也可以看到曾经为 Rust 效力的前队员。然而,Graydon 却没在其中,但社区的人们是不会忘记他的。在 GitHub 上的一些Rust 语言特性,现在 Graydon 偶尔也会参与讨论。

2020 年 8月,Mozilla 大裁员。因为疫情导致经济下滑,Mozilla改变了战略。将 Servo 团队的成员全部裁掉,并且也包含了 Rust 团队的部分 Mozilla 员工。其中包括了 Rust 编译器团队的Leader之一 Felix Klock。

2020 年 11月底,亚马逊在其官网博客高调宣称招聘了 Felix Klock。但是很多国内媒体,包括一些自媒体,把 Felix Klock 解读为 Rust 语言创造者。然而,Felix 只是编译器团队Leader,他只是不领 Mozilla 的工资,但是依然还在 Rust 编译器团队中。所以,不要被网上的那些谣言给带偏了。要学习 Rust,就要自己亲自了解下 Rust 语言及其生态信息。

Rust 基金会目前也在积极筹备中,据说放在了瑞士,Rust 未来可期。


Rust 是一门什么样的语言?



Rust 是一门同时注重安全和性能的通用编程语言。 
Rust 官网的口号是:

一门赋予每个人
构建可靠且高效软件能力的语言.

A language empowering everyone to build reliable and efficient software.

Rust 语言从语言层面去保证了程序的正确性,并且基于类型安全的类型系统,专门为内存安全和并发安全做了所有权语义模型。可以让开发者在编译阶段就能识别出内存不安全和线程不安全的错误。

然而,这也造就了 Rust 语言的高学习曲线。因为在Rust语言出现之前,绝大多数开发者并没有受过专门的安全编程规范。Rust 编译器内建的各种安全检查规则,配合Rust语言的所有权语义,就像是一个拦路虎,阻挡着每个没有掌握 Rust 安全编程模型的开发者。
这也是很多 C++ 开发者诟病 Rust 的原因之一,因为 Rust 的安全模型成为了很多开发者的”心智负担“。到底是不是“心智负担”,见仁见智吧,至少我并不这样认为。因为安全之根在于「人」,有人的地方就有Bug。Rust 语言给开发者带来的「心智安全模型」是为了辅助开发者在编译期就发现问题,这是必须付出的成本。前期付出一定的学习成本,总要好过为内存不安全问题付出惨痛的代价。
至于「高效」不仅仅是指性能。Rust可以写出媲美C/C++的高性能代码,而且 Rust 也拥有着媲美像 Ruby /Python 这些高级动态语言的开发效率。当然,这是开发者在掌握了Rust语言安全模型之后才能体现出来的。
Rust 高效的开发效率体现在多个方面:

1. Rust 语言本身所具备的优秀的工程能力。

2. Rust 语言现代化的开发工具链。

3. Rust 语言强大的类型系统和显式的语义,可以让开发者实现高效且无麻烦的代码重构。

总之,一句话:Rust 语言是兼备安全和性能,且拥有高抽象表达力的现代化语言。
Rust 语言的哲学可以总结为:

1. 内存安全为第一原则。

2. 在不违反第一条原则基础上,做到不牺牲性能。

3. 做到语义层面的高度一致性。

4. 在做到安全和性能的基础上,开发者的人体工程学(开发体验)至上。

5. 语言特性必须保持实用。

6. 提供详尽的文档和学习资料。

7. 开放和谐的社区也是语言的一部分。


学习 Rust 语言需要高智商吗?


智商正常的人,都可以学习 Rust。
学会Rust也不代表你一定是高智商。
但学会Rust,代表你是一名合格的程序员了,掌握了一定的安全编程基础。
掌握 Rust 并不能给你带来智商优越感,但一定会让你重新爱上编程。


Rust 是 Better C++ 吗?


Rust 语言刚发布的时候,很多人拿 Rust 和 C++ 比较。因为 Rust 语言不管是语法,还是应用领域,都和 C++ 有得一比。
但 Rust 并不是 Better C++。如果用一个更确切的描述来形容,那 Rust 应该是 「新时代的 C 语言」。
每个语言背后都是一个时代。
上世纪70年代,C语言、ML语言等奠定了编程语言范式。C语言伴随着 Unix/Linux 操作系统一路高歌。
上世纪80年代,C++语言带着 C with Class 的标签诞生。C++ 走向的是一个高度注重开发人员生产力的时代,90年代。
90年代诞生了不少高开发效率语言。并且号称纯函数式编程语言的Haskell也诞生了。面向对象语言和函数式编程语言两大编程范式语言都得到了长足发展。
在20世纪末,系统软件通常使用C(或之前的“现代” C ++)构建。 因为它们的语义紧密地反映了CPU的使用方式,所以这些语言产生了精简的高性能系统。 为了提高效率而付出的代价是冒着安全漏洞的风险,例如缓冲区溢出,这使我们的关键系统容易受到恶意行为者的攻击。
21世纪初,随着互联网的发展,学术和企业都意识到了安全的重要性。2001年,Trevor Jim(AT&T研究公司)和Greg Morrisett(康奈尔公司)发起了一个联合项目,以开发C编程语言的安全方言,这是早期有关Typed Assembly Language的成果。经过五年的努力和一些已发表的论文,该团队(包括Dan Grossman,Michael Hicks,Nik Swamy和其他人)于 2006 年发布了Cyclone 1.0。 在 Cyclone 看来,不安全的程序应该很难编写,不能编译,并且在运行时遇到安全违规时会恐慌。也是同年,Rust语言的创造者,Graydon 受 CyClone 的启发,创立了 Rust 语言。
从现在来看, CyClone 的安全模型和 Rust 核心思想是非常吻合的:
  • 代数数据类型。Rust 也支持,并且引入了函数式编程特性。

  • 泛型。Rust 也支持。

  • 存在类型。Rust 也有。

  • 基于Region (词法作用域)的内存管理  。(Rust 所有权基础,这方面类似于C++11引入的智能指针,借用检查最初也是基于词法作用域作用域,后来改进为 基于MIR的更细粒度的生命周期 )

  • 线性/仿射类型(Rust 所有权基础)

  • 更安全的指针,CyClone 分了好几种指针类型,比如空指针、胖指针、内存安全的指针、多态指针等。而 Rust 则只区分了 「引用/借用」、「智能指针」和「裸指针」三种,巧妙地把借用检查融合为了一体。
  • 无缝兼容C语言。Rust 则通过 划分 Unsafe 边界来无缝对接 C-ABI。
从上面对 Rust 的“考古”中,我们看得出来,Rust其实更像是对 C 语言的一种重新实现。而这种实现,是为了满足新时代安全和性能并重的需求。在未来,安全并不是仅仅是一个可选项。
综上所述,说 Rust 是 Better C++,并不是一个严谨的说法。Rust 更像是一个开启新的时代的通用的 “C” 语言。

Rust 学习曲线高吗?


首先,Rust的学习曲线是有的。因为前面提到了,Rust的安全编程模型是每个开发者必须要掌握的心智模型。
其次,不同编程语言基础的人,掌握这个心智模型的学习曲线都不同。为此我列了下面的脑图:
  • 完全零基础的开发者:掌握计算机基础体系知识结构,理解Rust语言的核心概念;

  • 有C语言基础:由于C语言开发者对高级语言的抽象不是很理解,所以着重了解Rust语言的抽象模式,掌握Rust所有权机制;

  • 有C++基础:C++开发者对于Rust语言的所有权有很好的理解能力,主要精力放在Rust的抽象方式和函数式语言特性上;

  • 有Java/Python/Ruby基础:着重理解攻克Rust所有权、抽象模式、函数式编程语言特性;

  • 有Go基础:Go语言开发者比较容易理解Rust的类型和trait抽象模式,但Go也是GC语言,所以所有权机制和函数式语言特性是他们的学习重点。

  • 有Haskell基础:Haskell系的开发者对Rust语言函数式特性能很好的理解,主要攻克所有权机制和OOP语言特性。



感谢阅读


本系列未完待续,下一篇要解答的五个问题:
  1. 零基础能否学 Rust 语言?

  2. 学 Rust 语言是否可以跳过 C 语言?

  3. Rust 只能开发底层系统软件?前端工程师可以学 Rust 吗?Rust可以全栈开发吗?

  4. Rust 语言适合刷算法题吗?

  5. Rust 语言要发展需要依赖杀手级应用吗?
如果喜欢本文,就点个赞再走吧!