摘要:Rust语言学习曲线过于陡峭?初学者看懂这张思维导图,快速入门。

Rust语言这两年的热度大家有目共睹,作为一个有着突破性变革意义的语言,其光鲜背后也有诸多质疑,对于想要在系统编程语言上更上一层楼的开发者来说,学习Rust语言既是一次新的尝试,也是一次编程思维上的挑战。

最近,技术畅销书《Rust编程之道》的作者张汉东总结了一份“Rust初学者学习路径”思维导图,作为Rust语言的头号布道者,张汉东参与了国内Rust社区的管理和运营,长期在各大知识平台输出高质量的学习教程,可以说是入门Rust语言的首选启蒙导师。

基于张老师这份思维导图,我们将其中的一些分支内容做了详细拆解,或许可以为Rust语言的初学者们解惑,稍微降低学习曲线的陡峭度。

首先,不管什么样的初学者都需要了解的是Rust语言的一些外围常识,包括:

1、Rust语言是什么样的

2、Rust语言应用领域范围

3、Rust语言社区

再针对不同特点的开发者,提出针对性的学习建议:

1、有C语言基础

2、有C++基础

3、有Java/Python/Ruby基础

4、有Go基础

5、有Haskell基础

Rust语言是什么样的

Rust最早是Mozilla员工Graydon Hoare的私人计划,说的通俗点,是Hoare的个人业务爱好,谁知道无心插柳柳成荫,最后却做成了一个广受欢迎的编程开发语言。

Mozilla了解到这个项目后就开始赞助这个计划,并且在2010年首次揭露了Rust的存在。同一年,其编译器源代码由原本的OCaml语言转移到Rust语言,进行bootstrapping工作,称做Rustc,并于2011年完成。这个可自我编译的编译器在架构上采用了LLVM做为它的后端。

Rust最为外界称道的是它的稳定和安全,而这种超强的稳定性来源于其独特的内存安全管理。

在C/C++中,很多开发者都会遇到内存方面的问题,Rust严格的编译器和良好的设计使它规避了这些问题,让它不会出现内存安全方面的故障。Java和C#的流行是因为它们消除了与内存安全性有关的错误,但这两种语言(如Java虚拟机和.Net)在运行时使用了垃圾回收从而导致运行开销,进而影响应用程序的性能。

Rust是无垃圾回收机制和Runtime的静态编程语言,它通过新加入的生命周期 (lifetime)和所有权 (Ownership) 特性,实现内存的自动回收,并且无需运行时,避免出现类似内存泄漏或者悬停指针之类的问题。

Rust的特性决定了它适用于追求编程语言的速度与稳定性的开发者。在官方指导文档中,如此形容Rust的使命:它最重要的目标是消除数十年来程序员不得不做的权衡:安全与生产力,速度与人机交互的顺畅度(ergonomics)。

简而言之,Rust是C和C ++的直接竞争对手,并且在较小程度上与Java和C#竞争。 至于Rust能不能将前浪拍在沙滩上,恐怕得拉长战线评估长期应用效果。

Rust适合哪些应用领域

和C语言一样,Rust也算是一种系统级语言。而且介于Rust不需要在运行时进行垃圾回收,因此它可以提供类似于C和C ++语言的运行时性能。

微软MSRC(微软安全响应中心)首席云开发布道师Ryan Levick曾公开表示:Rust适合系统性编程,微软大约70%的安全问题是内存安全问题。如果这些软件用Rust写,那么这 70%的安全问题很可能就不存在。

业内有不少预测显示Rust可能会成为下一代操作系统的开发语言,之前火狐就用它编写了一个名为Redox的类UNIX操作系统,微软也有逐渐从C/C++转移到Rust构建其基础结构软件的计划。

当前的云计算领域,Rust也可以如鱼得水。

在云计算中,需要构建高性能以降低关键开销的基础架构组件。例如,我们拥有虚拟机管理程序,其作用类似于虚拟机管理器,允许在多个租户之间共享单个云资源物理实例。Rust专注于安全性,而不会影响速度和性能。

创业公司也好,互联网大公司也罢,都可以用Rust编写各种任务,比如命令行工具、web项目、DevOps工具、嵌入式设备、生物信息学(bioinformatics)、搜索引擎、物联网程序乃至当前大火的机器学习项目。

比如Linkerd服务网格代理是在Rust中构建的。

