Rust: Rust 简介与环境搭建:认识这门安全、高速的系统编程语言
Rust 是一门赋予每个人构建可靠高效软件能力的语言——没有垃圾回收,却能保证内存安全。
本教程面向有至少 1 门编程语言基础的开发者。无论你来自 C/C++、Java、Python 还是 JavaScript,Rust 的所有权体系和零成本抽象都将重塑你对"安全"的认知。Rust 连续多年在 Stack Overflow 开发者调查中被评为"最受喜爱的编程语言"。
1. 你将学到
- Rust 是什么,它的核心设计哲学
- Rust 与 C/C++/Go 的差异和适用场景
- 用 rustup 在 Windows/macOS/Linux 上安装 Rust
- 用 Cargo 创建、构建和运行项目
- 编写并运行第一个 Rust 程序
- Rust 的生态(crates.io 和标准库)
2. 一个系统程序员的故事
(1) 痛苦:C 语言的噩梦
Tom 是一名嵌入式系统工程师。一天他接到一个紧急任务:
"把这个网络服务的内存占用从 300MB 降到 50MB 以下,而且要保证永不崩溃。"
他用 C 语言开发,结果发现:
- 手动管理内存 让代码里有 30 多处 malloc/free,改了一处忘记另一处
- 空指针 导致线上服务每周崩溃 2 次,半夜被叫起来修复
- 缓冲区溢出 让安全团队打来电话说"有被远程攻击的风险"
- 写测试?C 的测试框架需要自己搭建,要花 2 天才能配好 CI
他最后选择了什么?他转向了 Rust。
(2) Rust 的解法
同样的任务,Tom 在 Rust 里这样写:
fn main() {
let msg = String::from("Hello, secure world!");
// 编译器保证:msg 的内存会在离开作用域时自动释放
// 不需要 malloc,也不需要 free
println!("{}", msg);
}
总用时:编译通过 = 安全通过。Rust 编译器在编译时就能检测内存错误。不需要 valgrind,不需要 sanitizer,编译过了就安全了。
这就是 Rust 的魅力:在编译期消灭内存错误,零运行时开销。它的设计哲学是"安全不是靠开发者小心,而是靠编译器保证"。
3. 什么是 Rust?
Rust 是一门诞生于 2015 年的系统级编程语言,由 Mozilla 研究员 Graydon Hoare 设计,最初用于 Firefox 浏览器引擎。
(1) Rust 的三大核心定位
graph LR
A[Rust 三大承诺] --> B[零成本抽象]
A --> C[内存安全]
A --> D[无畏并发]
B --> E[高级语言表达力<br>汇编级性能]
C --> F[所有权+借用<br>编译期消除内存错误]
D --> G[Send+Sync trait<br>编译期发现数据竞争]
| 定位 | 说明 |
|---|---|
| 零成本抽象 | 高级语言的表达力,汇编级的性能。没有运行时开销(no runtime) |
| 内存安全保证 | 所有权 + 借用 + 生命周期,编译器在编译时保证无空指针、无野指针、无数据竞争 |
| fearless 并发 | Send 和 Sync trait 让并发错误在编译时就被发现 |
(2) Rust vs C/C++ vs Go
| 维度 | C/C++ | Go | Rust |
|---|---|---|---|
| 内存管理 | 手动 malloc/free | GC(垃圾回收) | 所有权 + 借用检查(编译期) |
| 性能 | 极高 | 高(GC 有停顿) | 极高(零运行时) |
| 安全承诺 | 无(靠程序员) | 部分(GC 防内存泄漏) | 完整(编译时保证) |
| 并发模型 | pthreads(手动) | goroutine + channel | std::thread + Send/Sync trait |
| 包管理 | Makefile / CMake | go mod | Cargo(开箱即用) |
| 学习曲线 | 中高(指针劝退) | 低 | 中高(borrow checker) |
4. 安装 Rust
(1) 使用 rustup 安装
Rust 的推荐安装方式是通过 rustup:一个 Rust 版本管理工具。
# 在终端运行(Windows 需要先安装 Visual Studio C++ Build Tools)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装完成后,验证版本:
rustc --version # 输出:rustc 1.86.0 (05f9846f8 2025-03-31)
cargo --version # 输出:cargo 1.86.0 (一些版本号)
(2) Windows 特别说明
Windows 用户需要先安装 Visual Studio Build Tools(或 Visual Studio 2019+),勾选"使用 C++ 的桌面开发"工作负载。Rust 依赖 MSVC 链接器。
(3) 更新与卸载
rustup update # 更新到最新版本
rustup self uninstall # 卸载(保留缓存用 uninstall 而非直接删目录)
5. 第一个 Rust 程序
▶ 示例 1:Hello World(难度 ⭐)
// ============================================
// 第一个 Rust 程序:打印 Hello World
// ============================================
fn main() {
println!("Hello, world!");
}
输出:
Hello, world!
fn main()是每个 Rust 程序的入口。println!是一个宏(注意!),用于打印文本到终端。
▶ 示例 2:使用 Cargo 创建项目(难度 ⭐)
# 创建新项目
cargo new hello_cargo
cd hello_cargo
cargo new 会生成以下结构:
hello_cargo/
├── Cargo.toml # 项目配置文件(依赖、元信息)
├── src/
│ └── main.rs # 源代码入口
Cargo.toml 内容:
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
编译并运行:
cargo build # 编译(生成 target/debug/ 目录)
cargo run # 编译 + 运行
输出:
Hello, world!
Cargo 是 Rust 的包管理器和构建系统。
cargo build生成调试版,cargo run一键编译运行,cargo check只检查语法不生成二进制(更快)。
▶ 示例 3:简单计算器(难度 ⭐⭐)
// ============================================
// 一个简单的加法计算器
// ============================================
fn main() {
let a: i32 = 10; // i32 是 32 位有符号整数
let b: i32 = 20; // Rust 的类型标注用冒号
let sum = a + b;
println!("{} + {} = {}", a, b, sum);
}
输出:
10 + 20 = 30
Rust 的变量默认不可变。这里用
let声明,如果后续需要修改值,需要用let mut。类型标注: i32可选——编译器可以通过上下文推断类型。
▶ 示例 4:综合练习——温度转换与报告(难度 ⭐⭐)
// ============================================
// 综合示例:温度转换 + 简单报告生成
// 演示变量、类型、格式化输出等基础语法
// ============================================
fn celsius_to_fahrenheit(celsius: f64) -> f64 {
celsius * 9.0 / 5.0 + 32.0
}
fn fahrenheit_to_celsius(fahrenheit: f64) -> f64 {
(fahrenheit - 32.0) * 5.0 / 9.0
}
fn main() {
let cities = ["Beijing", "Shanghai", "Guangzhou"];
let temps_c = [28.5, 31.2, 33.8];
println!("=== 城市温度报告 ===");
println!("{:<12} {:>10} {:>10}", "城市", "摄氏(°C)", "华氏(°F)");
println!("{}", "-".repeat(34));
let mut index = 0;
while index < cities.len() {
let c = temps_c[index];
let f = celsius_to_fahrenheit(c);
println!("{:<12} {:>10.1} {:>10.1}", cities[index], c, f);
index += 1;
}
let freezing_f: f64 = 32.0;
let freezing_c = fahrenheit_to_celsius(freezing_f);
println!("\n冰点: {:.1}°F = {:.1}°C", freezing_f, freezing_c);
const BOILING_C: f64 = 100.0;
let boiling_f = celsius_to_fahrenheit(BOILING_C);
println!("沸点: {:.1}°C = {:.1}°F", BOILING_C, boiling_f);
}
输出:
=== 城市温度报告 ===
城市 摄氏(°C) 华氏(°F)
----------------------------------
Beijing 28.5 83.3
Shanghai 31.2 88.2
Guangzhou 33.8 92.8
冰点: 32.0°F = 0.0°C
沸点: 100.0°C = 212.0°F
这个综合示例涵盖了函数定义、常量声明、数组遍历、格式化输出和温度转换公式,是 Rust 基础语法的完整演练。
▶ 示例 5:猜数字游戏(难度 ⭐⭐)
use std::io;
fn main() {
let secret = 42; // 固定答案(后续课程会用随机数)
println!("🎯 猜数字游戏!范围 1-100");
loop {
println!("请输入你的猜测:");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("读取输入失败");
let guess: i32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("⚠️ 请输入有效数字!");
continue;
}
};
match guess.cmp(&secret) {
std::cmp::Ordering::Less => println!("太小了!⬆️"),
std::cmp::Ordering::Greater => println!("太大了!⬇️"),
std::cmp::Ordering::Equal => {
println!("🎉 恭喜你猜对了!答案就是 {}", secret);
break;
}
}
}
}
这个示例展示了
loop、match、标准库io、错误处理的基础用法——正是 Rust 官方教程的经典入门项目。
6. Rust 生态速览
Rust 的生态围绕三个核心工具:
| 工具 | 用途 | 命令 |
|---|---|---|
| rustc | Rust 编译器 | rustc main.rs |
| rustup | Rust 版本管理 | rustup toolchain install nightly |
| Cargo | 包管理 + 构建 | cargo build / run / test / doc |
开源包托管在 crates.io(https://crates.io),现有 15 万+ 个包。常用包如 serde(序列化)、clap(命令行参数)、tokio(异步运行时)。
❓ 常见问题
📖 小节
- Rust 是一门系统级编程语言,核心卖点是编译时内存安全 + 零成本抽象
- RUST 与 C/C++ 相比,自动管理内存;与 Go 相比,没有 GC 暂停
- 使用
rustup安装 Rust,支持多版本管理 Cargo是 Rust 的包管理和构建系统,cargo new/cargo build/cargo run三板斧- Rust 的所有权体系是它最独特的特性(将在第 8 课深入讲解)
- 生态核心在 crates.io,社区活跃且持续增长
📝 作业
- 难度 ⭐:用
cargo new创建一个名为my_first_rust的项目,修改main.rs打印你的名字,用cargo run运行。 - 难度 ⭐⭐:在示例 3 的基础上,增加减法、乘法和除法运算,观察不同类型的运算结果(整数除法会截断吗?)。
- 难度 ⭐⭐⭐:阅读
rustup doc打开的 Rust 官方文档,找到"所有权"(Ownership)章节,用你自己的话总结三句话发给身边的 Rust 开发者看看对不对。