vlambda博客
学习文章列表

想全面了解 Rust 语言 ? 你想知道的都在这里(下)

文 张汉东

Oneblock社区贡献者

《Rust编程之道》作者



对 Rust 语言感兴趣,但被网上的各种评价 Rust 语言的观点和看法所困扰,到底 Rust 语言是什么样的一门语言呢?那么看本文就对了。


本文为系列的第二篇文章,试图解答以下问题。

1. 零基础能否学 Rust 语言?

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

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

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

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

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



01

答「上文」读者反馈的问题


上一篇文章发出去以后,收到了小伙伴的一些反馈,下面两个问题需要着重回复一下:

1. 是不是太标题党了?

哦,这个怎么说呢?写这个系列的初衷也是因为看到网络上流传的对 Rust 以及 Rust 历史、社区的一些误解,主要是想找一些针对性的问题,写一篇扫盲贴,可以让对 Rust 感兴趣的可以通过这些问题,对Rust从整体上、外围上有一个了解。所以这个标题我觉得还好吧?它确实反映了我想写的内容啊。

2. Rust 是重新实现 C 语言?

我的意思并不是指 Rust 是 C 语言的衍生品。我的意思大概包含两个方面:

第一,指 Rust 的时代意义,和 当年 C 语言类似。C当年是第一个系统级的通用语言,现在 Rust 也是系统级通用语言,并且Rust重新定义了系统级语言:安全和性能兼顾。正好现在这个时代,安全将不再是可选项。

第二,在语言实现上,虽然Rust 从 Cpp 那借鉴了优秀的零成本抽象等思想,但是 Rust 语言在工程使用上和 C 语言更像。

C语言用Struct 模拟 面向对象, Rust 则让 Struct 直接拥有了 OOP 特性。

C语言靠函数指针模拟多态和使用相同的函数名来模拟接口, Rust 将其现代化抽象以后就是:trait 和 Enum。更具工程之美。

C 语言 和 Rust 都没有继承,但均可以通过包装 Inner 结构体来模拟继承。

C 语言里的指针,在 Rust 里被披上了一层安全的“外衣”(借用检查)就是引用(Safe Rust),脱下“外衣”就还原为指针(Unsafe Rust)。

C 语言编程处理错误,基于返回值,没有异常。Rust 语言处理错误,同样是基于返回值,没有异常。但是 Rust 比 C 强的地方在于,Rust 的类型系统借鉴了Haskell的和类型,来处理返回值,从而比 C 语言更优雅和健壮。

C 语言编程,你不需要以对象来进行抽象,也不需要以函数来进行抽象,你只需要想清楚你的数据类型、结构和算法即可。Rust 中也是一样,你想清楚你的数据类型、结构和算法即可,和 C 不同的地方,或者说更强的地方在于,类型系统是安全的,并且,更具工程性和健壮性。

如果用一句话来总结,那就是:Rust 是基于 C 编程思想的一次华丽的现代化变身。



02

零基础能否学习Rust语言?


零基础能学任何一门编程语言。Rust 语言也是一门图灵完备的编程语言,为什么不可以学呢?

有一定编程语言基础的人,感觉Rust入门曲线高,其实是和他已经形成的一套编程语言定势有一定关系的。对于有编程基础的人,学习 Rust 最好保持一种初学者心态去学 Rust,才能不被以往的思维定势所影响。

比如很多 Rust 新手,从写的 Rust 代码中都能看出来,Java/ C/ Cpp 的痕迹。 因为他只是在用 Rust 写 Java/C/Cpp。

而初学者纯小白,一张白纸,从零接受Rust语言的设计,也许会更好。

但如果你的问题是,零基础能否快速学会 Rust 语言?我觉得,就有点困难了,你还是需要一定的时间去掌握学习。



03

学习Rust能否跳过C/Cpp语言?


理论上来说,单纯学习Rust,你可以绕过C语言。

C语言是建立在计算机操作系统的一种抽象,即,一种世界观。它允许操作计算机系统中的资源。比如你可以通过指针来操作内存数据。

Rust则是另一种抽象,它相比于C语言更加安全,更加现代化。Rust这种抽象汲取了C语言这么多年来发展的精华,改进了C语言中的糟粕。比如,Rust中的引用你完全可以当指针去看待,然而,它是披上了安全外衣的指针。

在我眼里,Rust就是新时代的C语言(本文前面已阐明理由)。

所以理论上,你完全可以直接学习Rust,通过学习Rust去掌握计算机组成原理, 操作系统, 网络, 数据结构等计算机科学知识。

现在有纯Rust实现的操作系统等。理论上你完全可以避开C语言。

