Rust讓Linux分裂成兩派,真的八字不合了?

2024.10.02

Linux走過了33個年頭,而時到如今,創辦人Linus在一直為了推動其發展而爭吵不斷,是個出了名的「暴君」。

然而對於Rust進入Linux核心遇挫這件事上,Linus似乎變得平和起來,甚至有些「理智的消極」。 Linus坦言:自己搞不懂為什麼到現在,Rust竟然還會有這麼大的爭議!

1.Linux已分裂成了兩派

9月初,一位Linux內核維護者Wedson在網上發布了帖子,自曝跟Rust語言貢獻者發生了衝突,因為難以忍受適配Rust的C插件問題過程中的“非技術性的技術廢話”憤而辭職。

這一場Linux核心的C語言和Rust語言貢獻者之間發生的衝突,Linux創始人Linus Torvalds將其定性為「幾乎帶有宗教戰爭色彩的爭議」。在本週三舉行的開源峰會主題演講中,托瓦茲表示,儘管爭議中不乏健康的辯論,但有些辯論變得非常消極。


Linus將這項爭議比作vi與emacs之間的文化戰爭,即哪種文本編輯器更優越,這也被稱為「編輯器大戰」。

「我其實很享受這種爭論。我喜歡辯論。我認為Rust的一個優點在於它讓一些討論變得生動有趣,雖然有些爭論變得很難聽……但這表明人們是多麼在意。同時,我不太確定為什麼Rust會成為如此有爭議的話題,」托瓦茲說。 「這讓我想起了我年輕的時候,人們爭論vi和emacs哪個更好,但不知何故,整個Rust與C的爭論在某些方面幾乎帶上了宗教色彩。”

然而,對於選擇哪一種編輯器,抑或哪一種語言,相信大多數程式設計師最後都會回答:我並不care。

因為程式設計師並不需要用最難的工具來證明自身的技能。一個好的程式設計師是懶惰的!

2.Linux土壤是C,Rust被宣示主權

一位知情人士透露,一小部分C核心開發人員似乎決心讓Rust 維護者的生活變得盡可能艱難。他們認為Rust 毫無價值,寧願Rust消失。

「去年,當我嘗試將DRM 抽像上遊化時,Rust 中對"device」概念的基本支持全部受阻。即使只是struct device 的存根包裝器也足夠了。直到最近,也就是一年多之後,這個簡單的概念才終於得以實現。


一個概念花了一年多才得以實現,可想而知Rust融入C版的Linux將有多難。

一方面是技術上的問題,「當我編寫DRM 調度程序抽象時,我遇到了許多由底層C代碼設計不良引起的內存安全問題。生命週期竟然沒有記錄,而就是簡單歸結為'像amdgpu 一樣設計驅動程式以使其工作,或其他'。

但由此反映出的更多是人的問題:這位知情人其他C驅動程式也會因為糟糕的API問題觸發相同的錯誤,需要查詢隱藏的生命週期時,C維護者們依舊不為所動。

在原來的這位C維護者看來,一個C驅動程式可以work,那麼Rust驅動程式也必須以相同的形式work。

沒錯,表面上看來是兩種語言的特性衝突,但其實看是C版核心維護者在向Rust貢獻者宣示自己對於Linux貢獻的絕對主權。

新王未成,舊王維穩。就如同Linux透過30餘年建立起開源霸主的地位一般,C語言這位王者在與Rust這位未來極具挑戰性的後起之秀的關係上多少有些尷尬:一方面自己需要Rust來解決自身積累多年的內存安全等方面的問題,另一方面在引進Rust的同時又面臨被新語言思想適配所帶來的被重構的尷尬與不安。

這種「尷尬與不安」可以形容為「甘道夫級的C巫師因為要重新披上一個新手巫師的Rust道袍而頓感羞恥」。

一些C核心的維護者認為自己的開發信念受到了攻擊,讓他們突然接受自己的程式碼或自己喜歡的程式碼馬上就要變成時了,並沒有那麼容易。

3.Rust進入Linux的三重困境

對於後來者,Rust面臨三重困難:

一、Linux核心的C介面不會分享給Rust,但當Rust介面提出時,就會被指出它是錯誤的,而且不給任何修復建議;

二、即便Rust介面被同意合併了,它也不過是二等公民。在重構C介面時,Rust介面卻無法更新,所以更沒有人會去用Rust介面寫的驅動程式;

三、一個有毒的工作環境。例如-在Rust版內核演講中,C版核心維護者用看似閒聊實則極其激烈的方式進行嘲諷:「你們只不過是想讓更多人皈依你們的Rust宗教!」直至讓工作人員精疲力盡,對專案產生倦怠。

這裡,不得不展開提一下Wedson離職還暴露了另一個我們往往忽視的問題:Linux的工作環境正在變得「不和諧」甚至「有毒」。

本月初,他在宣布「卸任Linux專案的Rust語言維護者一職」中提到了YouTube上一個關於Rust中檔案系統的影片:「重申一遍,沒有人試圖強迫任何人學習Rust,也沒有人阻止C程式碼的重構,」Wedson寫道。

這個影片是Wedson和另一位開發者Kent的演講會議,坐在下面有一些C語言的Linux核心開發者。這些開發人員似乎並不關心30分鐘的演講內容,更多是嘲諷某一頁的幻燈片。

Wedson本身是C程式設計師,但他對Rust for Linux專案充滿熱忱。

