前端的Rust学习之路(一):Rust初体验
一直听说 Rust 性能好,速度快,再加上最近想学习一下 wasm ,准备尝试一下。解释型语言写习惯了,再来开始学 Rust 确实有很多思路需要转变一下。《前端的 Rust 学习之路》系列长期更新,欢迎各位同行指正~
开始
什么是 Rust
Rust 是一门系统编程语言,以高性能,速度快,安全而著称,支持函数式,命令式以及泛型等编程范式的多范式语言,通过其特殊的所有权系统来保证安全性,在语法上类似 C++ 。
当然对作为前端,喜欢js, py并且对Java深恶痛绝的我来说,主要关注的是 Rust 是一门跟上述两者截然相反的、需要编译的静态类型语言,需要有明确的类型注解,跟咖啡相比,它很简洁!!!!!😅
如何安装?
安装很容易,官网根据对应系统安装即可,下面简单介绍。
windows
官网找到对应版本 rustup 下载安装即可,rustup 是 rust 的安装工具,安装完成之后 CMD 执行
1
rustc -V
输出版本号表示安装成功,rustup 同时为我们安装了 rustc
和 cargo
rustc 就是 Rust 的官方编译器,编译器也就是我们常说的语法分析、类型检查这一步,当然 rustc 干的也不止这两件事。代码写完之后需要编译,这就是 Rust, Java 这种强类型语言跟 js, py 的区别之一了😆
cargo 是 rust 的构建工具和包管理工具,构建稍大一些的 rust 项目需要用到它。
linux
执行
1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
按步骤操作,安装 rustup 工具。除此之外,还建议安装 rust-src
, rust-analyzer
, rust-analysis
,提高开发效率。
1 | rustup component add rust-src rust-analyzer rust-analysis |
rust-src
包含rust标准库的源代码,主要是为 rust-analyzer
的类型定义跳转功能提供支持。
rust-analyzer
是Rust的语言服务器,主要给IDE提供自动补全、类型推导、类型定义调整、错误检测等功能。
rust-analysis
是为Rust标准库预先计算机的分析数据,当我们需要标准库的定义时,rust-analyzer
能通过 rust-analysis
更快地给出反馈。
IDE
我选择的是windows+vscode+rust-analyzer
,vscode扩展商店搜索rust-analyzer
安装即可。
也可以使用其他的ide和编辑器:
- IntelliJ IDEA,安装 IntelliJ Rust plugin。
- Sublime Text
- Atom
都有对应的Rust扩展或插件可供选择
使用
先向世界问个好
自从著名的计算机科学家,C语言之父,UNIX之父丹尼斯·里奇(Dennis Ritchie)和《C程序设计语言》作者布莱恩・柯林汉(Brian Kernighan) 用 “Hello World” 程序介绍了C语言后,在UNIX世界里,我们学习的任何新编程语言第一步都会这样做,这已经成为一种习惯。
如今,我们也用 Rust 编写一个 Hello World 程序
新建一个目录,目录里新建文件 main.rs
,然后输入:
1
2
3
4
5fn main(){
println!("Hello World!");
}
怎么样,跟严(you)谨(chou)安(you)全(chang)的咖啡相比,语法是不是很简洁🤣
然后控制台依次执行:
1
$ rustc main.rs
1
2
3$./main //Linux
$./main.exe //windows
Hello World!
main函数
在Rust里,使用 fn
来声明一个函数,后面跟的 main
表示函数名,另外 main
是一个特殊的函数,作为程序入口,在程序启动时运行 main
函数中的代码。
println!
跟很多语言的 print
printf
一样,rust中 println
用来打印输出,prinkln
的第一个参数必须为字符串,也接受通配符及命名参数等形式。
通配符
1 | println!("今天是 {} 年 {} 月 {} 日", 2023, 8, 11); |
通配符 + 位置
1 | println!("小明今年{0}岁,小华今年{1}岁,小美今年也{0}岁", 16, 15); |
通配符 + 命名参数
1 | println!("今天是 {year} 年 {month} 月 {day} 日", year = 2023, month = 8, day = 11); |
此外还支持规定对齐方式,对齐宽度、转换进制、保留位数等等。还比较特殊的是它不是函数,而是一个宏,在 rust 中存在一个宏的概念。
宏类似函数,以(!)来区分,在 rust 中一个类似函数调用但是括号之前有(!)的语句,就是一个宏。
这里先简单了解,后面再详细学习宏和函数的知识。
使用cargo创建项目
rust作为强类型语言,在运行之前存在一个编译过程,不像 js 是在运行时才进行语法校验。在上文中,我们创建文件之后使用 rustc ,然后直接运行编译产物,一些简单的需求可以,但是在实际项目中,我们使用 cargo
来创建、开发、维护和管理项目,简单来说,就像是 npm 之于 js。
创建项目
1 | $ cargo new hello_world |
上述命令中,我们使用 cargo 创建了一个 hello_world 项目,cargo 会创建项目结构和配置文件。目录结构如下:
1
2
3
4
5
6$ tree
├── .git
├── .gitignore
├── Cargo.toml
└── src
└── main.rs
cargo.toml
包含了项目描述、项目依赖等信息,很好理解,就是 npm 中的 package.json
。项目第一次构建成功之后还会生成 cargo.lock
文件,包含项目所有的详细依赖清单,同样的,就是 npm 中的 package-lock.json
。
运行
在 main.rs
中写入:
1
2
3fn main(){
println!("Hello World!");
}
运行
1
2
3
4
5$ cargo run
Compiling hello_world v0.1.0 (E:\Projects\rustProjects\hello_world)
Finished dev [unoptimized + debuginfo] target(s) in 0.24s
Running `target\debug\hello_world.exe`
Hello, world!
能看到输出: “Hello, world!” 。
cargo run
做了两件事,一是编译,二是运行。而我们也是可以手动分布来编译运行项目:
编译
1
2$cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
运行
1
./target/debug/hello_world
编译会产生一个 target/debug
目录,代表我们目前使用 debug
模式,在这个模式下,项目的编译速度会很快,方便我们开发,但是运行速度就会降低。当我们需要高性能的编译产物时,需要添加 --release
来编译。
例如:
1
2cargo run --release
cargo build --release
运行一下我们的高性能代码:
1
2./target/debug/hello_world
Hello, world!
cargo check
当项目十分庞大之后,不管是 cargo run
还是 cargo build
都会变得缓慢,这时可以使用 cargo check
命令来快速检查项目是否能成功编译。速度非常快,会是我们开发过程中最常用的 cargo 命令之一。
总结
rust是一门以高性能、速度快、安全而著称的静态类型语言,我们使用 Hello world! 迈出了学习 rust 的第一步。下篇文章我们学习 rust的变量和不变性
以及其不同于 JS 的一些概念。