为什么说理论上?因为现实世界操作系统还是C的地盘。虽然实际开发中你不一定要和C打交道,但学习C语言对你掌握计算机基础可能更有帮助。因为计算机世界的发展是建立在C基础上的,就知识体系而言,你可能避不开C语言。

学习C语言,也帮助你对比Rust的抽象,对比式学习更有好处。看看不同时代背景下两种语言抽象有什么异同,对你的语言的大局观培养也是有好处的。

总之,学习Rust你在一定程度上是可以避过C语言的,但不要为了避而避,学习C语言有额外的好处。

同样,学习 Rust 也可以绕开 Cpp。

Rust 和 Cpp,本质上是系统编程的两套解决方案。

Cpp是演化的产物, Rust 是精心设计的产物。

Rust 虽然借鉴了 Cpp 的很多东西,但用不着先去学 Cpp 。

计算机底层运作机制,又不是C/Cpp独有的,这是所有语言的基础。

只不过,学过Cpp的人更容易接受 Rust 的概念。因为Cpp和Rust共享着很多底层基础知识,和Rust借鉴了Cpp的内存管理思路。

Rust还借鉴了其他很多语言,难道都学一遍?

学过Cpp的人,就好比是已经吃了四、五个馒头,再吃第六个馒头,就更接近饱腹。

没有学过Cpp的人,大不了从第一个馒头开始吃呗。

但是如果问题换成:用 Rust 能避开 C/ Cpp 吗? 那么答案就是不一定了。因为现实世界很多系统还是C 和 Cpp 实现的,有的时候,你必须要和 C/ Cpp 打交道,这个时候就得去学 C 和 Cpp 了。当然,也有纯 Rust 的项目,未来会更多。



04

Rust只能开发底层系统软件吗?


Rust 只能开发底层系统软件?

前端工程师可以学 Rust 吗?

Rust可以全栈开发吗?

很多朋友有类似的问题。 答案是:Rust 可以全栈开发。

因为 Rust 是通用语言。但是如果你把我这个答案理解为我在吹 Rust 是全能语言,那你就冤枉我了。

Rust 有这个潜力,但还得结合场景。如果你是为了全栈而全栈,那用 Rust 应该也可以满足你的需求,只不过有些地方可能需要你自己造轮子,目前 Rust 生态领域还是比较早期。

说到 Rust 生态领域,我是包含了 Rust 的所有应用领域:终端工具、Web应用、网络服务、嵌入式、操作系统、WebAssembly、GUI、游戏等等。 

总之一句话:只要你愿意,只要你能投入精力,你是可以全栈使用 Rust 的。



05

Rust适合刷算法题吗?


Rust 语言很适合刷算法题。

但我建议你,在掌握 Rust 所有权之后再刷算法题。

为了说明这一点,我在 LeetCode上写了一篇题解:「算法题解 | Rust字符串处理:替换所有问号(和本篇文章一起推送的文章)」,你可以看看。

在掌握所有权之后,就不会出现在刷题的过程中和编译器去做斗争的事情,才可以把主要精力放到算法层面上。



06

Rust依赖杀手级应用吗?


Rust 是一门系统级通用编程语言。前面也说过, Rust 语言可以拿新时代的 “C” 来类比。

回想一下 C 语言的发展,是靠杀手级应用起家的吗?Unix 算杀手级应用吗 ?不算。Unix是基础设施。

Rust 应用领域虽广,但现在的主要应用就集中在各个领域的基础设施上:云原生、区块链、操作系统、网络服务等基础设施上面。

Rust 虽然可以支持全栈,但目前的重点还不是应用。所以,暂时不要希望有什么杀手级应用去推动 Rust。

一门语言,除了杀手级应用的影响之外,还有一种方式可以推动它不断前行和扩张,那就是大厂的支持。

Rust 现在基本都得到了全球IT巨头的认可:Google、Facebook、微软、亚马逊都在使用 Rust。

因为大厂们要想可持续发展,必然要想办法解决未来的安全问题,必然要布局。不信去看看微软的一系列关于 Rust 的文章。

所以,Rust 根本不需要靠什么杀手级应用推动。但不排除,未来会出现 Rust 实现的杀手级应用。




07

Substrate课程预告


招募 |由 OneBlock+ 与 Parity 官方独家合作的《Substrate区块链开发入门》第八期正在报名中!非常适合初级的技术同学学习!


感兴趣的开发者们可以扫描下方二维码报名课程,并通过1个月的时间掌握 Substrate 这一最新的区块链技术,开发出一条承载独特业务的区块链应用!