想全面了解 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课程预告
感兴趣的开发者们可以扫描下方二维码报名课程,并通过1个月的时间掌握 Substrate 这一最新的区块链技术,开发出一条承载独特业务的区块链应用!