Rust 替代 C,靠的不是重寫
這一週,兩個最保守的代碼庫一前一後動了手。10 月 27 日,systemd 合併了它的第一個 Rust 程序;就在這幾天,Linux 7.4 的合併窗口裏,Binder 的 C 驅動被整份刪掉,一萬一千多行,主線內核裏從此只剩 Rust 版。
看到這種新聞,大家愛問一句話:Rust 到底什麼時候把 C 替代掉?問的人通常盯着行數算賬。內核維護者 Greg Kroah-Hartman 自己給過數字:內核裏有三千六百萬行 C,Rust 只有十一萬三千行。照這個賬算,C 再活五百年都沒問題。

可語言不是這麼死的。一門語言真正的死法,是新代碼不再用它寫了。老代碼沒人動,它就躺在那兒運行、被維護、被打補丁,看上去江山穩固;可每個新組件、每個新驅動、每個新工具,立項那天選的都是另一種語言。存量決定它還能活多久,流量決定它是不是還活着。
你去看這幾年幾家最保守的項目立的規矩,會發現它們說的是同一條原則:老 C 一行不改,Rust 只准進新代碼。內核 2022 年就是這麼開的門,先只准新驅動用;去年 12 月,維護者峯會正式宣佈實驗結束,Rust 是內核的正式語言之一了。
systemd 這次更絕。Rust 只准用在新葉子程序上,就是那種自己獨立跑、系統裏沒有別的東西依賴它的小程序;現有 C 一行不移植,構建不用 Cargo(Rust 自帶的包管理和構建工具),不許用外部依賴,連 Rust 標準庫都不進成品。第一個 Rust 程序 systemd-keyring-setup 乾的活也很小,開機時把證書登記進內核鑰匙環。就這麼小的一步,10 月 27 日,它合進去了。
再往上,用戶每天摸到的那一層也在換。Ubuntu 從 25.10 起把 sudo 換成 Rust 寫的 sudo-rs,今年 10 月的 26.10 裏,ls、cp、rm 這些最古老的命令已經全部是 Rust 實現,連包管理器的簽名驗證都換成了 Rust 寫的 Sequoia。
維護者爲什麼願意籤這種規矩?賬算在漏洞上。微軟和谷歌都估算過,大型 C 和 C++ 代碼庫裏,大約七成嚴重漏洞是內存錯誤這一類。谷歌自己的 Android 數據更直觀:內存安全漏洞佔全部漏洞的比例,2019 年是 76%,到 2025 年降到了 20% 以下,谷歌把這筆賬記在新代碼改用內存安全語言上。
還有一筆賬算在審代碼的人身上。Kroah-Hartman 說過,Rust 代碼讓他審起來輕鬆得多:類型系統把資源管理那一攤先管住了,他只需要看邏輯對不對。對天天要審成千上萬補丁的人來說,這不是口味問題,是人力問題。
Binder 則是下一階段的樣子。谷歌先用 Rust 把這個驅動重寫了一份,兩個版本並行跑,Rust 版先在 Android 設備上量產;刪除時給出的理由是功能已經追平、性能也不輸,C 版就在 7.4 裏被整份刪掉。提交刪除的人寫了一句話:這一天終於來了。
但 Binder 是個例外,不能當常態看。它背後有谷歌長期投入的錢和人,Android 的進程通信又痛到值得重寫。絕大多數 C 子系統不會有這個待遇,它們等不到重寫,只會等到一件事:從某一年起,再也沒有新功能往裏加。老代碼就那麼放着,一放二十年。
Rust 往核心裏走,碰到的硬阻塞也不少。systemd 的核心部分到今天還用不了 Rust,動態庫支持有硬傷;發行版那邊,Arch 和 openSUSE 前幾天剛因爲構建開了全功能又沒帶 Rust 工具鏈,當場構建失敗。
Ubuntu 換 Rust 命令也不是一帆風順。Canonical 請 Zellic 審的就是 Rust 版的 coreutils,113 個問題裏有 44 個是 CVE;cp、mv、rm 還卡過一類競態問題,就是檢查的時候沒事、真用的時候文件已經被換掉了,26.04 先留用 GNU 版,拖到 26.10 才換完。
所以這件事的時間尺度,是一代人,不是兩年。C 還會運行在每一臺機器裏很多年,能審 C、能維護 C 的人還會值錢很久。可是值錢的方式會變:從「新東西都找你寫」,變成「老系統只有你敢碰」。
你把時間推到二十年後看:新項目立項,默認語言裏沒有 C;年輕人不學它,除非要去維護老系統;C 的位置,跟今天 COBOL 在銀行裏的位置差不多:系統離不了它,可除了維護,沒人再拿它做新東西。我維護 C 寫的基礎設施很多年,我怕的從來不是哪天失業,而是有一天發現,我的經驗被歸檔進了「遺留」那一欄。
對還在寫 C 的人,我的建議很具體:不用慌着轉行,也別賭它不會發生。最該練的,是站在兩種語言中間的本事:讀得懂 Rust,審得了新組件,知道老 C 的哪一段不能動、哪一段該讓新代碼繞開它。這種人接下來二十年是最缺的,因爲新代碼要接入的,全是你們手裏的老系統。
判斷 C 的死期,別數還剩多少行。看你下一個新組件立項時,默認用什麼寫。默認值翻過去的那一天,結局其實已經寫好了,剩下的只是時間。你手邊的新項目,現在默認用什麼?