rust
为什么要学习rust
rust越来越火了, rust笔记.md 但是目前正在使用rust的项目并不多,工作岗位基本没有。那么有必要学习rust吗?我的看法是不必要,但是值得了解和学习。站在我的角度有以下几点理由:
1、RUST解决问题的思路,符合当前发展的方向。计算机技术发展了这么多年,期间编程语言也在不断发展,但是一直以来有几个问题在来回拉扯:性能,安全和表达能力。先说安全问题,以我从业的嵌入式行业来看,遇到严重的问题大部分都是因为内存管理引入的问题。主要原因是因为嵌入式式环境使用的C和C++。我们知道这是历史悠久而又生命力顽强的语言,这主要得益与它们性能高,但是他们不支持垃圾回收就导致了很容易出现内存不安全问题。虽然C++引入了智能指针,还有RAII等特性极大的防止内存问题。但是它依旧保留了极大的自由度给程序员,只要把不安全的方式留着,就会引入问题,毕竟写程序最大的不可控因素是人。从我身边的例子看,引入问题不仅仅是那些新手程序员,即使那些极优秀且有多年经验的程序员一样会引入内存问题。而且越是厉害的程序员,引入的问题往往不容易被发现,等到发现的时候那就是重大事故。除了C和C++外我们看看那些安全的语言右有什么问题,那使用最广发的JAVA和python来说,他们依靠垃圾回收很好的解决了内存安全问题,而且无论是表达力,或者开发效率都及其优秀。但是因为引入垃圾回收,性能就比较拉跨。而且他们的运行需要虚拟机,所以在嵌入式开发中就受限了。而rust结合了众多语言的特点,兼具性能和安全。当然为了同时满足性能和安全,它牺牲了一定的易用性。这里的易用性不是说它的表达力不够,或者说很难写。我认为主要是初期的上手门槛会比较高。对于一个项目来说,它把问题暴漏在了前端,但你的项目只要编译通过。就很少担心内存方面的问题了。我认为这种解决问题的思路是值得学习的。
2、对于嵌入式开发来说,需要一门表达力强的语言。现在嵌入式设备到处都是,我们能看到的设备,比如家里的灯具,音箱,随处可见的摄像头等等,都跑了负责的软件。C语言是及其优秀的语言,这么多年了,依旧是热门的语言。它简单,自由,甚至说整个数字世界的底座就是C语言编写的。但是对于现在软件开发来说,它过于质朴,很多新的编程概念它都不支持。C++语言在嵌入式中也发挥巨大作用,但是就我个人而言不太喜欢C++的哲学。这么多年来,C++不断发展,不断引入新的概念,使它成为及其强大的语言。包含了各种特性,但是也是因为它太丰富,所以很难掌握C++的所有特性,即使你掌握了很多,但是它给给你的选择太多了。你去找两个C++的项目,往往感觉像是用不同语言编写的。这种啥都想要的思想我是不太喜欢。
3、完善的工具链,我在写这篇博客的时候已经简单浏览了一个完整的RUST教程,并编写了几个简单的程序。给我一个最大的体会是,RUST的工具链简直太好用了。我们不需要下载GCC,不需要学习cmake,只需要一键安装语言包,就可以直接开始开发了,而且它的官网就有优秀的教程,在线编译器同时它还具有cargo包管理工具,甚至可以一键写文档。这才是一门现代语言应该有的样子。我们已经有这么大的软件基石,当每次还需要手动管理项目和代码的确实不是一个很好的方式。
4、先得承认,学习rust并不一定会能找到工作,你去招聘网站看以下,招聘rust的企业很少
学习rust的一些资料
一个优秀的RUST教程:Rust语言圣经
常用命令和工具
完整了解了一边RUST之后我决定认真的学习rust,同时呢我希望把自己学习的过程记录下来,所以后面会有一系列RUST的学习笔记。
rust常用命令:
1 | |
Vscode好用的rust插件:
rust-analyzer
其他推荐的插件
Even Better TOML,支持 .toml 文件完整特性Error Lens, 更好的获得错误展示One Dark Pro, 非常好看的 VSCode 主题CodeLLDB, Debugger 程序
rust的安装非常简单,按照教程中操作很快可以安装完成,安装完成后我们在终端执行:cargo new world_hello 就可以生成一个项目。
1 | |
hello,word!
1 | |
tips:解决下载依赖慢的方法
语言精要
计算机发展几十年,编程语言也在一直发展,但是往往一门语言出现解决了一个方面的问题就有牺牲了另一个方面。比如C语言高效,但是内存问题一直困扰着C程序员,也让C语言一直饱受诟病。python的简单,安全,但是运行速度慢。一门既要又要的语言实属难得。rust设计的目的要做到既要内存安全又要高效。
rust1.0版本于2015年发布到现在发布到1.77.1版本而且还在持续更新。rust的更新速度非常快,而且rust的更新速度是其他语言无法比拟的。在《RUST编程之道》中将rust中的概念抽象为4个层次。
1、混合编程范式,包含面向对象和函数式编程
2、语义:所有权,MOVE、COPY、借用、生命周期、DROP
3、类型系统:泛型、trait、一切皆类型、多态、类型推断
4、安全内存管理:栈、RAII、堆
对于开发者来说在实际使用时只需要关注前三层,内存安全编译器会自动帮我们处理。以往学习一门语言最好的办法时直接上编码,在编码和阅读中熟悉概念,但是rust可以先理解清楚对应的语法在动手。、
Rust是跨平台语言,一次编译,到处运行,这得益于LLVM。Rust编译器是一个LLVM编译前端,它将代码编译为LLVM IR,然后经过LLVM编译为相应的平台目标。Rust 源码经过分词和解析,生成 AST(抽象语法树)。然后把 AST 进一步简化处理为HIR(High-level IR),目的是让编译器更方便地做类型检查。HIR 会进一步被编译为 MIR (Middle IR),这是一种中间表示,它在Rust1.12版本中被引入,主要用于以下目的。· 缩短编译时间。MIR可以帮助实现增量编译,当你修改完代码重新编译的时候,编译器只计算更改过的部分,从而缩短了编译时间。· 缩短执行时间。MIR 可以在 LLVM 编译之前实现更细粒度的优化,因为单纯依赖LLVM的优化粒度太粗,而且Rust无法控制,引入MIR就增加了更多的优化空间。· 更精确的类型检查。MIR 将帮助实现更灵活的借用检查,从而可以提升 Rust 的使用体验。最终,MIR会被翻译为LLVM IR,然后被LLVM的处理编译为能在各个平台上运行的目标机器码。
rust主要由以下核心模块组成,语言规范,编译器,核心库,标准库,包管理器;
rust语言规范主要由语言参考和RFC文档构成,语言参考时官方维护的文档,文档中包含:
- 对每种语言结构及用法的描述
- 对内存模型,并发模型,链接,调试等内存的描述
- 影响语言设计的基本原理和参考
RFC文档涵盖了设计意图,详细设计,以及完成的技术方案,可用于了解某个语言特性的发展历程。
rust是静态语言,官方编译器rustc是一个跨平台的编译器。
rustc有如下特点:
- rustc是跨平台 q的应用程序,支持UNIX/Linux等类UNIX平台,也支持Windows平台。
- rustc支持交叉编译,可以在当前平台下编译出可运行于其他平台上的应用程序和库。
- rustc 使用 LLVM 作为编译器后端,具有很好的代码生成和优化技术,支持多个目标平台。
- rustc是用Rust语言开发的,包含在Rust语言源码中。· rustc对Rust源码进行词法语法分析、静态类型检查,最终将代码翻译为LLVM IR。· rustc输出的错误信息非常友好和详尽,是开发者的良师益友。
标准库和核心库
Rust语言的语法由核心库和标准库共同提供。其中Rust核心库是标准库的基础。核心库中定义的是Rust语言的核心,不依赖于操作系统和网络等相关的库,甚至不知道堆分配,也不提供并发和I/O。可以通过在模块顶部引入#![no_std]来使用核心库。核心库和标准库的功能有一些重复,包括如下部分:· 基础的trait,如Copy、Debug、Display、Option等。· 基本原始类型,如bool、char、i8/u8、i16/u16、i32/u32、i64/u64、isize/usize、f32/f64、str、array、slice、tuple、pointer等。· 常用功能型数据类型,满足常见的功能性需求,如String、Vec、HashMap、Rc、Arc、Box等。· 常用的宏定义,如println!、assert!、panic!、vec!等。做嵌入式应用开发的时候,核心库是必需的。
Rust标准库提供应用程序开发所需要的基础和跨平台支持。标准库包含的内容大概如下:· 与核心库一样的基本trait、原始数据类型、功能型数据类型和常用宏等,以及与核心库几乎完全一致的API。· 并发、I/O和运行时。例如线程模块、用于消息传递的通道类型、Sync trait等并发模块,文件、TCP、UDP、管道、套接字等常见I/O。· 平台抽象。os模块提供了许多与操作环境交互的基本功能,包括程序参数、环境变量和目录导航;路径模块封装了处理文件路径的平台特定规则。· 底层操作接口,比如 std::mem、std::ptr、std::intrinsics 等,操作内存、指针、调用编译器固有函数。· 可选和错误处理类型Option和Result,以及各种迭代器等。
包管理器:
把按一定规则组织的多个rs文件编译后就得到一个包(crate)。包是Rust代码的基本编译单元,也是程序员之间共享代码的基本单元。Rust社区的公开第三方包都集中在crates.io网站上面,它们的文档被自动发布到docs.rs网站上。Rust提供了非常方便的包管理器Cargo。Rust中的Cargo类似于Ruby中的bundler、Python中的pip、Node.js中的npm。但Cargo不仅局限于包管理,它还为Rust生态系统提供了标==============