Rust 是什么
这一课你将能做到
- 说清楚 Rust 解决什么问题,以及它和 Java 在运行模型上的核心差异
- 安装 Rust 工具链(rustup、cargo),跑通第一个程序
- 用 cargo 创建、检查、编译、运行项目,看懂 Cargo.toml
为什么要学
Rust 是一门「在编译期就把内存错误拦下来」的系统级语言:性能对标 C/C++,没有 GC 停顿,也没有空指针、悬垂指针、数据竞争这三类经典事故。对高性能后端来说,这意味着可预测的尾延迟。
本站的判题服务、高频接口这类场景正是 Rust 的主场:单请求处理耗时的可预测性远超 GC 语言,内存占用低一个量级。学 Rust 不是为了替代 Java,而是掌握第二把武器之后,知道什么场景该拔哪一把。
人话:Java 把内存安全交给 GC 在运行时兜底,代价是停顿和开销;Rust 把这件事提前到编译期,用「所有权」规则让编译器替你检查,代价是前期学习曲线陡。
另外两条现实理由:一是 Rust 连续多年稳居「最受喜爱编程语言」榜首,大厂在数据库内核、云基础设施、区块链方向的岗位持续增长;二是它的类型系统思想(所有权、trait、模式匹配)会反向提升你写 Java 的建模水平——Java 21 的 sealed interface 和模式匹配 switch 正是在向 Rust 靠拢。
先建立图像
两种运行模型对比:
Java:源码 → 字节码 → JVM(GC 兜底内存)→ 运行时检查
Rust:源码 → 编译期检查(所有权/借用/生命周期)→ 原生机器码 → 直接运行
第一个程序:
fn main() {
let msg = "你好,Rust";
println!("{msg}");
}
没有虚拟机、没有类定义、没有样板代码,cargo run 一步到位出结果。
生态位对照:
| 维度 | Java | Rust |
|---|---|---|
| 运行载体 | JVM + 字节码 | 原生机器码 |
| 内存回收 | GC(分代、STW) | 所有权(编译期 drop) |
| 包管理构建 | Maven / Gradle | cargo |
| 并发模型 | 线程 + 锁 + 虚拟线程 | 所有权 + Send/Sync + async |
| 典型短板 | 尾延迟波动、内存占用高 | 编译慢、学习曲线陡 |
跟着做
步骤 1:安装工具链
Windows 下用 winget 安装官方 rustup(完成后新开一个终端):
winget install Rustlang.Rustup
rustup --version
rustup 是工具链管理器,对标 Java 世界的 SDKMAN:管理 rustc(编译器)、cargo(构建与包管理工具)和标准库文档。
Linux / macOS 一条命令:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
步骤 2:创建项目
cargo new hello-rust
cd hello-rust
生成的目录结构:
hello-rust/
├── Cargo.toml ← 项目清单,对标 pom.xml / build.gradle
└── src/
└── main.rs ← 程序入口
步骤 3:看懂 Cargo.toml
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
[dependencies]
edition 是语言版本线(2021 edition 是当前主流),不是编译器版本号;编译器版本由 rustup 管理。依赖声明一行搞定:[dependencies] 下写 名字 = "版本",对标 Maven 坐标但省掉 XML。
步骤 4:编译与运行
cargo run # 编译 + 运行
cargo check # 只做类型与所有权检查,不生成产物,验证代码最快的命令
cargo build --release # 开优化编译,产物在 target/release/
开发阶段高频用 cargo check,比完整编译快得多;交付时才用 --release。
步骤 5:改出第一个交互程序
把 src/main.rs 换成:
use std::env;
fn main() {
let name = env::args().nth(1).unwrap_or_else(|| "朋友".to_string());
println!("你好,{name}!这是你的第一个 Rust 程序。");
}
运行:cargo run -- 张三。env::args() 读命令行参数,对标 Java 的 String[] args;unwrap_or_else 提供缺省值,从类型上杜绝「参数不存在」的隐患。
讲清楚要点
- cargo 是一站式工具:建项目、编译、测试、跑基准、生成文档、发布全用它,对标 Maven + Gradle 的合体,没有碎片化配置。
- 编译期检查是护城河:空指针、悬垂引用、数据竞争在 Rust 里是编译错误,不是线上事故。
- 零成本抽象:迭代器、泛型这些高级特性编译后与手写底层循环性能一致,不付运行时代价(对比 Java 泛型擦除与自动装箱)。
- 版本基线:本课程代码基于 Rust 1.75+ 与 2021 edition,用
rustc --version自检。 - 文档与测试内建:
cargo doc生成带跳转的 API 文档,cargo test跑单元测试,cargo fmt统一格式——Java 里要凑齐 Javadoc、JUnit、Checkstyle 三件套的能力,cargo 原生自带。
你可能会懵的地方
-
rustup、rustc、cargo 什么关系? rustup 管工具链(装哪个版本),rustc 是编译器本体,cargo 是构建与包管理的统一入口。日常 99% 时间只敲 cargo,它内部调用 rustc。
-
Rust 没有 GC,谁负责释放内存? 编译器在编译期插入释放代码:变量离开作用域立即释放(RAII)。安全性与 GC 等价,且零运行时开销。
-
和 C++ 区别在哪? C++ 靠程序员自觉加运行时工具兜底;Rust 把规则写进编译器,不遵守就编译不过。用一部分自由度换纪律。
-
会 Java 的话,学 Rust 最大的坎是什么? 所有权与借用(第三课)。语法层面反而更简单——Rust 没有继承,用组合加 trait 就够了。
-
Windows 编译报 linker not found? 缺 MSVC 链接器。安装 Visual Studio Build Tools 并勾选「使用 C++ 的桌面开发」工作负载即可。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
在项目目录外直接 cargo run | cargo 找不到 Cargo.toml | 先进入项目根目录再执行 |
用 rustc main.rs 手动编译 | 依赖一多立刻失控 | 统一走 cargo |
| 项目路径含中文或空格 | 部分工具链环节出错 | 用纯英文、无空格路径 |
开发阶段反复 cargo build --release | 每次全量优化编译极慢 | 日常用 cargo check / cargo run |
| 改完代码不保存就 run | 跑的是旧产物 | 保存后再 run,核对编译输出时间 |
卡点急救
cargo命令不存在:安装 rustup 后必须新开终端让 PATH 生效;仍不行就把%USERPROFILE%\.cargo\bin手动加入 PATH。- 下载依赖极慢:在
~/.cargo/config.toml配置国内镜像(rsproxy 或 USTC 源)。 - 报 error: linker
link.exenot found:安装 Visual Studio Build Tools 的 C++ 工作负载后重试。
面试常问
-
Rust 和 Java 最本质的区别是什么? 内存管理模型:Java 靠 GC 运行时兜底,有 STW 停顿;Rust 靠所有权在编译期确定每块内存的释放点,零运行时开销、无 GC 停顿,尾延迟可预测。
-
没有 GC 为什么还能内存安全? 所有权系统加借用检查器在编译期保证三条规则:每块内存有唯一所有者、引用不会比被引用者活得久、可变引用独占。悬垂指针、二次释放、数据竞争被编译期堵死。
-
Rust 适合什么场景? 对延迟和资源敏感的底层与高性能服务:判题内核、网关、数据库内核、嵌入式、CLI 工具;也适合替换 C/C++ 存量模块。
自测三问
- cargo、rustc、rustup 三者各负责什么?
cargo check和cargo build --release分别在什么场景使用?- Cargo.toml 里的 edition 指的是什么?
小结一句话
Rust 用「编译期所有权检查」换来 C 级性能与内存安全,cargo 让工程化体验不输 Java;工具链跑通,就完成了最难的第一步。
延伸
- The Rust Book ch01:入门
- 下一课:基础语法——变量、函数、控制流,半小时写完一个耗时统计小工具。