前置知识: 计算机基础

Rust 是什么:先看懂它在解决什么问题

10 min入门

从「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++ 经验;本文出现的每个新词都当场解释。

学习目标

读完本文你将能够:

  1. 用一句话说清 Rust 的生态位,以及它和 C/C++、Go 的分工;
  2. 理解「所有权」要解决的问题——哪怕还没写过一行 Rust;
  3. 分清 Rust 的两个版本维度(6 周一发的小版本与数年一发的 Edition);
  4. 知道从下一篇开始的学习路线怎么走。

预计 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 灵魂的直觉版

所有权规则的核心之一是「移动」:把值赋给新变量时,所有权随之转移,旧变量失效。

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:

bash
cargo new hello   # 创建项目骨架
cd hello
cargo run         # 编译并运行

终端输出 Hello, world!。把 src/main.rs 换成下面的代码,感受一下语法气质——顺便用上贯穿本系列教程的设定:我们要写一个虚拟歌手音乐平台的小程序:

rust
fn main() {
    let singers = ["初雪", "星尘", "海伊"];  // 平台上的三位歌姬
    for name in singers {                    // for 遍历,无越界风险
        println!("你好,{name}");            // {name} 直接内插变量
    }
}

预期输出:

text
你好,初雪
你好,星尘
你好,海伊

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. 小练习

  1. 安装工具链后跑通第 5 节的三行命令,记录从敲下 cargo new 到看到输出的总耗时;
  2. 把第 5 节代码改成输出「第 n 位:初雪」的编号格式(提示:enumerate() 可以之后查,先试 for (i, name) in singers.iter().enumerate());
  3. 去Stack Overflow 年度开发者调查页面找到 Rust 的「最受喜爱」排名与占比,感受社区热度;
  4. 在 crates.io 搜 ripgrep 与 axum,看一眼 crate 主页长什么样——下一篇你就会拥有自己的 crate。

9. 自我检查

  1. 两条传统内存管理路线各付出什么代价?Rust 的第三条路是什么?
  2. 「约 70% 的严重安全漏洞」指哪一类?Rust 在什么阶段拒绝它们?
  3. let s2 = s1; 之后 s1 为什么不能用了?这个设计防住了什么事故?
  4. Rust 的小版本和 Edition 分别多久发一次?新项目该选哪个 edition?
  5. cargo run 和 cargo test 分别做什么?

本章总结

Rust 的生态位一句话:达到 C/C++ 的运行性能,同时从语言层面消灭内存类崩溃与漏洞。它用编译期的所有权规则替代手动管理与垃圾回收,把约七成安全漏洞的源头类别挡在编译期;工程上靠 Cargo 一体化工具链与 6 周一版的稳定节奏维持现代化。初学者的两个动作:装最新稳定版、新项目用 2024 edition;一个心态:把编译器当导师,报错即教学。

下一步

下一篇 Rust 语言概述与学习路线展开语言全景;想尽快动手,直接跳到 环境搭建与工具链装好环境也可以。