01 - 安装 Rust 和使用 Cargo
一、Rust 介绍
Rust 是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust 在语法上和 C++ 类似,但是设计者想要在 保证性能的同时提供更好的内存安全。Rust 最初是由 Mozilla 研究院的 Graydon Hoare 设计创造,然后在 Dave Herman,Brendan Eich 以及很多其他人的贡献下逐步完善的。Rust 的设计者们通过在研发 Servo 网站浏览器布局引擎过程中积累的经验优化了 Rust 语言和 Rust 编译器。Rust 编译器是在 MIT License 和 Apache License 2.0 双重协议声明下的免费开源软件。Rust 已经连续七年 (2016 ~ 2022) 在 Stack Overflow 开发者调查的 “最受喜爱编程语言” 评选项目中折取桂冠。
二、安装 Rust
在学习 Rust 之前需要先安装 Rust,会通过一个叫作 rustup 的命令行工具来完成 rust 的下载和安装,rustup 还被用来管理不同的 rust 发行版本及其附带的工具链。
Rust 由工具 rustup 安装和管理,Rust 有着以 6 星期为周期的快速版本迭代机制,支持多平台,因而不同时期存在大量不同的 Rust 构建版本。rustup 用于管理不同平台下的 Rust 构建版本并使其互相兼容, 支持安装由 Beta 和 Nightly 频道发布的版本,并支持其他用于交叉编译的编译版本。
2.1 Linux 和 MacOS 下安装
使用以下命令直接一步到胃
curl https://sh.rustup.rs -sSf | sh
这条命令会下载并执行一个脚本来安装 rustup 工具,进而安装最新的 Rust 稳定版本。上面的安装过程会自动将 Rust 工具链添加到环境变量 PATH 中,并在下一次登录终端时生效。正常编译执行 Rust 程序需要一个链接器,C 程言编译器通过会附带链接器,另外,一部分常用的 Rust 包会依赖于使用 C 语言编写的代码。
2.2 Windows 下安装
在 Rust 中文官网下载 Rust 安装程序
下载后在命令行中运行 rustup-init.exe
,选择默认安装即可,同样也依赖于 C++ 构建工具,当安装完成后,通过以下这条命令检测是否安装成功,如果回显相关版本号就可确认已正确安装。
rustc --version
三、更新与卸载
可通过 rustup 来更新与卸载 Rust
# 更新
rustup update
# 卸载
rustup self uninstall
四、本地文档
安装工具在执行的过程中会在本地生成一份离线文档,可以通过 rustup doc
命令在浏览器中打开它。当你在标准库中发现了某个自己并不清楚用途或使用方法的类型或函数时,可以通过离线文档在任何时刻查询对应的 API 来获取相关信息!
五、第一个 Rust 程序
编程入门都得从 Hello World 起,IDE 选择 Visual Studio Code,在 VS Code 中安装支持 Rust 插件
第一个 Rust 程序
fn main() {
println!("Hello World!");
}
代码编写完成保存后,在命令行下使用 rustc 对其进行编译,再运行,就能看到输出的 Hello World! 了。
六、剖析
有几个需要注意的细节:
- Rust 程序源代码文件以
.rs
为后缀名; - main.rs 中定义了 main 函数,函数名前用 fn 来声明,类似于 Javascript 函数前的 function;
- 标准 Rust 风格使用 4 个空格而不是 Tab 来实现缩进;
- 注意
println!
不是函数,而是宏; - 行以分号结尾;
Rust 程序的编译与 gcc 或 clang 非常相似,在使用 rustc 编译后,可以观察下编译生成的文件,windows 下会生成一个 .exe 文件及一个 .pdb 文件。
当仅仅使用 rustc 编译简单的程序并不会造成太大的麻烦,但随着项目规模越来越大,协同开发的人越来越多,管理项目依赖、代码构建的事情就会变得越来越复杂和琐碎,就不得不用一个能够帮助我们简化问题的工具,Rust 构建工具 — Cargo。
七、Hello,Cargo!
Cargo 是 Rust 工具链中内置的构建系统及包管理器,由于它可以处理众多诸如构建代码、下载编译依赖库等琐碎但重要的任务,所以绝大部分的 Rust 用户会选择它来管理自己的 Rust 项目。
7.1 使用 Cargo 创建一个项目
Cargo 在使用 rustup 安装 Rust 时已经被安装好了,可以在命令行下输入 cargo –version 来验证。在 rs_projects 下使用 Cargo 命令新建一个名为 hello_cargo 项目
观察两者的不同,在使用 Cargo 生成的项目中,多了几个文件,一个名为 Cargo.toml 文件及一个 main.rs 源代码文件,源代码文件被放置在 src 目录下,与此同时,Cargo 还会初始化一个新的 Git 仓库并生成默认的 .gitignore 文件。
Git 是一种常见的版本控制系统,在创建项目时,通过使用 –vcs 参数来选择不使用版本控制系统,或者使用某个特定的版本控制系统,运行 cargo new –help 可获取关于命令参数的更多说明。
Cargo.toml 内容
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
Cargo 使用 TOML (Tom’s Obvious,Minimal Language) 作为标准的配置格式。[package] 块是一个区域标签,表示接下来的语句会被用于配置当前的程序包,[dependencies] 同样也是一个区域标签,用来声明项目的依赖。在 Rust 中,把代码的集合称作为包,虽然在第一个 Rust 程序中没有使用任何第三方包。
自动生成的 main.rs 中的内容与刚开始手动创建的内容一样。
7.2 使用 Cargo 构建和运行项目
使用 Cargo 来构建和运行项目与手动使用 rustc 相比有哪些异同呢?在当前目录下使用 cargo build
命令来构建
执行命令后,会将可执行文件生成在路径 target/debug 下,除此之外,还会在项目根目录下生成一个名为 Cargo.lock 新文件,这个文件记录了当前项目所有依赖库的具体版本号,由于当前项目不存在任何依赖,所以这个文件暂时还没有太多东西,最好不要手动编辑此文件内容,Cargo 会自动维护它。
除了 cargo build 外,若想构建完直接运行可使用 cargo run
命令,另外还有一个 cargo check 命令,可以使用此条命令来快速检查当前的代码是否可以通过编译,而不需要花费额外的时间去真正生成可执行程序。
为何需要 cargo check
这条命令,通常来讲,由于 cargo check
跳过了生成可执行程序的步骤,所以它的运行速度要远远快于 cargo build
。如果在编码的过程中需要不断地通过编译器检查错误,那么使用 cargo check
就会极大地加速这个过程。事实上,大部分 Rust 用户在编写程序的过程中都会周期性地调用 cargo check
以保证自己的程序可以通过编译,只有在真正生成可执行程序时才会调用 cargo build
。
7.3 以 Release 模式进行构建
当准备发布自己的项目时,可使用命令 cargo build --release
在优化模式下构建并生成可执行程序。生成的可执行程序会被放置于 target/release 目录下,这种模式会以更长的编译时间为代价来优化代码,从而使用代码拥有更好的运行时性能。如果想要对代码的运行效率进行基准测试,可运行 cargo run --release
命令进行构建,并使用 target/release 目录下的可执行程序完成基准测试。
7.4 生成的大小
在用 cargo build
及 cargo build --release
生成可执行文件后,debug 版的体积大小为 160KB,而 release 版的体积大小为 157KB,两者相差并不大。
八、养成良好的习惯,多使用 Cargo
你也许无法在较为简单的项目中意识到 Cargo 相对于 rustc 的使用优势,但随着程序变得越来越复杂,Cargo 最终一定会证明自己的价值。对于那些由多个包构成的复杂项目而言,使用 Cargo 来协调整个构建过程要比手动操作简单得多。