rust初次实践

Rust 是一门现代的、开源的系统编程语言,其设计的核心目标是同时实现安全(Safety)、并发(Concurrency)和性能(Performance)。它通过在编译时强制执行一系列严格的规则,来消除一整类常见的内存错误(如空指针、悬垂指针、数据竞争等),而无需像 Java 或 Go 那样依赖垃圾回收器(Garbage Collector)。

Rust 就像一位拥有 “ 魔法钥匙 “ 的贴身管家:任何时候,一件珍贵的物品(一块内存数据)要么只能由一个人持有 “ 主钥匙 “(可写入权限),要么可以被多个人持有 “ 复制钥匙 “(只读权限),但绝不允许 “ 主钥匙 “ 和任何 “ 复制钥匙 “ 同时存在。这位管家(编译器)在你的程序 “ 运行 “ 之前,就会严格检查所有钥匙的分配,确保万无一失。

1. 介绍

1.1 历史发展

系统软件领域的 “ 不可能三角 “:高性能、高安全性、高生产力,通常我们只能三选二。

  • C/C++ 选择了高性能,但牺牲了安全性,导致了无数的内存安全漏洞。
  • Java/C#/Go 选择了安全性(通过垃圾回收)和高生产力,但在一定程度上牺牲了极致的性能和内存控制。

Rust 的重要性在于,它正面挑战了这个 “ 不可能三角 “。它解决了 C/C++ 长期存在的内存安全和数据竞争问题,同时提供了与之媲美的性能和底层控制力。这意味着你可以构建像操作系统、数据库、浏览器引擎这样对性能和可靠性要求极高的软件,而不用再为那些臭名昭著的 segmentation fault 或线程安全问题彻夜难眠。

Rust 的开发最早可以追溯到 2006 年,当时 Mozilla 的员工 Graydon Hoare 开始了这个项目,作为个人兴趣。2015 年 5 月,Rust 1.0 正式发布。

特性RustGoC++
核心哲学零成本抽象,编译期安全简洁、高效并发,工程化掌控一切,相信程序员
内存管理所有权系统 (编译期)垃圾回收 (GC, 运行时)手动管理 (new/delete)
性能顶尖,与 C++ 相当优秀,但受 GC 停顿影响顶尖,直接控制硬件
并发模型无畏并发 (所有权防止数据竞争)Goroutines + Channels (非常易用)多线程 + 锁 (强大但极易出错)
安全性极高,在编译期消除内存和线程安全问题,GC 避免内存泄漏,但仍有其他风险,充满了未定义行为和安全漏洞的风险
学习曲线陡峭,所有权和生命周期是难点平缓,语法简单非常陡峭,特性复杂且历史包袱重
适用场景操作系统、嵌入式、游戏引擎、WebAssembly、高性能后端网络服务、微服务、云原生工具链游戏引擎、桌面应用、高性能计算、金融交易

1.2 语言特点

Rust 的魔法核心在于其 所有权系统(Ownership System),它由三个关联的概念组成,并在编译期由借用检查器(Borrow Checker)强制执行。

  1. 所有权 (Ownership):
    • Rust 中的每个值都有一个被称为其所有者(owner)的变量。
    • 值在任何时刻都只能有一个所有者。
    • 当所有者离开作用域(scope)时,该值将被自动清理(drop)。
    • let s1 = String::from("hello"); let s2 = s1; // s1 的所有权被移动到 s2s1 不再有效。
  2. 借用 (Borrowing):
    • 如果你不想转移所有权,可以 “ 借用 “ 一个值。这通过引用(reference)实现。
    • 不可变借用 (Immutable Borrow):&T。你可以拥有任意多个不可变借用,但此时不能有可变借用。大家都可以看(只读)。
    • 可变借用 (Mutable Borrow):&mut T。你只能有一个可变借用,且此时不能有任何其他借用。只有一个人能改(读写)。
  3. 生命周期 (Lifetimes):
    • 这是一个稍高级的概念,是编译器用来确保所有借用都有效的工具。它保证了引用指向的数据在引用被使用期间绝对不会被释放掉,从而杜绝了 “ 悬垂指针 “。

1.3 能用来干什么

  • 系统编程:Rust 可以用来编写操作系统内核、驱动程序和嵌入式系统,因为它提供了对硬件和系统资源的精细控制。
  • Web 开发:Rust 在 Web 开发中的应用越来越广泛,尤其是通过框架如 Rocket、Actix 和 Axum。Rust 编写的 Web 应用可以同时具有高性能和安全性。
  • CLI 工具:Rust 被广泛用于开发命令行工具,因为它可以编写快速且可靠的工具。例如,许多流行的命令行应用,如 ripgrep、exa 等,都是用 Rust 编写的。
  • 游戏开发:Rust 可以用于游戏开发,尤其是需要高性能和低延迟的场景。Amethyst 等游戏引擎就是基于 Rust 的。
  • 区块链和加密货币:Rust 在区块链和加密货币领域也有应用,特别是在需要高性能和安全性保证的智能合约和去中心化应用中。
  • 嵌入式系统:Rust 适合用于嵌入式系统编程,因为它能够在资源受限的环境中提供安全和高效的代码。

2. 初探

2.1 安装使用

1
2
3
4
5
6
7
8
# 安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 查看版本
rustc --version

# 更新rust
rustup update

Rust 将被安装在 ~/.cargo/bin 目录下。

2.2 创建项目

1
2
cargo new hello-rust
cargo run # 输出hello world
  • Cargo.toml 为 Rust 的清单文件。其中包含了项目的元数据和依赖库。
  • https://crates.io/ 可以查找 Rust 包的仓库

2.3 项目初探

Cargo.toml 增加依赖

1
2
[dependencies]
ferris-says = "0.3.1"

代码

1
2
3
4
5
6
7
8
9
10
11
12
use ferris_says::say;
use std::io::{stdout, BufWriter};


fn main() {
let stdout = stdout();
let message = String::from("Hello study rust!");
let width = message.chars().count();

let mut writer = BufWriter::new(stdout.lock());
say(&message, width, &mut writer).unwrap();
}

执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cargo run



Compiling hello-rust v0.1.0 (/Users/liuwei/workspace/hello-rust)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.58s
Running `target/debug/hello-rust`
___________________
< Hello study rust! >
-------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \

3. 提问问题

  • 单个 rs 文件怎么运行
1
2
rustc main.rs
./main

4. 参考资料