一、rust简介
1、rust目标
干掉以前容易出错的语言。很有可能替换掉c++。
2、rust特点
不能指向null,悬垂指针。
3、rust优势
1、Rust 完全是内存安全(除非使用unsafe)。这也是Rust 和 C/C++ 的最大区别。
2、因为没有虚拟机,所以不会出现STW。(go语言依然会有STW,因为他还是有虚拟机)。
3、不用写GC,因为他的严格的变量使用机制,让编译器可以知道变量在哪里就结束使用了,所以编译的时候会自动加上回收语句。
Rust--如何实现内存安全的?
rust官方文档翻译版
入门指南 - Rust 程序设计语言 简体中文版
二、rust与其他语言对比
c++和rust
c++可以看成一种编程语言的标准,不能把他看成一门编程语言。c++下面有clang,vc,gcc,差异性很大,工具混乱。
c++的系统要想写好,需要一套很强的规范。而rust本身就带了这些规范。rust编译器会约束你。rust更适合应用。
相比c++,rust更工程化,面向工程。
rust和go
golang,工程化的编程语言,面向的是工程师,而不是学者,即面向应用,而非理论。
2022.2编程语言排行榜 Php又回来了 Go与Rust的时代将要到来吗?_哔哩哔哩_bilibili
Go的哲学是简单易用、性能、高并发、编译快,最适合半路出家学编程的小白,那时候虽然Rust也已诞生但是语法太怪诞,接受不了生命周期的语法。Go的特性大概十几项,都是我极其喜欢的,摒弃了许多之前编程语言的弊病,开创了一些新的设计,可以说是承前启后,大道至简的语言。
如果喜欢开发后端尤其是web服务器,推荐搞Go语言,人生因此而精彩。
Go和Rust的真正的区别就是,Go能做的,Rust都能做,反之却不一定。
Go是谷歌三位大牛开发,仍然有C的影子和根植于谷歌的web基因,最擅长的事情绝对是web服务器之类的高并发场景,这是他的核心目标。
如果要写嵌入式,操作系统,GUI,区块链,高性能3D游戏,VR游戏,除了C/C++,只有Rust可以,其他语言一边站。
Rust的优点之大白话:
- 应用场景几乎无所不包,简单的说就是什么类型的软件都能开发;
- OS,Driver,GUI,WEB,APP, GAME Engine,WASM ...
- 支持几乎所有主流架构和操作系统,支持的架构和平台甚至比Go还要多;
- 没有历史包袱,语言设计细节都注重安全和性能,都几乎都是各领域深思熟虑的最优解
- 近年开发新作,集大成之作,广纳百川,扬长避短,除了很多人在强调的学习曲线,略高?
- 人体工程学:自动格式化,包管理器cargo,依赖管理,专有crate站点,UTF-8,自动代码检查和优化(Go也实现了一部分但Rust更甚,太任性(人性)了)
- 安全(类型安全,内存安全,线程安全),性能(接近C,与C++不分伯仲)
- robustness,无GC,非手动管理内存,编译前安排好各类型(对应内存)的生命周期
编译时间比go慢,简直就是唯一的缺点。
我为什么喜欢Rust - 知乎
三、学习rust
- 只有 C 经验的人,学习 Rust 时,有如下挑战:
- Rust 编程范式。c 语言是过程式,而 Rust 是混合编程范式,支持面向对象和函数式编程风格。c语言过来的人,很容易把 Rust 写成过程式风格,虽然用过程式也可以用 Rust 写出完整功能,但在代码架构上会损失 Rust 的优势。和编程范式相关的概念:泛型/ trait / 错误处理 / 结构体 / 枚举 。
- 所有权和借用检查。c 里面是 手动管理内存,但是 Rust 是用所有权来管理。c 里面都是用指针,但是在 Rust 里,将指针进行了安全抽象变成了引用,需要有借用检查。 这些都是 c 开发者必须要掌握的概念。
- Unsafe Rust 安全抽象。c 语言开发者要理解 Unsafe Rust 的编码规范,理解如何进行安全抽象,这一点比较重要,尤其是和 C 相互调用时。
- 宏。 Rust 中声明宏类似于 C 语言的声明宏,都是代码替换,但是功能比 C 的强大,这些应该也算一个学习挑战。Rust 还有功能更强大的过程宏,可以在前期学习的时候不用考虑,后期再学。
-
有 Cpp 经验的人,默认其对 C 有一定了解,学习 Rust 时,有如下挑战:
- Rust 编程范式。 Rust 的混合范式 和 Cpp 的混合范式不同。Rust 不是纯粹的面向对象语言,没有构造函数。Rust 中的泛型、 trait 、枚举 和 错误处理 对于 Cpp 开发者同样是学习重点。
- 所有权和借用检查。因为 Rust 也引入了 和 Cpp 11 引入的 基于RAII 机制的智能指针,所以在内存管理方面,对 Cpp 11 及以上版本有经验的人更容易理解。但是没有这方面经验的 Cpp 开发者就有一定难度了。
- Unsafe Rust 安全抽象。这一点和来自 C 语言的初学者一样,是需要对 Unsafe Rust 的编码规范有一定理解。
- 泛型 和 过程宏。 Cpp 开发者有模版,但是 Rust 中有泛型。Rust 中泛型的功能没有 Cpp 模版强大,但是有过程宏可以弥补。也就是说 Cpp 模版编程 等价于 Rust 的泛型和过程宏的结合。如果 Cpp 开发者也想要在 Rust 中追求 模版编程的效果,那么需要掌握 泛型和过程宏。
-
只有 GC 语言使用经验的人,比如 Java、Python、Ruby 、Haskell等,学习 Rust 时面临的挑战和 Cpp 基本相同,但因为使用 GC 语言的人,大部分对底层内存管理没有足够深入的了解,入门曲线会更加陡峭。
学习 Rust 要经历至少三个阶段:
- 整体学习一遍 Rust 语法。对 Rust 语法和语言特性有一个充分了解。
- Rust 基本所有权概念需要一定深入理解。
- 深入领域学习。上面两个阶段完成以后,就可以投入到领域实践中,进一步深入学习。
编程零基础,需要补充必要的基础:
- 计算机科学基础,推荐一些快速入门的书籍:《计算机是如何工作的》、《程序是如何跑起来的》、《网络是如何连接的》
- 入门一下 C 语言。 入门 C 语言之后,学习 Rust 的时候有对比,更容易理解。
- 然后再遵循上面的三个阶段来学习 Rust 。
四、rust学习框架
第一阶段:全面了解 Rust 语法
需要做到
- 对 Rust 语法有一个比较全面的了解。
- 对 Rust 语法进行分类。
第一阶段配套学习资料
- 《Rust 权威指南》,即 Rust 官方出品的 Rust Book 。
- 《Rust Cargo Book》
- 其他免费或收费的入门类 Rust 资料。
看这些资料学习的时候,要围绕第一阶段的学习目标:全面了解 Rust 语法。
对 Rust 语法有一个基本了解之后,可以通过官方出品的Rust by example 和 Rustlings 来检验自己的学习成果。
第一阶段练手项目推荐
这里推荐一些练手项目:
- 结合官方的《Command Line Apps in Rust》一书,实现一个简单的终端应用,比如读取 CSV 文件之类。
- 去 GitHub 开源仓库中寻找案例灵感:
- 比如实现一个终端打字练习的应用,比如toipe 。
- 或者是一个简单的编辑器,比如 kyun 。
- 从 《Rust Magazine》 中寻找练手灵感。
- 其他,比如有些学习资料自身就配套应用案例。
第二阶段: 掌握 Rust 语言关键概念
主要包含如下概念:
- 所有权和借用检查。
- 类型系统与编程范式。
- Unsafe Rust 和 宏。
其中 「所有权和借用检查」是重点,只有在掌握了这两个概念之后,才算入门 Rust 语言。
第二阶段配套学习资料推荐
- 《Rust 编程之道》
- 《Programming Rust》第二版
- 《Rust Design Patterns》
- Rust 标准库文档
- 《Rust 编码规范》
- 《Too Many lists》
- 其他进阶类 Rust 书目,以及免费或收费的学习资料。
第二阶段练手项目推荐
- 这个时候可以阅读 《Too Many Lists》来实现一个链表,或者,可以去 LeetCode 刷题,借此来检验自己对 Rust 所有权机制的理解。
- GitHub 项目中获取灵感:
- smallvec,比如实现一个自定义的 Vector 集合容器
- toydb,比如实现一个简单的分布式数据库
- 其他。学习资料中本身推荐的案例,或者依据学习者擅长的领域来选择适合的项目。
第三阶段:深入领域学习
经过上面两个阶段的学习,可以投入到自己的实际项目中开始学习了。如果没有自己的实际项目,可以参与到开源项目的贡献中去。
比如 Rust 并发和异步开发相关的内容,重点概念中关于类型系统、编程范式、宏、Unsafe Rust 的深入学习和应用,都在这个阶段去完成。
学习 Rust 你需要一个认知框架 - 一君_的个人空间 - OSCHINA - 中文开源技术交流社区