摘要: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

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

Rust布道者张汉东倾授,入门Rust初学者都要攻破哪些难点?的更多相关文章

  1. 人物-IT-张志东:张志东

    ylbtech-人物-IT-张志东:张志东 张志东,广东东莞人,腾讯创办人之一,腾讯高级副总裁兼科技总裁,于1993年取得深圳大学理学学士学位,并于1996年取得华南理工大学计算机应用及系统架构硕士学 ...

  2. 张高兴的 .NET IoT 入门指南:(七)制作一个气象站

    距离上一篇<张高兴的 .NET Core IoT 入门指南>系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系 ...

  3. JAVA课程设计个人博客 学生成绩管理 201521123001 张陈东芳

    1. 团队课程设计博客链接 http://www.cnblogs.com/kawajiang/p/7062407.html 2.个人负责模块或任务说明 我主要负责实现学生信息的添加功能.学生成绩的录入 ...

  4. 【番外篇】Rust环境搭建+基础开发入门+Rust与.NET6、C++的基础运算性能比较

    前言:突然想打算把Rust作为将来自己主要的副编程语言.当然,主语言还是C#,毕竟.NET平台这么强大,写起来就是爽.缘起:之前打算一些新的产品或者新的要开发的东西,由于没有历史包袱,就想重新选型一下 ...

  5. 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器

    时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...

  6. 张小龙2018PRO版微信公开课演讲全文 透露2018微信全新计划

    大家好!我是张小龙.欢迎大家来到微信公开课. 刚刚出现的是我打游戏的画面,被大家看到了,那个不是我最好的水平,因为有点紧张,我最高分曾打到6000多分.当然我是练习了很久了,并不是我比大家更厉害,而是 ...

  7. 全面认识 RUST -- 掌控未来的雷电

    文章目录 RUST 简介 如何衡量语言的好坏? 静态语言 编译器 语言定位 代表性项目 Hello World RUST 前景 RUST 简介 Rust 是一种兼顾内存安全.高并发和稳定运行的编程语言 ...

  8. FinClip小程序+Rust(三):一个加密钱包

    ​ 一个加密货币钱包,主要依赖加密算法构建.这部分逻辑无关iOS还是Android,特别适合用Rust去实现.我们看看如何实现一个生成一个模拟钱包,准备供小程序开发采用 前言 在之前的内容我们介绍了整 ...

  9. 【Rust学习】内存安全探秘:变量的所有权、引用与借用

    作者:京东零售 周凯 一.前言 Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月,是一种高效.可靠的通用高级语言.其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有 ...

  10. Rust 学习 0

    安装Rust 后,本地有文档: file:///usr/local/share/doc/rust/html/index.html file:///usr/local/share/doc/rust/ht ...

随机推荐

  1. CF339D

    题目简化与分析: 题目翻译说的还是太复杂了,其实只是给你 $ n $ 个数,奇数位 \(\operatorname{or}\),偶数位 \(\operatorname{xor}\). 会修改某个元素 ...

  2. virsh domxxx命令

    1. 摘要信息类 1.1 dominfo 获取配置等摘要信息 [root@hyperhost ~]# virsh dominfo --domain centos7.6 Id: 1 Name: cent ...

  3. FWT & FMT(位运算卷积)学习笔记

    它们两个的全名叫 快速沃尔什变换(FWT) 和 快速莫比乌斯变换(FMT),用来在 \(O(n\log n)\) 时间复杂度内求位运算卷积. 因为 FMT 能解决的问题是 FWT 的子集,所以这里不讲 ...

  4. AGC 补题笔记

    [AGC001] A.BBQ Easy 由于最大数肯定要和一个比自己小的数搭配保留该数,不如选择保留次大数,如此递归即解.因此将序列排序后输出序号为奇数的数即可. B.Mysterious Light ...

  5. 【日常收支账本】【Day04】优化编辑动账记录的操作——QTableWidget单元格设置QComboBox控件

    一.项目地址 https://github.com/LinFeng-BingYi/DailyAccountBook 二.新增 1. 在表格中设置选项列表,让用户更快地编辑动账记录 1.1 功能详述 为 ...

  6. pbootcms 后台内容列表搜索功能扩展及增加显示字段功能

    应项目要求,一个内容模型下栏目不宜分的层级过多,如新闻模块,分2022.2023.2024年度,每年度下分12个月,这样就是2层栏目,再依类别(科技.动漫.电影...)划分层级,栏目数量较多,而且不易 ...

  7. baby_web

    点开页面获得提示 根据提示,访问index.php,但是会自己跳转到1.php 这时候抓包修改才ok才能定位到index.php

  8. .NET6中的await原理浅析

    前言 看过不少关于 await 的原理的文章,也知道背后是编译器给转成了状态机实现的,但是具体是怎么完成的,回调又是如何衔接的,一直都没有搞清楚,这次下定决心把源码自己跑了下,终于豁然开朗了 本文的演 ...

  9. Codeforces Round #696 (Div. 2) (A~C题解)

    写在前边 链接:Codeforces Round #696 (Div. 2) A. Puzzle From the Future 链接:A题链接 题目大意: 给定一个\(a\),\(b\),\(d = ...

  10. 手撕Vue-Router-添加全局$router属性

    前言 经过上一篇文章的介绍,完成了初始化路由相关信息的内容,接下来我们需要将路由信息挂载到Vue实例上,这样我们就可以在Vue实例中使用路由信息了. 简而言之就是给每一个Vue实例添加一个$route ...