「Linux專案的Rust團隊:謝謝你們,你們很棒。與你們所有人一起工作是我的榮幸;我們一起討論技術問題、尋找解決漏洞的方法等時光,都是我一直喜歡並期待的。我很幸運能與這樣一個才華橫溢、友好的團隊合作。

「我祝福專案一切順利。我真的相信核心的未來在於記憶體安全的語言。我不是先知,但如果Linux不將其內化,我擔心其他核心會對其做出與Unix相同的事情。”

4.問題的核心:兩者開發文化

問題的核心在於C語言和Rust語言在跨語言邊界提交更改時所產生的文化衝突。

正如Linus今天所描述的那樣,C語言是一種相對“簡單的語言”,這也是“我喜歡C語言,以及為什麼許多C語言程式設計師喜歡C語言的原因之一。當然簡單也是有代價的,因為簡單,所以也很容易出錯。

“而Rust則完全不同。有很多習慣於C語言模式的人,他們不一定喜歡這種差異,這也沒關係。”

從Rust的角度來看,為Rust使用者修改某個C介面可能是有意義的,而C語言使用者則希望Rust能做出貢獻,以便與C語言結合使用。

這項爭議可以追溯到三年多前,當時有人提出Rust語言因提供C語言所不具備的某些安全優勢,可以成為核心的一部分,甚至可能取代C語言。儘管如此,該項目並未因此停滯不前。

例如,以前用C語言和CPU可以製造的著名緩衝區溢位駭客攻擊或漏洞,現在幾乎已經過時了。雖然Rust提供了一些安全特性和不足,但相較之下,它比C語言更難學,而C語言則更容易掌握。

5.為什麼不做一個純Rust版的核心?

有人會想到另一個解決方案:既然Rust融不進去C版Linux,直接做一個Rust版的Linux核心不就好了嗎?

答案是否定的。

正如思科公司Isovalent 的首席開源官Liz Rice 認為,Rust 是一種較新的語言,具有「非常強大的優勢,但並不是所有人都會立即知道如何編寫Rust 程式碼。許多在內核的eBPF 子系統上工作的人不會突然轉去學習Rust,以便完成工作,對吧?

Rice 也提及了一個看起來幼稚但非常有代表性的場景:「我看過人們這樣說,『哦,好吧,那我們為什麼需要eBPF 驗證器?如果我們用Rust 完成所有工作,那就可以移除它了'。 

但很明顯,當提問者這麼說時,並沒有完全理解eBPF 驗證器的全部目的。開發不只編程,更多還需要考慮程式碼所服務的需求和場景。

對於這一點,Polar Signals 的首席執行官兼創始人Frederic Branczyk 也表示贊同:“在Rust 中有很多例子,你不得不做一些不安全的操作,然後在其基礎上構建安全的抽象。”

“所以,我當然不是認為Rust 會是一切問題的救星。我其實是Rust 的大粉絲,但我認為C 實際上是一種編寫操作系統的非常好的語言,而Rust 也可以完成很多工作。”

6.王者與新秀之間的爭鋒

王者與新秀並存的場面,起初往往都是這樣,難以平衡。王者累積了相對穩定和成熟的基本框架和路徑,但也滋生了難以逾越僅憑自身就能解決的問題;而新秀​​雖然在王者難以專注的領域異軍突起,但往往缺乏必要的、難以察覺的時間經驗。

在技​​術領域更是如此。因為在技術領域,基本規則一開始變化往往難以察覺,隨後又將會指數級迅速變化。整體來看,C 語言非常適合快速發展、資源受限的環境。但在穩健性、安全性和可維護性與硬體效能過強和大量共享的環境相結合的情況下,情況就不那麼理想了。所以Linus才寄望於Rust的加入。

然而,Rust for Linux專案為核心開發者帶來了新的基本規則變更。遺憾的是,對Linux而言,Rust和C核心貢獻者之間似乎存在著某種難以跨越的鴻溝。

畢竟,數十年來在複雜環境中高效工作所獲得的知識、經驗和觀點並不局限於某一特定語言,而這正是Rust融入Linux所需要的。

悲劇的是,C版核心維護者能否接納Rust的開發方式,為Rust提供寶貴的開發經驗,至少現在看也是一個很難接受的問題。

7.寫在最後:Linus也無解

不得不說,在Linux核心融入Rust上面,Linus碰到了一個硬釘子。

C語言和Rust語言兩大陣營的分歧相當大。 “有些人只是不喜歡Rust的概念,也不喜歡Rust侵入他們的領域……人們甚至談到了Rust整合的失敗。”

Linus對此也是無解:「有很多人習慣了C模型,但他們不一定喜歡差異......沒關係……有些人關心特定的架構,有些人喜歡文件系統,這應該是這樣的。這就是我看待Rust的方式。

但Linus對於這個計畫充滿期待:「我們已經做了幾年了,所以現在甚至說這些還為時過早」。不過他也沒有說太滿:“但我也認為,即使它失敗了(而我認為它不會),這也是一種學習的方式。所以,我認為這種推廣活動是有積極意義的。”

畢竟,時間是一切問題的良藥,在這場討論中,主持人在接近尾聲時開了一個調侃的玩笑:

“Torvalds在過去33年裡一直是Linux項目的傀儡,但不太可能再擔任33年。希望到那時,關於Rust的爭論會得到解決。”

參考連結:

https://www.theregister.com/2024/09/02/rust_for_linux_maintainer_steps_down/

https://www.theregister.com/2024/09/19/torvalds_talks_rust_in_linux/