2026-04-02
今日目标
- 理解 Rust 是什么,以及它的设计目标
- 了解 Rust 的发展历史和主要特性
- 掌握 Rust 的核心优势:内存安全、零成本抽象、并发安全
- 完成 Rust 环境安装,创建第一个 Cargo 项目
核心概念
1. 什么是 Rust?
Rust 是一门系统级编程语言,由 Mozilla 研究院开发,于 2010 年首次发布。
设计目标:
"Rust 是一门赋予每个人构建可靠且高效软件能力的语言。"
核心定位:
- 🛡️ 内存安全 — 编译时防止内存错误
- ⚡ 高性能 — 零成本抽象,媲美 C/C++
- 🧵 并发安全 — 编译时防止数据竞争
- 🎯 可靠性 — 丰富的类型系统和错误处理
2. Rust 的发展历史
2006 ─ Graydon Hoare 开始设计 Rust
│
2010 ─ Mozilla 正式发布 Rust 0.1
│
2012 ─ Rust 进入自举(用 Rust 写 Rust 编译器)
│
2015 ─ Rust 1.0 稳定版发布 🎉
│
2016 ─ Rust 成为 Stack Overflow 最受欢迎语言
│
2020 ─ Linux 内核开始接受 Rust 代码
│
2021 ─ Rust 基金会成立
│
2023 ─ Linux 6.1 正式支持 Rust
│
2024+ ─ Rust 持续繁荣,云原生领域广泛应用
重要里程碑:
- 2015 — Rust 1.0 发布,承诺稳定 API
- 2018 — Rust 2018 Edition,模块系统改进
- 2021 — Rust 2021 Edition,新特性引入
- 2023 — 进入 Linux 内核,成为系统编程新选择
3. Rust 的核心特性
3.1 内存安全(Memory Safety)
传统语言的内存问题:
| 问题 | C/C++ | Java/Go | Rust |
|---|---|---|---|
| 空指针 | ❌ 运行时崩溃 | ✅ GC 保护 | ✅ 编译时检查 |
| 悬垂指针 | ❌ 未定义行为 | ✅ GC 保护 | ✅ 所有权检查 |
| 缓冲区溢出 | ❌ 安全漏洞 | ✅ 边界检查 | ✅ 编译时检查 |
| 数据竞争 | ❌ 难以调试 | ✅ 运行时检查 | ✅ 编译时检查 |
| 内存泄漏 | ❌ 可能发生 | ✅ GC 回收 | ⚠️ 可能(但少见) |
Rust 的解决方案:所有权系统
// 所有权规则(编译时检查)
// 1. 每个值有且只有一个所有者
// 2. 当所有者离开作用域,值被释放
// 3. 所有权可以转移(Move)
let s1 = String::from("hello"); // s1 拥有这个字符串
let s2 = s1; // 所有权转移给 s2
// println!("{}", s1); // ❌ 编译错误!s1 不再有效
3.2 零成本抽象(Zero-Cost Abstractions)
什么是零成本抽象?
高级特性不带来运行时开销,编译后代码与手写 C 一样高效。
// 高级抽象:迭代器
let sum: i32 = (1..=100).filter(|x| x % 2 == 0).sum();
// 编译后 ≈ 手写循环,性能相同
// 没有运行时开销!
对比其他语言:
- Java — 泛型有装箱拆箱开销
- C++ — 模板编译慢,代码膨胀
- Rust — 单态化(Monomorphization),零开销
3.3 并发安全(Fearless Concurrency)
Rust 的并发模型:
┌─────────────────────────────────────────────┐
│ Rust 并发安全保证 │
├─────────────────────────────────────────────┤
│ │
│ 编译时检查 + 类型系统 = 无数据竞争 │
│ │
│ Send trait ──→ 可以跨线程传递所有权 │
│ Sync trait ──→ 可以跨线程共享引用 │
│ │
│ 违反规则?编译错误!不是运行时崩溃 │
│ │
└─────────────────────────────────────────────┘
示例:
use std::thread;
let data = vec![1, 2, 3];
// ❌ 编译错误!不能同时读写
thread::spawn(|| {
data.push(4); // 错误:不能捕获可变引用
});
println!("{:?}", data); // 这里也在使用 data
4. Rust 的应用场景
| 领域 | 代表项目 | 优势 |
|---|---|---|
| 系统编程 | Linux 内核、Redox OS | 替代 C/C++,更安全 |
| Web 后端 | Actix、Tokio、Axum | 高性能,低延迟 |
| 区块链 | Solana、Substrate | 安全、高效 |
| 游戏引擎 | Bevy、Fyrox | 性能 + 安全 |
| CLI 工具 | ripgrep、fd、exa | 快速、可靠 |
| WebAssembly | wasm-bindgen、Yew | 前端新选择 |
| 嵌入式 | Embassy、RTIC | 无运行时开销 |
5. Rust vs 其他语言
性能: C/C++ ≈ Rust > Go > Java > Python
安全性: Rust > Go/Java > Python > C/C++
开发效率: Python > Go > Rust > Java > C/C++
学习曲线: Rust > C++ > Java > Go > Python
Rust 的独特位置:
- 性能接近 C/C++
- 安全性超越 Java/Go
- 现代语言特性(模式匹配、代数数据类型)
代码实例
实例1:Hello World
// main.rs
fn main() {
println!("Hello, world!");
}
运行:
$ rustc main.rs
$ ./main
Hello, world!
实例2:Cargo 项目结构
# 创建新项目
$ cargo new hello_cargo
$ cd hello_cargo
# 查看项目结构
$ tree
hello_cargo/
├── Cargo.toml # 项目配置和依赖
└── src/
└── main.rs # 主代码
# Cargo.toml 内容
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
[dependencies]
# src/main.rs
fn main() {
println!("Hello, Cargo!");
}
实例3:Cargo 常用命令
# 构建项目
cargo build # 开发构建(debug)
cargo build --release # 发布构建(优化)
# 运行项目
cargo run # 编译并运行
cargo run --release # 发布模式运行
# 测试
cargo test # 运行测试
# 检查代码(不编译)
cargo check # 快速检查语法和类型
# 生成文档
cargo doc # 生成文档
cargo doc --open # 生成并打开
# 格式化代码
cargo fmt
# 代码检查
cargo clippy # Rust 的 lint 工具
# 更新依赖
cargo update
实例4:变量和可变性
fn main() {
// 不可变变量
let x = 5;
// x = 6; // ❌ 错误!不能修改不可变变量
// 可变变量
let mut y = 5;
y = 6; // ✅ 可以修改
// 常量
const MAX_POINTS: u32 = 100_000;
// 遮蔽(Shadowing)
let x = x + 1; // 新的 x,遮蔽旧的 x
let x = x * 2;
println!("x = {}", x); // x = 12
println!("y = {}", y); // y = 6
}
练习题
练习1:创建第一个 Cargo 项目
任务:
- 使用
cargo new创建一个名为my_first_rust的项目 - 修改
main.rs,输出你的名字和一句问候语 - 使用
cargo run运行
提示:
fn main() {
let name = "你的名字";
println!("Hello, {}! Welcome to Rust!", name);
}
练习2:变量可变性
任务: 编写程序完成以下操作:
- 声明一个不可变变量
temperature,初始值为 25 - 尝试修改它(观察编译错误)
- 改为可变变量,成功修改
参考答案:
点击展开
fn main() {
// let temperature = 25;
// temperature = 30; // 编译错误!
let mut temperature = 25;
println!("当前温度: {}", temperature);
temperature = 30;
println!("更新后温度: {}", temperature);
}
练习3:探索 Cargo.toml
任务:
- 打开
Cargo.toml文件 - 添加一个依赖(如
rand = "0.8") - 运行
cargo build观察下载依赖过程 - 查看
Cargo.lock文件
常见问题
Q1: Rust 为什么学习曲线陡峭?
原因:
- 所有权系统 — 新概念,需要时间理解
- 编译器严格 — 错误信息多,但非常友好
- 生命周期 — 引用有效性管理
建议:
- 耐心阅读编译错误信息(Rust 的错误提示很详细)
- 多写代码,在实践中理解
- 使用
rustlings练习
Q2: Rust 有垃圾回收吗?
没有! Rust 通过所有权系统在编译时管理内存:
- 离开作用域自动释放
- 无运行时 GC 开销
- 可预测的性能
Q3: Rust 适合做什么?
特别适合:
- 系统编程(操作系统、驱动)
- 高性能服务(Web 后端)
- 嵌入式开发
- WebAssembly
- CLI 工具
不太适合:
- 快速原型(Python 更快)
- 简单脚本
- 团队没有 Rust 经验的大型项目
Q4: 如何学习 Rust?
推荐路径:
- 阅读《Rust 程序设计语言》(官方教程)
- 完成 rustlings 练习
- 做项目实践
- 阅读源码
最佳实践
1. 使用 Cargo
总是用 Cargo 管理项目,不要直接用 rustc。
2. 善用编译错误
Rust 编译错误非常详细,仔细阅读错误信息。
3. 遵循命名规范
- 函数/变量:
snake_case - 类型/结构体:
PascalCase - 常量:
SCREAMING_SNAKE_CASE
4. 使用 rustfmt 和 clippy
cargo fmt # 自动格式化
cargo clippy # 代码检查
参考资料
Date: 2026-04-02