Rust讓Linux分裂成了兩派,真的八字不合?
原創編輯 |言征
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/