本文并不是劝大家学 rust
,只是最近它实在有点火🔥,特别是前端基建中 rust 的大量应用,还有 vivo 用 rust 写了自家蓝河操作系统,这代表着以后 rust 说不定是前端的又一条路,所以特地来看看 rust 到底是个怎样的存在,同时分享一下自己的体验感受。
1. 使用 rustup 安装 rust
1.1 Linux or MacOS 安装 rustup
bash
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
以上命令通过下载运行远程的 shell 脚本一键安装 rustup 工具,rustup 是 rust 的工具链管理工具,作为前端的或 node.js 工程师,可以把它类比为 nvm
,但它又不是单纯的管理 rust 的版本,而是 rust 一系列工具链。
运行命令可以看到该脚本会提示我们即将安装 rust 的官方编译工具 rustc
以及它的包管理器 Cargo
(例如 nodejs 的包管理工具 npm, Cargo 是 rust 的包管理工具), 将会在根目录下创建一些目录:
~/.rustup
:rustup 的元数据以及工具链会安装到这里,RUST_HOME
环境变量也会指向这里~/.cargo
:Cargo
的根目录,CARGO_HOME
环境变量会指向这里~/.cargo/bin
:cargo
、rustc
、rustup
以及一些其他命令工具都会安装在这里
在输入上述命令后,还需要选择如何安装,直接选择 1
回车即可,后续过程会将会下载 以下组件:
cargo
:rust 包管理器clippy
、rustfmt
:类似 eslint 这样的工具 cargo fmt 与 cargo clippy 用于帮助开发者统一代码风格- 其中
clippy
是静态代码分析工具,包含了一系列 lint 规则,比较类似eslint
,用于检查代码错误 rustfmt
是个代码格式化工具,可以自动格式化代码,来遵循 rust 社区的代码风格规范,比较类似prettier
- 其中
rust-doc
:为 rust 项目生成文档rust-std
:rust 标准库rustc
:rust 的编译器
1.2 重新载入 shell 终端配置
安装完之后需要重新载入配置,安提示运行
shell
source $HOME/.cargo/env
此时输入 rustc
、cargo
等命令就可以识别了,通过 rustc --version
可以查看 rust
编译器版本,输出结构为 rustc 版本号 (commit hash 日期)
2. rust 更新与卸载
检查更新:rsutup check
可以检查当前 rustup 以及工具链的更新情况
更新:rustup update
可以更新 rustup 以及工具链到最新版本
卸载:rustup self uninstall
卸载 rustup 以及 rust
3. 你的第一个 rust 程序
3.1 通过 cargo 快速创建 rust 项目
运行 cargo new project
可以快速创建一个干净的 rust 项目
shell
cargo new hello-rust
可以看到,创建的 rust 项目只有一个 src
文件夹,其中有个 rust
入口文件,并且帮我们生成了 Hello World
模板。
3.2 编译和运行 rust 程序
执行 cargo run
即可编译当前 rust 程序,并且自动运行它,编译结束后,在项目中会生成一个 target 文件,这就是编译后的内容,其中我们可以看到在 Running
时候,运行的是 target/debug/hello-rust
,这个文件就是 rust 程序编译后生成的二进制文件,通过再次执行 target/debug/hello-rust
,可以看到再次运行输出。
cargo run
其实会先执行:cargo build
编译程序,然后再运行编译好的二进制文件,如果你只想编译不想运行,可以只运行 cargo build
。
3.3 rust 的项目配置与依赖安装
相对于 node.js 的项目配置在 package.json
中,rust 的项目配置文件则为 Cargo.toml
,打开对应的文件,可以看到以下内容,了解 package.json
的同学,对他也有种熟悉感。
toml
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
在 node.js 中我们使用 npm
安装依赖,在 rust 中,则使用 cargo
安装,与 https://www.npmjs.com/
相对应,查找 rust 依赖的地址为 https://crates.io/
,rust 中的项目包被称为 crate
。
随便找一个仓库 rand
点进去,可以看到相关文档,根据文档中 cargo add rand
,我们来安装一下 rand
,体验一下 rust 中的依赖安装
运行命令之后,可以看到 Cargo.toml
中内容变为了这样:
toml
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rand = "0.8.5"
在 rust 中还存在一个 Cargo.lock
文件,其作用于 package-lock.json
作用一致,用来锁定项目依赖版本。
我们再来按文档使用一下 rand
库吧
rust
// 使用 rand 库中的 random
use rand::random;
fn main() {
println!("Hello, world!");
// 通过 random() 生成一个随机数并打印
let x: u8 = random();
println!("random num: {}", x)
}
然后再运行 cargo run
即可编译并运行代码
3.4 rust 代码体验感受
首先要说的是,Rust 是一种系统级编程语言,它的设计目标之一是零成本抽象和无运行时开销,意味着 Rust 代码可以在没有任何额外运行时支持的情况下直接编译成机器码,并且不需要依赖运行时环境来执行,不过这也造成了它略微有点长的编译时间,这让我回想起了 c 语言。相比于 node.js、python、go、java 等,rust 更接近底层,它不借助运行时、虚拟机,是有机会替换 c 语言的存在,所以最近看到 vivo 的蓝河,直接就是用 rust 写的操作系统。
对于 rust 与 c 以及其他编程语言的对比,这里不说太多,作为一个前端开发者,习惯了 node.js 带来的方便后,有时候内心真的是有点排斥别的语言,不是因为他们不好,而是有很多限制,比如 java 创建一个应用,jdk 配置半天,可能还会死在这一步,创建的应用光是包的结构就来好几层,看着真的不舒服;切换到 python 虽然好了很多,但稍不注意,pip 各种安装的全局包,有时候把自己搞得挺乱,虽然有虚拟环境之后好了很多,但它的切换还是有点麻烦。
在体验了 rust 之后,感觉就跟 node.js 的流程非常像了,首先安装简单,其次概念相近(不是严谨的对比):
rust | node.js |
---|---|
rustup |
nvm |
cargo |
npm |
Cargo.toml |
package.json |
Cargo.lock |
package-lock.json |
https://crates.io/ |
https://www.npmjs.com/ |
clippy |
eslint |
cargofmt |
prettier |
rustc rust-sdt |
node |
除此之外就是项目简洁,也不那么挑IDE,直接一个 src 里面就是 rust 代码,与 node 也很相似。在 rust 程序的编译运行过程中,也让我回想到学习 c 语言的时候,他们的过程非常相似,但相比于 c,rust 的流程又更加简洁。单从下载 rust 到编译 hello world 程序,安装依赖,就有种非常熟悉的感觉。
3.5 几个常见的 rust 的 vscode 插件
- Rust Extention Pack:这不是一个有着自己功能的插件,而是包含了三个常用插件的插件包:
rust-analyzer
: 可以替换官方的rust
vscode 插件,对预览进行实时分析、提示crates
:通过Cargo.toml
(类似 nodejs 项目中的 package.json)分析当前项目的依赖是否是最新版本Even Better TOML
:rust 的项目配置文件使用的是 toml,这个插件是针对 toml 文件的,可以实现 toml 文件的语法高亮与错误提示
- Rust-Syntax:rust 代码高亮
4. 小结
到这里我们的 rust 体验就结束了,本文主要从 rust 的安装到第一个 rust 程序,将其与 node 生态相对比,发现两者在管理项目上是基本相同的,也没有什么乱七八糟的结构、编译器,从安装到使用的过程都很丝滑。在前端大量基建使用 rust 来构建提效的背景下,一些前端基建相关的同学去学习 rust 也变得不是那么奇怪了,在之前,个人感觉前端没啥必要学习 rust,不过在 vivo 采用了 rust 构建自家蓝河操作系统的情况下,前端开发者在有空余的时间看看 rust 也未尝不可,说不定也是以后前端开发者相比于其他同行的一个优势和机会。
个人对它还是有点兴趣,如果有时间,后面的深入学习也会不定时进行分享。