Rust 是什么:先看懂它在解决什么问题
从「70% 的严重漏洞是内存漏洞」这个数据切入,讲清 Rust 的生态位、所有权思想的直觉版、五个关键词、版本节奏与第一次编译运行,附零基础常见困惑与学习路线。
Rust 是一门系统级编程语言:和 C/C++ 一样直接编译成机器码、没有垃圾回收器、能写操作系统内核;但它把「内存安全」从程序员的自觉变成了编译器的强制。自 2015 年发布 1.0 以来,它连续多年在 Stack Overflow 开发者调查中被评为「最受喜爱的编程语言」。本篇不教你写代码,只回答三个问题:Rust 为什么要存在、它的核心思想是什么、你该怎么开始学。
知识点地图
- 知识类别:语言动机与入门——Rust 的生态位、所有权思想的直觉版、第一次编译运行、零基础学习路线。
- 解决什么问题:还没写过 Rust 时「它为什么存在、凭什么值这个学习成本、和我会的语言什么关系」。
- 什么时候用到:决定要不要学 Rust 之前;给团队/朋友介绍 Rust 时的谈话大纲。
与 020 的分工:本篇管动机、所有权直觉与第一次运行;概念速览、版本节奏详述与工具链生态见《Rust 概览》(rust/020-RustOverview),rustup 安装操作见《环境搭建》(rust/030-RustEnvSetup)。
前置知识
- 编程基础:知道变量、函数、循环是什么,用哪门语言学都行。
- 不需要任何 C/C++ 经验;本文出现的每个新词都当场解释。
学习目标
读完本文你将能够:
- 用一句话说清 Rust 的生态位,以及它和 C/C++、Go 的分工;
- 理解「所有权」要解决的问题——哪怕还没写过一行 Rust;
- 分清 Rust 的两个版本维度(6 周一发的小版本与数年一发的 Edition);
- 知道从下一篇开始的学习路线怎么走。
预计 30 分钟。
1. 为什么会有 Rust:内存管理的历史难题
任何程序都要管理内存:创建数据、使用数据、释放数据。过去只有两条路线,各有代价:
| 流派 | 代表语言 | 怎么管内存 | 代价 |
|---|---|---|---|
| 手动管理 | C/C++ | 程序员自己申请释放 | 释放后使用、双重释放、越界访问 |
| 垃圾回收(GC) | Java/Python/Go | 运行时自动追踪回收 | 内存占用高、停顿不可预测 |
手动管理的性能无可挑剔,但人总会犯错——微软与 Google 公布的统计均显示,其产品中约 70% 的严重安全漏洞属于内存安全类。垃圾回收把人从释放里解放出来,但运行时要拖着一套 GC,停顿时机不可预测——这对操作系统、数据库、嵌入式设备不可接受。
Rust 给出第三条路——所有权(ownership)系统:编译器在编译期用一套精确规则检查每块内存的「归属」,程序能编译通过,就证明它运行时不会犯这类错。既没有手动释放的心智负担,也没有 GC 的运行时开销。
用类比收拢一下:手动管理像自己记账交房租(快,但容易算错);垃圾回收像请了个专职管家(省心,但管家要占地方、偶尔让大家停下等它盘点);所有权像一套签合同时就审核通过的规则——合同写得不对,签字(编译)环节直接打回,运行起来再无后顾之忧。
这不是宣传口号,是有产业背书的现实:微软用 Rust 重写 Windows 内核组件,Google 把 Rust 纳入 Android 与 Chromium,亚马逊用它构建关键云基础设施(Firecracker 虚拟化引擎),Linux 内核也已正式接纳 Rust 代码。
2. 所有权:Rust 灵魂的直觉版
所有权规则的核心之一是「移动」:把值赋给新变量时,所有权随之转移,旧变量失效。
fn main() {
let s1 = String::from("你好"); // s1 拥有这份数据
let s2 = s1; // 所有权移交给 s2,s1 失效
// println!("{}", s1); // 编译错误:s1 的值已被移动(E0382)
println!("{}", s2); // 正常,输出:你好
}在其他语言里,s2 = s1 之后 s1 通常还能用;在 Rust 里直接编译不过。这不是苛刻,而是精心设计:如果 s1、s2 同时有效,离开作用域时同一块内存会被释放两次。Rust 用「移动」在编译期就掐灭了这类事故。
把编译器当作最严格的导师,是学 Rust 的正确心态——前期「编译不过」的挫败,换来的是上线后极低的崩溃率:空指针、悬垂引用、数据竞争这些其他语言的运行期事故,在 Rust 里根本无法通过编译。好消息是,Rust 的报错信息是所有语言里最友好的:出错位置、原因解释、修复建议三件套齐全,本仓库借用检查器报错实战一篇就专门带你看报错。
3. 五个关键词:Rust 到底好在哪
1. 性能:没有垃圾回收、没有解释器、没有虚拟机,泛型与迭代器这些高级抽象在编译期被消除(零开销抽象),性能与 C/C++ 同一梯队。
2. 内存安全:所有权加借用检查在编译期证明每一块内存的访问合法——上面那七成漏洞的源头类别,在编译期就被拒绝。
3. 无畏并发:数据竞争在编译期被类型系统(Send/Sync)拦截,多线程代码「能编译就能跑」的信心远超其他语言。
4. 现代工具链:Cargo 一条龙管理依赖、构建、测试、文档、发布;rustfmt 统一格式、clippy 静态检查。对比 C/C++ 碎片化的构建生态,这是幸福感差距最大的地方。
5. 表达力:枚举与模式匹配、trait、迭代器、宏——用精炼的代码描述复杂逻辑,且不牺牲运行时性能。
这些特性落地的领域:
| 方向 | 代表项目/框架 | 为什么适合 |
|---|---|---|
| 命令行工具 | ripgrep、fd、bat | 启动快、单文件分发、无运行时依赖 |
| Web 后端 | Axum、Actix Web | 高吞吐低延迟,内存占用小 |
| 操作系统与嵌入式 | Linux 内核模块、embedded-hal | 无 GC、可预测的内存布局 |
| 跨平台应用 | Tauri(桌面)、WASM(浏览器) | 体积小、性能接近原生 |
| 基础设施 | 数据库、代理、虚拟化 | 长时间运行不崩溃、无 GC 停顿 |
4. 版本节奏:两句话就够
初学阶段只需要记两句话:小版本每 6 周发布一个稳定版,跟随最新即可(rustup update);Edition 是数年一次的兼容性里程碑,新项目直接用 Rust 2024 edition。版本观与工具链生态的完整展开见《Rust 概览》(rust/020-RustOverview)第 4 节,安装操作见 rust/030。
5. 第一次编译运行
安装好工具链后(完整步骤见环境搭建与工具链),标准流程走 Cargo:
cargo new hello # 创建项目骨架
cd hello
cargo run # 编译并运行终端输出 Hello, world!。把 src/main.rs 换成下面的代码,感受一下语法气质——顺便用上贯穿本系列教程的设定:我们要写一个虚拟歌手音乐平台的小程序:
fn main() {
let singers = ["初雪", "星尘", "海伊"]; // 平台上的三位歌姬
for name in singers { // for 遍历,无越界风险
println!("你好,{name}"); // {name} 直接内插变量
}
}预期输出:
你好,初雪
你好,星尘
你好,海伊cargo new 顺手生成的还不只是代码:Cargo.toml 清单、.git 仓库、src/ 目录一次到位。之后 cargo build 编译、cargo test 跑测试、cargo doc 生成文档,全部一条命令——这种官方一体化体验,是 Rust 工程师幸福感的直接来源。
修改实验:把 singers 里的一个字符串删掉引号再 cargo run,读一遍编译器的报错——它已经告诉你错在哪行、大概怎么改。这个「报错即教学」的体验会贯穿整个学习过程。
6. 常见困惑
「零基础直接学 Rust 可以吗?」——可以,但所有权概念需要耐心。本仓库建议主线先学一门带垃圾回收的语言(JavaScript 或 Python)建立编程思维,再进入 Rust,曲线会平缓很多;若目标就是系统方向,直接从 Rust 开始也完全可行,只是要接受前期更多的编译报错。
「编译器一直报错怎么办?」——这正是 Rust 的教学过程。按报错提示逐条修复即可;本仓库把最高频的 E0382、E0502、E0597 三个报错做成了专篇(借用检查器报错实战)。编译通过的 Rust 程序,一大类内存错误已经不可能存在。
「Rust 和 Go/C++ 怎么选?」——追求开发速度、做网络服务,Go 上手更快;维护既有 C++ 代码或做游戏引擎,C++ 生态更成熟;需要「性能 + 安全 + 长期可维护」三者兼得的新项目(基础设施、高性能服务、系统工具),Rust 是当前最优解之一。三语言逐项对照可读 C++ 与 Rust 对比。
「学 Rust 能找到工作吗?」——Rust 岗位集中在基础设施、区块链、数据库、云厂商与新兴科技公司,绝对数量少于 Java/Python,但供需比健康、竞争者少;且 Rust 训练出的内存与并发模型理解力,对学习任何语言都有迁移价值。
7. 学习路线建议
- 第一阶段(1-2 周):环境搭建、基础语法、所有权与借用——这是 Rust 的地基,务必配合练习动手,仅靠阅读无法建立直觉。
- 第二阶段(2-4 周):结构体/枚举/模式匹配、错误处理、集合与迭代器、泛型与 trait——写出「像样的 Rust」。
- 第三阶段(持续):生命周期、智能指针、并发与异步、宏、Cargo 工程化——走向生产级代码。
8. 小练习
- 安装工具链后跑通第 5 节的三行命令,记录从敲下
cargo new到看到输出的总耗时; - 把第 5 节代码改成输出「第 n 位:初雪」的编号格式(提示:
enumerate()可以之后查,先试for (i, name) in singers.iter().enumerate()); - 去Stack Overflow 年度开发者调查页面找到 Rust 的「最受喜爱」排名与占比,感受社区热度;
- 在 crates.io 搜
ripgrep与axum,看一眼 crate 主页长什么样——下一篇你就会拥有自己的 crate。
9. 自我检查
- 两条传统内存管理路线各付出什么代价?Rust 的第三条路是什么?
- 「约 70% 的严重安全漏洞」指哪一类?Rust 在什么阶段拒绝它们?
let s2 = s1;之后s1为什么不能用了?这个设计防住了什么事故?- Rust 的小版本和 Edition 分别多久发一次?新项目该选哪个 edition?
cargo run和cargo test分别做什么?
本章总结
Rust 的生态位一句话:达到 C/C++ 的运行性能,同时从语言层面消灭内存类崩溃与漏洞。它用编译期的所有权规则替代手动管理与垃圾回收,把约七成安全漏洞的源头类别挡在编译期;工程上靠 Cargo 一体化工具链与 6 周一版的稳定节奏维持现代化。初学者的两个动作:装最新稳定版、新项目用 2024 edition;一个心态:把编译器当导师,报错即教学。
下一步
下一篇 Rust 语言概述与学习路线展开语言全景;想尽快动手,直接跳到 环境搭建与工具链装好环境也可以。