Rust 如何對應到你已懂的 C 概念(how Rust maps onto C)
如果你學過 C,你並沒有浪費時間——你建立的正是 Rust 所預設的那套心智模型。Rust 是建在同一部機器上的系統語言,所以你現在帶著的硬體層級概念幾乎是一對一地轉移過去;改變的是「誰負責把細節做對」。把這些部件並排攤開會有幫助,好讓這門新語言感覺起來不那麼像異國,而更像同一座城市、只是路標更好。
走一遍這張對照圖。堆疊與堆積在兩種語言裡是行程記憶體中同樣的兩塊區域:區域變數與小值住在堆疊上,並在函式返回時被清理;較大或活得較久的資料住在堆積上。在 C 裡你用 malloc 把資料放上堆積、用 free 收回;在 Rust 裡像 Box<T>、String 或 Vec<T> 這樣的擁有型別會替你在堆積上配置、並自動釋放它。C 的指標變成 Rust 的參考:&T 是共享、唯讀的參考,&mut T 是獨占、可寫的,而且不像原始指標,編譯器保證參考永遠指向有效記憶體。手動的 free 變成在擁有者範圍結束時執行的自動 drop,所以你從不自己呼叫 free。C 用一個可能為 NULL 的指標表示「也許什麼都沒有」之處,Rust 用 Option<T>;C 回傳 -1 並設 errno 之處,Rust 回傳 Result<T, E>;C 把資料描述為一個指標加一個你手動追蹤的長度之處,Rust 用一個自帶長度的切片。
為何這個對照有幫助:它精確告訴你什麼是新的、什麼不是。硬體現實——位元組、位址、向下成長的堆疊、堆積、一次快取未命中的代價——完全相同,所以你所有的低階直覺仍然管用。Rust 所加上的,是一個追蹤所有權、借用與生命週期的編譯器,讓你在 C 裡靠手與註解做的記帳工作,現在由它替你檢查。誠實的提醒是:這個對照是一份指引、而非一道等式:Box<T> 並不真的就是 malloc、參考也不真的就是 C 指標(它帶著指標所沒有的規則),而 Rust 的 drop 順序與移動語意有些細節在 C 裡找不到對應。用這張圖找方向,再去學 Rust 真正不同的那些地方。
// C Rust // malloc / free Box<T> / 自動 drop // char *p (可能是 NULL) Option<&T> / &T(永不為空) // 回傳 -1、設定 errno 回傳 Result<T, E> // 你手動追蹤的指標加長度 &[T] (切片自帶長度) // 你呼叫 free() drop 在擁有者範圍結束時執行
同樣的硬體、同樣的區域;Rust 把記帳工作從你的腦袋搬進編譯器。
這張對照圖替你找方向,但並不精確:Rust 的參考不只是 C 指標(它帶著借用規則),Box<T> 也不真的就是 malloc。你的低階硬體直覺會轉移過去;移動、drop 順序與生命週期的細節則是真正全新的。