













Rust 能做到“快并且安全”,核心逻辑不是靠运行时检查,而是把大量安全问题提前移动到编译阶段解决。它的设计哲学可以概括为:
用编译器理解程序的资源生命周期,让程序员获得 C/C++ 的控制力,同时避免 C/C++ 常见错误。
传统语言通常是在“性能、安全、开发效率”三者之间取舍:
C/C++
性能 ★★★★★
安全 ★★☆☆☆
开发难度 ★★★★☆
Java/Python/Go
安全 ★★★★☆
开发效率 ★★★★★
性能 ★★★☆☆
Rust
性能 ★★★★★
安全 ★★★★★
开发难度 ★★★★☆
Rust 的关键突破是:把安全机制放在编译器,而不是运行时。
Rust 的核心理念:
高级语言特性不应该带来额外运行成本。
例如 C:
for(int i=0;i<len;i++){
sum += array[i];
}
程序员自己保证:
Rust:
for x in array.iter() {
sum += x;
}
看起来高级,但编译后接近:
for(i=0;i<len;i++)
没有:
所以:
Rust代码
|
v
LLVM优化器
|
v
机器码
最终就是普通高速机器码。
这是 Rust 的核心。
传统语言:
程序员分配内存
|
v
GC寻找垃圾
|
v
释放
例如 Java:
Object obj=new Object();
什么时候释放?
交给 GC。
缺点:
Rust:
let s = String::from("hello");
编译器知道:
创建 s
|
|
离开作用域
|
释放内存
直接生成:
allocate
...
free
没有 GC。
所以:
性能:
Rust ≈ C++
安全:
Rust > C++
Rust 最重要的创新。
问题:
为什么 C++ 容易崩?
因为:
多个地方同时修改同一块内存
例如:
线程 A:
读取 x
线程 B:
修改 x
产生:
Data Race
Rust规定:
多个读:
&x
&x
&x
允许。
一个写:
&mut x
必须独占。
所以:
错误代码:
let a=&x;
let b=&mut x;
编译失败。
编译器提前证明:
运行时不会发生数据竞争
于是:
不需要:
Rust 不允许:
“引用一个已经消失的数据”。
C:
char* get(){
char s[]="hello";
return s;
}
返回:
已经销毁的内存地址
危险。
Rust:
fn get()->&str{
let s=String::from("hello");
&s
}
编译错误:
borrowed value does not live long enough
因为:
生命周期:
s:
|---------|
返回引用:
|--------|
范围不匹配。
例如处理网络状态:
C:
switch(status)
可能漏情况。
Rust:
match status {
Connected => {},
Disconnected => {},
}
如果少:
Timeout
编译器提醒:
non-exhaustive patterns
也就是说:
很多逻辑错误被变成编译错误。
主要区别:
代码
|
运行时(Runtime)
|
GC
|
机器码
存在:
代码
|
编译器
|
机器码
运行时:
非常小。
因此:
Rust:
CPU性能
接近C++
Go:
性能优秀
但需要runtime
代价:
需要理解:
例如:
C:
free(ptr);
简单。
Rust:
你必须考虑:
谁拥有它?
谁借用了它?
什么时候释放?
Rust 编译器做大量分析:
代码
|
类型检查
|
借用检查
|
生命周期推导
|
LLVM优化
|
机器码
所以大型项目编译较慢。
可以总结:
Rust程序
|
v
编译器静态分析
+-----------+-----------+
| | |
Ownership Borrow Lifetime
| | |
+-----------+-----------+
|
v
保证没有很多内存错误
|
v
LLVM优化
|
v
机器码
|
v
接近C/C++性能
Rust 的“快”和“安全”来自同一个设计:
把运行时需要做的安全检查,尽可能在编译阶段完成。
C++:
相信程序员
→ 快
→ 容易出错
Java/Go:
运行时保护
→ 安全
→ 有额外成本
Rust:
编译器证明程序正确
→ 安全
→ 运行时接近C++
这也是为什么 Rust 特别适合:
因为这些领域最关心的就是:
“不能慢,也不能崩。”
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。