跳轉到

15.2 Rust 語言:不用垃圾回收器卻能確保記憶體安全的生命週期與所有權魔術#

從個人專案到國家政策推薦#

Rust 的起源是 2006 年 Mozilla 員工 Graydon Hoare 的個人專案——起因極具象徵性:他住的公寓大樓的電梯軟體(C++ 寫的)頻繁崩潰。他的問題直白:

能否有一門語言,既像 C++ 一樣快、無 GC,又像 Java 一樣安全?

當時的教科書答案是「不可能」:安全需要執行期檢查或 GC。Rust 的破局思想:

把記憶體安全的檢查全部搬到編譯期——用型別系統表達「誰擁有資料、誰在借用」。

2009 Mozilla 贊助、2015 Rust 1.0、2018 年起 Stack Overflow「最受喜愛語言」連年第一、2021–2024 年 Rust 進入 Linux 核心(35 年來第一門被接受的第二語言)、Windows 核心部分重寫——CISA/NSA/白宮 2021–2024 相繼推薦記憶體安全語言,Rust 是旗艦(9.3 的賬單收回了)。

所有權(Ownership):三條鐵律#

fn main() {
    let s = String::from("hello");   // s 擁有這塊堆記憶體
    takes(s);                         // 所有權【移動】給函數——s 不再可用!
    // println!("{}", s);            // 編譯錯誤:value moved
}

fn takes(s: String) {
    println!("{}", s);
}                                     // s 離開作用域 → 自動釋放(RAII,11.2)

編譯器執行的三條規則:

  1. 每個值有唯一所有者
  2. 同一時刻,要嘛一個可變借用、要嘛多個不可變借用(防資料競態)
  3. 值被借用時,所有者不能移動或銷毀它

借用(borrowing)解決「移動太嚴格」:

fn length(s: &String) -> usize { s.len() }   // 只借不搶

生命週期(lifetime)標註引用的有效範圍,編譯器靜態驗證無懸空指標。

為什麼這是「魔術」:把執行期問題變成型別問題#

C/C++ 的執行期災難 Rust 的編譯期答案
use-after-free 所有權移動後原變數失效——編譯錯誤
懸空指標 生命週期檢查——編譯錯誤
資料競態 Send/Sync trait + 可變借用唯一性——編譯錯誤
疊代中修改集合 借用規則——編譯錯誤

最深遠的一條:資料競態——並發的頭號災難——在 Rust 中是型別系統排除的。Rust 把 Hoare 的「十億美元錯誤」(null)與並發競態,同時釘死在編譯期。

理論淵源:區域型別(Tofte–Talpin 1990s)、仿射型別(線性邏輯的計算機化:每個資源恰好使用一次,Girard 1987)、Cyclone 語言(2002,安全 C 的學術先驅)。又一次:學術理論搶跑三十年後成為工業核心。

代價一:借用檢查器的學習懸崖#

Rust 的著名缺點是學習曲線:「與借用檢查器戰鬥」是新人的共同創傷。深層原因是:

Rust 的型別系統強迫你提前想清楚「資料的結構關係」(誰擁有誰、共享還是獨占、生命多長)——這些設計決策在 C++ 中被無限推遲到執行期。

許多工程師報告:過了懸崖之後,寫 Rust 變成「先設計後編碼」的紀律。這是 Dijkstra 哲學(8.3)的語言級終極形態:把架構決策前移並機器化執行。

社群的文化回應:Rust 的錯誤訊息被刻意打造為教學(指出衝突的借用、建議修法)——編譯器作為導師而非法官。

代價二與生態學:編譯時間與生態位劃分#

場景 勝者 理由
核心/驅動/安全關鍵 Rust 編譯期安全 + 無 GC
雲端網路服務 Go goroutine + 快編譯
腳本/科學/AI Python 迭代速度 + 生態
前端 TS/JS 瀏覽器壟斷
效能敏感的工具鏈 Rust 重寫潮(Ruff、uv、ripgrep——連 Python 的工具鏈都在被 Rust 重寫) 零成本抽象

「Rust 重寫運動」是 2020s 的有趣現象:用 Rust 重寫既有工具往往快 10–100 倍——效能的紅利期(硬體紅利耗盡後,被解譯型語言承包的層被 Rust 收割)。

歷史意義:安全與效能的「兼得」證明#

四十年來的教條是:安全 ⇔ 開銷(檢查)⇔ 慢。Rust 證明了第三條路:把安全寫進型別系統,用編譯期計算換執行期自由。這對未來的意義:

  • AI 代碼生成(16.3):Rust 是 LLM 生成代碼的理想目標——編譯器本身就是嚴格的驗證器
  • 形式化驗證的普及化:Rust 的型別系統已是「半形式化驗證」
  • 語言設計的範式:所有 2020s 後的新語言(Zig、Mojo、Carbon)都在回答 Rust 提出的問題

小結#

概念 內容 理論淵源
所有權 唯一擁有者 + 移動語義 線性/仿射邏輯(1987)
借用檢查 可變借用唯一性 區域型別(1990s)
生命週期 引用有效範圍靜態驗證 Cyclone(2002)
Send/Sync 並發安全進型別系統 並發的形式化

下一節:15.3 安全與併發的重新定義