这次我们来看 Rust。它不是新语言,但最近的热搜词里,Rust 出现的密度明显变高了:有人讨论 IDEA 未来会不会用 Rust 重写,有人用 Rust 写 AI Agent,有人把 Rust 用在 OPC UA 工业通信场景,搜索“Tauri + Rust 桌面应用 demo”和“Rust 基因计算器”的人也在变多。对于一个从 2015 年发布 1.0 算起、已经发展了十年的系统级语言来说,这种关注度说明它正在从“值得学的语言”变成“被实际项目选中的语言”。
这篇文章按最容易跑通的路线走:装好工具链、创建第一个 Cargo 项目、理解所有权和借用、跑通一个 HTTP 接口服务,再看 Tauri、AI Agent、工业协议这些方向怎么往里走。文章不追求把所有语法讲完,只保证你读完以后能独立完成“安装—编译—运行—调接口—排错”这一整条链路。适合已经会 Python、Java、JavaScript 或 Go 其中一门语言,想把 Rust 真正用起来的读者。
1. Rust 是什么与核心能力速览
Rust 是 Mozilla 发起、由 Graydon Hoare 设计的系统级编程语言,Rust 1.0 于 2015 年 5 月发布,目前由 Rust 基金会维护。它的核心卖点可以概括为一句话:在没有垃圾回收(GC)的前提下,同时拿到接近 C/C++ 的性能和编译期保证的内存安全、线程安全。
| 项目 | 说明 |
|---|---|
| 语言定位 | 系统级编程语言,追求性能、内存安全、线程安全 |
| 发布时间 | Rust 1.0 于 2015 年 5 月发布,工具链和语言版本仍在持续演进 |
| 核心机制 | 所有权、借用、生命周期,编译期检查内存,不需要 GC |
| 工具链 | rustup 管理工具链,cargo 管理依赖和构建,rustfmt/clippy 负责格式化与静态检查 |
| 典型应用 | 网络服务、CLI 工具、WebAssembly、桌面应用(Tauri)、嵌入式、工业协议 |
| 学习门槛 | 中等偏上,主要难点集中在所有权、借用和生命周期 |
| 社区状态 | crates.io 生态活跃,官方文档完善,在 Stack Overflow 开发者调查中常年位居最受喜爱语言前列 |
对刚入门的读者来说,最值得记住的不是语法细节,而是三件事:第一,Rust 的编译期检查非常严格,很多问题在编译阶段就会被拦住,运行期崩溃会少很多;第二,cargo 是整个生态的入口,创建项目、加依赖、测试、发布都靠它;第三,Rust 的学习曲线不是平均分布,所有权那关过了,后面的异步、宏、生态库学起来会顺很多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么最近又频繁聊 Rust
Rust 不是突然出现的,但是最近这几个高频话题把它推到了更多人面前。逐一说明它们是怎么回事,以及哪些是事实、哪些还在讨论中。
2.1 桌面应用:Tauri 把 Rust 带到前端工程师面前
Tauri 是一个基于 Rust 的桌面应用框架,前端继续使用 WebView 和 Web 技术,后端逻辑用 Rust 编写。和 Electron 相比,Tauri 产物的安装包体积通常会显著更小,内存占用也更有优势,前端工程师可以用同样的 HTML/CSS/JS 技能栈去接触 Rust。Tauri 2.0 已经发布,官方脚手架成熟,这也是“Tauri + Rust 桌面应用 GitHub demo”搜索热度高的直接原因。如果你之前只用过 Electron,Rust 入门后去跑一个 Tauri demo 是性价比很高的验证路径。
2.2 IDE 重写讨论:还没定论,但信号很多
“IDEA 未来会使用 Rust 重写吗”是社区讨论热点,但需要把事实和传闻分开。JetBrains 官方没有正式宣布用 Rust 重写 IntelliJ IDEA,准确的说法是:JetBrains 近年来释放了大量 Rust 相关招聘和技术分享信号,同时也一直在大幅优化 IDE 性能。更宏观的背景是,Linux 内核从 6.1 开始引入了 Rust 支持,微软也在多个组件中评估 Rust,Cloudflare 的 Pingora 就是用 Rust 实现的 HTTP 代理组件。也就是说,Rust 进入“基础设施级”项目已经不是要不要的问题,而是已经在发生。
2.3 AI Agent:Rust 开始出现在 LLM 应用层
基于 Rust 语言的 AI Agent 是最近增长很快的方向。生态里已经出现了一批用于深度学习的库,例如 Hugging Face 的 candle、社区里的 burn,以及面向 LLM 应用和 Agent 编排的框架。Rust 在 AI Agent 场景的优势主要有三点:类型安全让工具调用和状态流转更可控;高并发和低延迟适合做多路模型调用;无 GC 带来的内存行为更可预测,适合部署在资源受限的服务上。需要提醒的是,这个方向变化非常快,框架选型不要盲目跟风,先跑通最基础的 LLM API 调用,再逐步加工具层和状态层更稳妥。
2.4 工业协议与计算密集场景:OPC UA、基因计算器
OPC UA 是工业自动化领域的标准通信协议,Rust 社区有对应的协议实现,例如 rust-opcua 等 crate,适合写数据采集网关、设备接入服务。这类代码一旦进入生产环境,会直接接触设备和控制网络,协议兼容性、加密、鉴权都必须先在隔离测试环境验证,不能拿生产设备直接试。
另一个搜索热词是“Rust 基因计算器”。这类工具多出现在生物信息方向,用 Rust 做基因序列或位点计算,核心诉求是算得快、内存占用可控。需要额外提醒,涉及基因数据解读的工具,结论必须与权威数据库和临床机构交叉验证,个人项目只适合做学习和技术验证,不建议直接用于医学判断。
3. 环境准备与 Rust 安装
Rust 安装本身不复杂,核心工具是 rustup。rustup 负责管理工具链版本,cargo 负责依赖和构建,rustc 是编译器。下面分平台说明。
3.1 Windows 安装
Windows 上最推荐的做法是下载 rustup-init.exe 并运行。安装过程中会有交互选项,新手直接用默认配置即可。也可以使用 winget:
powershell复制# 方式一:下载 rustup-init.exe 后,在终端执行
.\rustup-init.exe -y --default-toolchain stable
# 方式二:winget 安装
winget install Rustlang.Rustup
Windows 默认使用 MSVC 工具链,编译时需要 Microsoft C++ Build Tools 提供链接器。如果本机之前没装过 Visual Studio 或 VS Build Tools,rustup 安装完成后编译 Cargo 项目可能会报 “link.exe not found”。解决办法是安装 Visual Studio 2022 Build Tools,勾选“使用 C++ 的桌面开发”工作负载;如果不想用 MSVC,也可以切换到 GNU 工具链,通过 rustup toolchain install stable-x86_64-pc-windows-gnu 安装,后续项目使用该工具链编译。
3.2 macOS 和 Linux 安装
macOS 和 Linux 使用官方安装脚本:
bash复制curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
脚本执行完成后,需要让环境变量生效:
bash复制source "$HOME/.cargo/env"
macOS 如果编译时报缺链接器,一般需要安装 Xcode Command Line Tools:
bash复制xcode-select --install
Linux 下如果编译 C 依赖的 crate,需要保证 gcc、make 等基础编译工具已安装。
3.3 验证安装
安装完成后,分别执行三条命令确认版本:
bash复制rustc --version
cargo --version
rustup --version
能看到版本号,说明工具链已经可用。需要更新时执行:
bash复制rustup update
3.4 VS Code 与 rust-analyzer
编辑器建议直接使用 VS Code,安装 rust-analyzer 插件。rust-analyzer 提供代码补全、类型提示、跳转定义、错误信息内联显示,对新手理解编译错误帮助很大。较新的 Rust 工具链也可以用 rustup component add rust-analyzer 安装组件,具体以官方工具链说明为准。如果插件提示找不到工具链,先检查 rustup default 是否输出了正确的默认工具链。
3.5 crates.io 镜像配置
国内网络环境下,直接访问 crates.io 索引可能超时或下载缓慢。可以在 cargo 配置里替换为国内镜像源。配置文件在 Windows 上是 %USERPROFILE%\.cargo\config.toml,macOS/Linux 上是 ~/.cargo/config.toml。下面的内容以 rsproxy 镜像为例,具体地址以镜像提供方的最新说明为准:
toml复制[source.crates-io]
replace-with = "rsproxy-sparse"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[net]
git-fetch-with-cli = true
配置完成后,重新执行 cargo build 即可生效。不要同时配置多个替换源,以免索引缓存冲突。
4. 用 Cargo 创建第一个 Rust 项目
cargo 是 Rust 的项目管理工具,可以理解成“包管理 + 构建系统 + 测试运行时”三合一。新建项目用一行命令:
bash复制cargo new hello_rust
cd hello_rust
执行后目录里会出现两个文件。
Cargo.toml 的内容类似这样:
toml复制[package]
name = "hello_rust"
version = "0.1.0"
edition = "2021"
# 新版工具链可能生成 edition = "2024",以 cargo new 实际输出为准
src/main.rs 的内容是:
rust复制fn main() {
println!("Hello, Rust!");
}
然后执行编译和运行:
bash复制cargo check # 只做类型和借用检查,不生成二进制,日常开发最快
cargo build # 编译 debug 版本
cargo run # 编译并运行
cargo build --release # 编译发布版本,开启优化
新手要养成区分这三个命令的习惯:cargo check 用于快速确认代码有没有编译错误;cargo run 用于本地调试;cargo build --release 用于性能测试和交付。不要每次改代码都 cargo build --release,优化编译会比 debug 慢很多。
添加第三方依赖现代 Cargo 支持直接用命令:
bash复制cargo add serde --features derive
cargo add tokio --features full
也可以用 cargo search <名称> 查 crate,然后手动编辑 Cargo.toml。生成 Cargo.lock 文件是把依赖版本锁定下来的机制,应用类项目建议提交到仓库,保证不同环境构建一致。
5. Rust 核心概念快速入门
Rust 入门最大的坎不是语法,而是思维方式的转变:它要求你明确回答每个值的所有权归属。这一节只讲四个高频概念,够你读完能读懂 70% 的示例代码。
5.1 所有权
Rust 的规则可以压缩成三句话:每个值都有一个所有者;同一时刻只能有一个所有者;当所有者离开作用域,值会被自动释放。
rust复制fn main() {
let s1 = String::from("hello rust");
let s2 = s1; // s1 的所有权移动到 s2
// println!("{}", s1); // 取消注释会编译失败:use of moved value
println!("{}", s2);
let a = String::from("clone me");
let b = a.clone(); // 显式深拷贝,a 仍然可用
println!("{} / {}", a, b);
let num = 42;
let num2 = num; // i32 实现 Copy,不影响 num
println!("{} / {}", num, num2);
}
注意区分两类类型:i32、f64、bool 等标量实现 Copy,赋值后原来的变量还能用;String、Vec 等堆上分配的类型是移动语义,赋值后原变量失效。如果你需要保留原变量,调用 clone(),但要知道这会带来额外的内存开销。
5.2 借用与引用
不想转移所有权时,可以借用。借用分不可变借用 &T 和可变借用 &mut T。规则是:同一作用域内,可以有多个不可变借用;但可变借用和不可变借用不能同时存在;可变借用同一时刻只能有一个。
rust复制fn main() {
let mut s = String::from("hello");
let r1 = &s; // 不可变借用
let r2 = &s; // 可以同时多个不可变借用
println!("{} {}", r1, r2);
let r3 = &mut s; // 可变借用
r3.push_str(", rust");
println!("{}", r3);
}
这段代码能通过编译,是因为 r1、r2 的最后使用点在可变借用之前,编译器可以判断借用已经不再活跃。如果你把它们的使用顺序打乱,让不可变借用和可变借用交错出现,就会看到典型的 “cannot borrow as mutable because it is also borrowed as immutable” 错误。
5.3 Result 与错误处理
Rust 没有异常机制,公开函数一般返回 Result<T, E> 或 Option<T>。写业务代码时,最常见的错误处理方式是 match 或者 ? 操作符。
rust复制use std::fs::read_to_string;
fn main() {
match read_to_string("Cargo.toml") {
Ok(content) => println!("读取成功,内容长度 {}", content.len()),
Err(err) => eprintln!("读取失败: {}", err),
}
}
在返回 Result 的函数里可以用 ? 提前返回错误,代码会简洁很多:
rust复制use std::fs;
fn read_config() -> Result<String, std::io::Error> {
let content = fs::read_to_string("config.toml")?;
Ok(content)
}
新手最常见的错误是把 unwrap() 到处用。unwrap() 在示例代码里省事,但放到生产代码里,一旦出错就是 panic。宁可多写一层错误处理,也不要让一个不稳定的输入值直接击穿主流程。
5.4 生命周期
生命周期是 Rust 里让人最头疼的概念,但入门阶段只需要理解它的存在意义:当函数返回一个引用时,编译器需要知道这个引用到底指向谁,保证引用不会悬空。
rust复制fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
这段代码里的 'a 表示 x、y 和返回值拥有相同的生命周期约束。实际开发中,大多数情况下编译器会自动推断生命周期,只有少数涉及引用的函数需要手动标注。入门阶段不必深挖,先做到“能看懂标注”,遇到复杂借用冲突时再回来看 Rust Book 的对应章节。
6. 实战:用 axum 跑通 HTTP 接口服务
概念看再多,不如跑一个能验证的服务。这里用一个轻量 HTTP 服务收尾入门链路:axum 是 Rust 社区常用的 Web 框架,背后是 tokio 异步运行时。先创建项目并添加依赖:
bash复制cargo new rust_http_demo
cd rust_http_demo
编辑 Cargo.toml,加入以下依赖:
toml复制[dependencies]
axum = "0.8"
tokio = { version = "1", features = ["full"] }
serde_json = "1"
写一个最简单的服务:
rust复制use axum::{routing::get, Json, Router};
use serde_json::{json, Value};
async fn hello() -> Json<Value> {
Json(json!({
"message": "Hello, Rust!",
"status": "ok",
"framework": "axum"
}))
}
async fn health() -> &'static str {
"ok"
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(hello))
.route("/health", get(health));
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await.unwrap();
println!("HTTP 服务已启动: http://127.0.0.1:3000");
axum::serve(listener, app).await.unwrap();
}
然后运行:
bash复制cargo run
看到 “HTTP 服务已启动” 后,另开一个终端验证接口:
bash复制curl http://127.0.0.1:3000/
curl http://127.0.0.1:3000/health
预期输出分别是 JSON 数据、字符串 ok。返回内容正确,说明从安装、编译到运行、接口调用整条链路已经通了。
批量请求验证可以用循环:
bash复制for i in $(seq 1 10); do curl -s http://127.0.0.1:3000/health; echo; done
如果想把接口接到自己的工具里,用 Python 的 requests 或 Postman 直接按同样的 URL 调用即可。真正常见的失败点是 3000 端口被占用,启动日志会报 AddrInUse,这时换端口或者先释放端口。Linux/macOS 用 lsof -i :3000 查看端口占用,Windows 用 netstat -ano | findstr :3000。表驱动测试同理,把端口改成 3001 再跑一遍即可。
性能观察方面,第一次 cargo run 慢是正常的,因为 tokio、axum 及其依赖要完整编译一遍,时间通常在几十秒到几分钟,取决于机器性能和网络。之后增量编译会快很多。运行时内存只需要 top 或任务管理器看进程 RSS,Rust 服务没有 GC,内存波动通常比同类的 Python/Node 服务更平缓,但具体数值取决于请求量和业务逻辑,不要只看单机空载就下结论。
7. Tauri + Rust 桌面应用怎么快速体验
如果你对桌面应用更感兴趣,Tauri 是 Rust 入门后最适合接的实战项目。它的前端用 WebView 加载,后端用 Rust,安装包体积和内存占用通常比 Electron 方案有明显优势。
先确保本机有 Rust 工具链和 Node.js,然后用官方脚手架创建项目:
bash复制npm create tauri-app@latest
cd my-tauri-app
npm install
npm run tauri dev
npm run tauri dev 会启动一个带热更新的开发窗口,前后端代码都可以实时调试。Linux 环境下需要提前安装 webkit2gtk、libgtk-3-dev 等系统依赖,具体列表以 Tauri 官方文档为准;Windows 依赖 WebView2,Windows 11 一般自带,老系统需要单独确认。
在 GitHub 上搜索“tauri demo”或“tauri v2 template”,能找到很多可运行的参考工程。看这类 demo 时重点看四个地方:src-tauri 目录里的 Rust 代码;src 目录里的前端页面;src-tauri/tauri.conf.json 里的应用配置;Tauri 2 的权限声明文件,它决定了前端页面能调用哪些 Rust 命令和系统能力。权限配置是 Tauri 2 和 v1 差异最大的点,不要跳过。
示例工程建议先跑通,再改自己的代码。涉及真正的业务数据和用户隐私时,注意前端采集最小化、接口调用走白名单、发布前检查权限声明。不要为了省事把所有 capability 都放开。
8. Rust AI Agent 与扩展方向
基于 Rust 语言的 AI Agent 是当下热点,但入门阶段不要直接去啃 agent 框架源码,应该先沿着“调用外部模型接口 → 抽象工具函数 → 加状态管理”的顺序做。
第一步是确认异步 HTTP 调用能力。用上一节的 axum 或 reqwest 库,先请求一个 OpenAI-compatible 的对话接口,输出返回结果。这一步解决的是网络层问题。第二步是把“发请求、解析结果、处理错误”封装成一个独立函数,入参和返回都定义成明确的 Rust 类型。第三步再考虑 Agent 的循环逻辑:模型输出里可能有工具调用指令,你需要解析它、执行对应函数、把结果拼回上下文,再传给模型,循环直到模型给出最终回答。类型系统会在这个过程里帮你拦住很多“字段拼错”的问题。
参考实现可以看 Hugging Face 的 candle、社区里的 burn,以及 rust 生态里的 LLM 框架。这些项目迭代很快,不要只认某个名字,要看书名对应的 repo 最近更新时间和作者维护状态。对 Rust 生态尚不熟悉的读者,建议先不引入 agent 框架,直接用 reqwest + serde_json 手工实现一版,理解核心链路后再迁移。
调用第三方模型接口时,务必留意服务条款、配额、延迟和隐私要求。涉及用户上传的文本、图片、语音,先做脱敏处理,不要在日志里明文记录完整请求内容。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Windows 编译报 link.exe not found | 缺少 MSVC 链接器 | 检查是否安装 VS Build Tools | 安装 VS 2022 Build Tools,勾选 C++ 桌面开发;或切换 GNU 工具链 |
| 安装后 cargo 不是内部命令 | PATH 未生效 | 重开终端,检查 ~/.cargo/env |
source 环境文件或手动追加 PATH |
| 下载依赖超时、缓慢 | crates.io 访问不稳定 | 执行 cargo build 观察卡在哪个阶段 | 配置 crates.io 镜像源,检查 cargo config |
| 报 cannot borrow as mutable | 不可变借用与可变借用冲突 | 看编译器标注的借用位置 | 缩小借用范围、重新组织变量使用顺序或 clone |
| 报 use of moved value | 所有权已转移 | 检查赋值和函数传参 | 改用借用、clone,或重新设计数据流 |
| cargo build 慢慢变慢 | 依赖规模变大、debug 编译全量重复 | 观察是否反复全量编译 | 多用 cargo check,按需 build,release 用增量配置 |
| 端口被占用 | 其他进程监听同一端口 | 确认日志里的 AddrInUse | 换端口,或用 lsof/netstat 定位进程 |
| rust-analyzer 不提示、不报错 | 插件版本与工具链不匹配 | 查看插件输出日志 | 升级插件,确认 rustup default 正常,必要时执行 rustup update |
| 编译错误信息看不懂 | 对类型推断和 trait 不熟 | 看错误信息最后一段,搜索关键错误码 | 访问 docs.rs 查对应类型和方法,先解决第一个错误 |
| 运行时 panic | 代码里使用 unwrap/索引越界 | 看 panic 堆栈和行号 | 改用 match/?,检查 Vec 索引是否越界 |
排查 Rust 问题有一条通用心法:编译器给出的错误信息前面一大部分是上下文,最后的 “error[EXXXX]” 和原因描述才是关键。先读最后一段,再往上翻具体位置,不要一上来就复制整段报错去搜索。
10. 学习路线与工程建议
把“Rust 入门”拆成四周计划,比盲目看文档效率高得多。
第一周只做两件事:把工具链装好,把所有示例代码亲手敲一遍。重点是建立“编译一次过”的体感。第二周攻所有权、借用、生命周期,推荐把 Rust Book 对应章节读两遍,再做 Rust By Example 里的练习。第三周写小工具:用 clap 写一个命令行工具,用 serde 做 JSON 读写,把文件处理、目录操作跑通。第四周进入异步方向,tokio + axum 的 HTTP 服务,或者 Tauri 的桌面 demo,二者选一个深入。
工程习惯方面,有三个命令应该从第一天就养成:cargo fmt 统一代码格式,cargo clippy 做静态检查,cargo test 跑测试。依赖管理上,生产项目不要盲目堆 crate,每加一个依赖前先看它的 GitHub stars、README、许可证和维护频率。许可证是很容易被忽略的问题,商用项目尤其要注意 MIT/Apache-2.0 等许可证是否适合你的发布方式。
还有一个容易被忽视的边界:Rust 生态强调安全,但只靠语言本身不能解决所有问题。涉及第三方输入的服务要做超时控制和错误兜底;涉及 OPC UA 等工业协议要在隔离环境测试;涉及基因计算、医学辅助判断的结论必须与权威数据源交叉验证;涉及用户数据的项目要遵守隐私合规要求。语言能帮你减少内存类 bug,但业务边界还得靠设计约束。
下一步可以回到开头那几个热搜词试水:想接触桌面开发就去改一个 Tauri demo,关心 AI Agent 就用 reqwest 接一次 LLM 接口,做工业方向就研究 rust-opcua 的文档。最值得验证的永远是那一条最小链路:装好环境、跑通第一个服务、让编译器帮你找到第一个错误。建议收藏这篇作为环境清单,从今天起先把 rustup 装完,Rust 这门语言能不能入你的技术栈,跑完这一遍你心里就有答案了。