用Rust编写的Qovery Engine是一个开放源代码抽象层库,可在短短几分钟内于云提供商上轻松部署应用程序。

Dropbox使用Rust重写了其一些核心系统,而Mozilla使用Rust构建了Firefox浏览器引擎。

除此之外,还有一些开发者基于Rust开发区块链系统,更多在项目中使用Rust的案例可以参考该页面https://prev.Rust-lang.org/zh-CN/friends.html。

Rust语言社区

一门语言、框架或者库出现后,人们应用它们,不只是因为自身的强大,更是因为其背后的生态圈。

社区是培育语言生态的关键载体,它的繁荣也是语言流行的另一个侧面。

如果想快速入门一门编程语言,相对应的开源主页和社区是最好的老师,有完整的代码、官方的指导文档,丰富的配套资源。任何疑难杂症,Rust语言社区也会有同仁及时解答,大家互相促进,在一个良好的氛围中交流学习Rust。

摆正学习态度

在了解了Rust语言基础外围知识之后,其次是要有一个戒骄戒躁的端正学习态度,坐得住冷板凳才能有所成。

首先,Rust的学习曲线还是比较陡峭的,入门门槛相对较高,所以学习时不要急于求成。

其次,先了解Rust语言概念,再动手实践。磨刀不误砍柴工,吃透基础概念,打好地基,才能搭好房子。

最后,记住编译器是你的老师。Rust难上手很关键的一点就是其严格的编译器,编译器会做尽可能多的检查,争取在编译期就发现问题,消除安全隐患。所以编译器像一个好老师,及早扼杀你的bug,强制性要求你写出可以正常运行的正确代码。

不同类型初学者学Rust要突破的难点

在此基础之上,我们再看学习Rust要突破的难点。此处,将初学者分为五大类来讨论。

完全零基础的开发者:掌握计算机基础体系知识结构,理解Rust语言和硬件/OS层的抽象,理解Rust语言核心概念、以及它的抽象模式,选择Rust语言的某个适用领域进行实操训练,通过实践来提升Rust语言的熟练度和理解深度,同时掌握领域知识。

有C语言基础:由于C语言开发者对高级语言的抽象不是很理解,所以着重了解掌握Rust所有权机制,包括所有权的语义,生命周期和借用检查。了解Rust语言的抽象模式,主要是类型和trait;以及Rust本身的的OOP和函数式语言特性。

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

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

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

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

所以,对于有一定基础的开发者来说,学习Rust语言要掌握的几个关键概念有

1、Rust所有权机制,包括所有权的语义,生命周期和借用检查

所有权机制是Rust语言最核心的特性,它保证了在没有垃圾回收机制下的内存安全,所以对于习惯了GC的开发者,理解Rust的所有权是最关键的一环,切记这三点:

  • Rust中的每一个值都有一个被称为其所有者 (owner)的变量。
  • 值有且只有一个所有者。
  • 当所有者(变量)离开作用域,这个值将被丢弃。

这其中又涉及到生命周期和借用检查等概念,是相对比较难啃的一块硬骨头。

2、Rust语言的抽象模式,主要是类型和trait

trait借鉴了Haskell中的Typeclass,它是对类型行为的抽象,可以通俗地类比为其他编程语言里的接口,它告诉编译器一个类型必须提供哪些功能语言特性。使用时要遵循一致性,不能定义相互冲突的实现。

3、OOP语言特性

熟悉面向对象编程(OOP)的常见的四个特性:对象、封装、继承和多态,可以更好地理解Rust的一些特性,比如impl、pub、trait等等。

4、函数式语言特性

Rust语言的设计深受函数式编程的影响,看到函数式特性,数学不好的人可能会望而却步,因为函数式编程语言的最大特点是把运算过程尽量写成一系列嵌套的函数调用,在Rust中,掌握闭包和迭代器是编写函数式语言风格的高性能Rust代码的重要一环。

具体含义和代码说明不再赘述,大家可以参考《Rust成语设计语言》以及《Rust编程之道》。为了让大家能更通俗易懂地理解Rust语言相关概念,特此附上华为云专家从自身业务经验出发学习总结的Rust资料,点击下载。

最后,感谢张汉东老师提供的思维导图学习框架,让初学者能系统的了解Rust,走近这颗冉冉升起的新星。

书籍下载: Rust语言学习总结.pdf 1.96MB

 

点击关注,第一时间了解华为云新鲜技术~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