作者 | Clive Thompsonarchive
譯者 | Sambodhi
策劃 | 褚杏娟
2006 年,29 歲的 Hoare 在開源瀏覽器公司 Mozilla 當程序員。當他回到位于溫哥華的公寓時發現電梯出了故障,里面的軟件也崩潰了,而這事兒已經不只一兩次了。
當他爬樓上去時,心里十分很惱火,因為 Hoare 住在 21 樓。“這也太荒唐了,”他心想,“我們搞計算機的,連一部正常運行的電梯都造不出來!”Hoare 明白,這類很多故障都是程序如何使用內存的問題。諸如電梯之類的設備中,軟件一般都是用 C 或 C++ 語言編寫的,這些編程語言以能讓開發者寫出快速、緊湊的代碼而著稱。但問題在于,這些語言很可能會在不經意間引入內存錯誤,從而造成軟件崩潰。比如微軟曾估計,他們代碼中有 70% 的漏洞是使用這些程序設計語言編寫代碼的內存錯誤所致。
我們中的大多數人,當發現自己要費勁爬上 21 層樓時都會感到憤怒,但隨后就拋諸腦后了。不過 Hoare 還是決定做點什么。
他打開筆記本電腦,開始設計一門新的計算機語言,他希望這門語言可以在沒有內存錯誤的情況下,編寫出更短、更快的代碼。他以一種非常耐寒的真菌 Rust 的名字命名,并稱這種真菌“為了生存而過度設計”。
注:銹病菌類(rust disease fungixiubingjun)是引起植物發生銹病的真菌,屬有隔擔子菌綱銹菌目。
17 年過去了,Rust 已經成為世界上最流行的新語言之一,也許是最熱門的。有 280 萬程序員使用 Rust,微軟和亞馬遜等公司都認為 Rust 是他們未來發展的關鍵。聊天平臺 Discord 利用 Rust 加快了系統的速度,Dropbox 則利用 Rust 將文件與你的計算機進行同步,Cloudflare 則將 Rust 用于處理 20% 以上的互聯網流量。
在程序員論壇 Stack Overflow 每年一次的全球開發者調查中,Rust 連續七年被評為程序員最“喜愛”的語言,甚至美國政府也在積極推動 Rust 語言的軟件,來增強其程序的安全性。
和其他很多成功開源項目一樣,Rust 也成為了“谷倉”:目前有數以百計的鐵桿貢獻者,其中很多都是志愿者。Hoare 本人在 2013 年就離開了這個項目,并且很樂意地把他交給了其他工程師,其中就有 Mozilla 的一個核心團隊。
憑什么脫穎而出
一個人發明一門新的程序設計語言并不稀奇。許多程序員一直把創建小項目作為自己的副業。但很少有一門語言可以像 JAVA、Python/ target=_blank class=infotextkey>Python、Java 這樣的著名語言一樣屹立不倒。Rust 是怎么做到的?
要明白為什么 Rust 如此有用,就必須要深入地研究一下程序員是怎樣處理計算機內存的。
你可以非常簡單地將計算機中的動態存儲器想象成一塊黑板。一個軟件運行時會在黑板上不停地寫下數據,記錄哪一個數據在哪里,然后在不需要的時候擦除。但是,不同的計算機語言對數據的處理方法是不一樣的。傳統的 C 或 C++ 等程序設計語言被設計成,程序員在軟件如何以及何時使用黑板的問題上有很大的權力。
這種權力很有用:有了對動態存儲器如此多的控制,程序員可以讓軟件運行得非常快速。這也是 C 和 C++ 常常用于編寫“裸機”代碼的原因,也就是可以直接與硬件進行交互。沒有搭載像 windows 或 linux 操作系統的機器,包括從透析機到收銀機,都是基于這樣的代碼運行的。(它也適用于更高級的計算:有時,操作系統必須和硬件進行通信)Windows、Linux 和 macOS 的內核基本上都是用 C 語言編寫的。
不過,雖然 C 和 C++ 之類的語言很快,但要付出一定的代價。它們需要程序員密切跟蹤哪些存儲器被寫入以及何時進行擦除。萬一你不經意間忘記擦除了些什么,那很有可能會造成程序崩潰:軟件稍后可能會試圖利用那些它認為是空的內存空間,而那些內存空間中卻存在著一些東西。或者,你可以給數字入侵者一個潛入的方法。黑客們可能會發現,某個程序沒有正確地清理它的內存——那些本應被刪除的信息(如密碼、財務信息等)還留在那兒,并悄悄地將其竊取。C 或 C++ 代碼越長就越容易出現內存錯誤,即使是最細心的程序員,也會讓軟件充滿大量的漏洞。
無人機公司 Fusion Engineering 的聯合創始人、Rust 庫團隊的負責人 Mara Bos 說:“在 C 或 C++ 中,你一直都很擔心自己的代碼會突然崩潰。”
在 90 年代,一組新的語言如 Java、Java 和 Python 開始風靡全球。這些語言采取了完全不同的方式。為了減輕程序員的壓力,它們通過使用“垃圾收集器”來自動管理內存,這些組件會在軟件運行時定期清理內存。轉眼間,你就可以編寫沒有內存錯誤的代碼了。
但是壞處在于,你會喪失細粒度的控制,你的程序也會變得更慢(因為垃圾回收會占用關鍵的處理時間),并且用這種語言編寫的軟件需要更多的內存。所以,編程的世界大致被劃分為兩個部分。如果一個軟件需要快速運行或者在嵌入式設備很小的芯片上運行,那么這個軟件就傾向于使用 C 或 C++ 編寫。如果是 Web 應用或移動設備應用——在代碼世界中越來越壯大——那么你就得使用較新的、具備垃圾回收特性的程序設計語言。
對于 Rust,Hoare 的目的是創建一門語言來這些方法的差異。該語言不要求程序員手工計算出他們在內存中放置數據的位置,Rust 會做到這一點。但是它對如何在程序中使用或者復制數據,卻有很多嚴格的規則。你必須學會那些編程規則,它們比 Python 或 Java 中的那些規則復雜得多。
Rust 代碼編寫起來可能會比較困難,但是“內存安全”,你不必擔心無意中插入了一個致命的內存錯誤。最重要的是,Rust 還會提供“并發安全”的特性。現代程序可以同時處理多個任務,也就是并發處理。有時候不同的線程會在同一時間對同一內存位置進行編輯,而 Rust 的內存管理機制可以避免這一問題。
Mozilla 的“書呆子洞”
Hoare 剛開始使用筆記本電腦設計 Rust 的時候,他就已經是一個擁有十年軟件開發經驗的老鳥了,當時正在 Mozilla 全職工作。Rust 最初僅僅是他的一項副業。
Hoare 花費數年的時間對 Rust 進行了研究,并向其他程序員展示了 Rust,結果引起了不同的反響。他在一封郵件中說道,“有些程序員表現出了極大的熱情,但也有許多程序員卻對我嗤之以鼻,說‘這樣是行不通的’,或者‘這根本就不管用’。”
盡管如此,Mozilla 的高管們對 Rust 很有興趣。他們認識到 Rust 能夠幫助公司開發出一個更好的瀏覽器引擎。眾所周知,瀏覽器是一個非常復雜的軟件,存在著大量潛在的內存錯誤。
Patrick Walton 是參與其中的一名員工,他在決定放棄程序設計語言的博士學位后,加入了 Mozilla。他記得,Java 發明者 Brendan Eich 邀請他參加 Mozilla 的一次會議,“他說,‘你怎么不來,我們要討論 Rust 的設計決定?’”
Walton 想著 Rust 聽上去很不錯,于是他與 Hoare 以及一支不斷壯大的工程師團隊一起努力開發這個語言。許多人,像 Mozilla 工程師 Niko Matsakis 和 Felix Klock,都有研究內存和編碼語言的學術經歷。
參與 Rust 構建的工程師:Patrick Walton) (1),他在決定放棄編程語言的博士學位后加入了 Mozilla;Niko Matsakis (2) 和 Felix Klock (3),他們都有研究記憶和編碼語言的學術經驗;Manish Goregaokar (4),目前負責 Rust 的開發者工具團隊
2009 年,Mozilla 決定正式贊助 Rust。這門語言將是開源的,并且僅由開發者承擔責任,但是 Mozilla 愿意通過為工程師支付薪酬來啟動這個項目。
Rust 團隊征用了 Mozilla 的一間會議室,Mozilla 研究部門的聯合創始人 Dave Herman 把這間會議室叫做“書呆子洞”,并在門外掛了一張牌子。據 Hoare 的估計,在接下來的十年里,Mozilla 雇用了十幾名工程師從事 Rust 研發的全職工作。
“所有人都認為自己正在干一件很有意義的事。”Walton 回憶道。這種興奮還蔓延到 Mozilla 大樓之外。
到 2010 年代初,Rust 已經在全球范圍內吸引了許多來自技術領域的志愿者,其中一些人還在大型科技公司工作。德國一位高中生是其中一位重要的貢獻者。2010 年,在不列顛哥倫比亞省舉行的 Mozilla 會議上,Eich 站起身來,表示將有一場有關實驗語言的演講,Walton 回憶說:“如果你不是真正的程序設計語言愛好者,就別去,不然會議就開不完了。”
在 2010 年代早期,Mozilla 工程師和世界各地的 Rust 志愿者們逐步完善了 Rust 的核心——它被設計為管理內存的方式。他們創建了一個“所有權”系統,使得一個數據只能被一個變量所引用,這極大降低了內存問題發生的可能性。將你編寫的幾行代碼編譯成可以在計算機上運行程序的 Rust 編譯器,將會嚴格執行所有權規則。如果程序員違反了這些規則,編譯器將會拒絕編譯代碼并將其編譯為可運行的程序。
Rust 所用的許多技巧都不是什么新點子:“它們大部分都是幾十年前的研究成果了。”Manish Goregaokar 說,他管理著 Rust 的開發工具團隊,早年為 Mozilla 工作。但是 Rust 的工程師們善于發掘這些成熟的理念,并將其轉化為實際可行的特性。
隨著團隊對內存管理系統的改進,Rust 越來越不需要自己的垃圾收集器了。到了 2013 年,團隊就將垃圾收集器移除了。用 Rust 編寫的程序現在運行速度更快:在計算機進行清理時不會出現周期性停頓。
Hoare 指出,有些軟件工程師可能會覺得 Rust 還是有一點類似于垃圾收集的東西,像“引用計數”系統,這也是它內存所有權機制運作方式的一部分。但是不管怎么說,Rust 的性能已經變得非常高效了。它更接近于裸金屬,低至 C 和 C++ 的地位,但它是內存安全的。
Steve Klabnik 表示,移除垃圾收集“催生了一種更簡潔、更低級的語言。”Steve 是一名程序員,在 2012 年參與了 Rust 項目,為該項目撰寫了十年的文檔。
一路走來,Rust 社區也形成了一種以非常友好和開放的方式對待新人的文化。“在 Rust 社區,沒有人喊你菜鳥,”微軟首席工程師 Nell Shamrell Harrington 說,他當時在 Mozilla 從事 Rust 的工作,“沒有問題會被認為是愚蠢的。”
她說,部分原因是 Hoare 很早就頒布了禁止騷擾的“行為準則”,任何為 Rust 做出貢獻的人都應該遵守這一準則。社區接受了它,而且 Rust 社區的資深成員表示,社區這一行為準則吸引了酷兒(指同性戀、雙性戀和跨性別者)和變性者程序員參與到 Rust 中來,比例超過了其他語言。即使是程序員出錯,編譯器也會產生非常友好的錯誤信息;它們會描述這些錯誤,并且會很有禮貌地提出如何修復這些錯誤。
Shamrell Harrington 笑著說:“當我犯錯誤時,C 和 C++ 編譯器會讓我覺得自己很差勁。而 Rust 編譯器更像是在指導你如何編寫超級安全的代碼。”
終于推出了第一個版本
到了 2015 年,該團隊執著于最終推出一個“穩定”的 Rust 版本,這個版本足以讓公司為真正的客戶開發軟件。自從 Mozilla 將 Rust 納入其麾下以來,已經過去了六年,在這段漫長的開發過程中,開發者們都很想試用一下這個演示版本,雖然這個版本看起來有點粗糙:“編譯器總是會出現故障。”Goregaokar 說。現在是時候將“1.0”版本推向世界了。
Walton 記得他花了幾個小時俯身在筆記本電腦前,“在過去的兩個禮拜里寫了 45 頁左右的文檔。”他回憶道。2015 年 5 月 15 日,團隊終于推出了第一個版本,成群的 Rust “書呆子”在世界各地舉行派對慶祝。
Mozilla 的投資很快就開始有了回報。2016 年,Mozilla 的一支團隊推出了 Servo,這是一個使用 Rust 構建的新瀏覽器引擎。第二年,另一個團隊使用 Rust 重寫了 Firefox 渲染 css 的部分,CSS 是一種用于指定網站外觀的語言,這一改變極大地提高了瀏覽器的性能。Mozilla 還使用 Rust 重寫了處理 MP4 多媒體文件的代碼,而這些代碼一直面臨不安全、惡意代碼的風險。
Rust 的開發者,開始稱呼自己為“Rustaceans”(意為 Rust 開發者,Rust 用戶,Rust 愛好者),他們很快收到了消息:其他公司會嘗試使用他們的新語言。
三星的程序員告訴在法國 Mozilla 辦公室工作的 Klock,他們已經開始使用 Rust。Facebook(也就是后來的 Meta)利用 Rust 重新設計他們程序員用來管理內部源代碼的軟件。如今為 Meta 工作的 Walton 說:“它的重要性怎么強調都不為過。”
“寫 Rust 是一件很有意思的事情,雖然這聽上去有些古怪,但它的語言太棒了。很有趣,你會有一種魔術師的感覺,這是在別的程序設計語言里不可能出現的,”他說。“我們肯定在這上面下了大本錢,這可是一項新技術。”
有些公司發現,Rust 緩解了他們對內存錯誤的恐懼;Mara Bos 使用 Rust 完全重寫了她公司的無人機控制軟件,而該軟件最初是用 C++ 編寫的。
其他人則發現了放棄垃圾收集的樂趣。在 Discord,工程師們一直對 Go 中的垃圾收集器(他們用來構建軟件關鍵部分的程序設計語言)會減慢速度而感到惱火。盡管 Discord 的工程師們已經寫得很仔細,沒有垃圾需要收集,但他們的 Go 軟件還是大約每兩分鐘就會執行一次程序。2020 年,他們用 Rust 重寫了這個系統,發現現在的運行速度快了 10 倍。
就連科技巨頭的云計算平臺亞馬遜云科技的網絡服務的高管和工程師,也越來越相信 Rust 可以幫助他們編寫更安全、更快速的代碼。“Rust 具有獨特的優勢,這是我從其他語言中無法獲得的。它在一種語言中能賦予你很多超能力。”Shane Miller 說,他在去年離開亞馬遜云科技之前,在該公司創建了一支 Rust 團隊。
對于這個云計算巨頭來說,也許最關鍵的是,通過對基于 Rust 代碼的研究發現,它的運行效率非常高,其耗電量是用亞馬遜云科技常用語言之一 Java 編寫的類似程序的一半。Miller 說:“所以我可以創建一個數據中心,它可以運行我今天工作負荷的兩倍。”
讓人“不安”的成功
Rust 的成功讓一些長期貢獻者感到有些不安。隨著科技巨頭們開始采用這種語言,他們對 Rust 的影響也越來越大。他們有足夠的資金來支付工程師全職開發 Rust。例如,Rust 團隊的幾個領導人都是亞馬遜和微軟的員工。
其他有價值的貢獻者不得不在業余時間從事他們的 Rust 工作。例如,Bos 除了經營她的無人機初創公司外,還要為華為從事 Rust 方面的合同工作,但她作為 Rust 庫團隊負責人的角色是無償的。
Bos 表示,這在開源項目中是一種普遍趨勢:大公司可以更多地參與進來,并且推動項目來解決他們所關注的問題,而小企業則可能不行。“這確實給了他們一些影響力,”她說,但迄今為止,還沒有一家公司做過什么令人驚恐的舉動。”
Klabnik(去年離開 Rust)也表示贊同她的觀點,他對亞馬遜加入 Rust 提出了擔憂。他說:“我擔心嗎?是啊。它是特別糟糕還是比其他許多地方更糟糕呢?”
2021 年,各大科技公司出資成立了一家非營利性的 Rust 基金會,以資助志愿者程序員。在頭兩年中,Miller 負責為那些希望研究 Rust 某些重要特性的程序員提供 20000 美元的資金,以及需要短期經濟需求的貢獻者提供“困難”資助。
同時,它還資助了托管 Rust 代碼的服務器和一家科技公司,保證它們 24 小時不間斷地運行。Miller 說,在傳統的開源模式下,這項工作以前是由“兩個志愿者完成的,他們基本上 50% 的時間都是隨叫隨到,其中一個是意大利的學生。”
這門語言就這么不可思議地迅速成長起來。如果說 Rust 是在 2006 年誕生的,那么它現在正走出青春期、步入成熟期。
汽車公司正在采用 Rust 來構建運行汽車的關鍵代碼;航空航天公司也在采用 Rust。Dropbox 的 Timmerman 預計,“它將會得到廣泛的應用。”微軟高管甚至公開表示,許多其他科技公司可能正在閉門思考的問題是:微軟將會更多地利用 Rust 來編寫新的代碼,而 C 和 C++ 則會變得越來越少。最后可能永遠都不會有。
所有那些已經在使用的 C 和 C++ 代碼都不會消失,它們將會在未來的數十年中繼續得到應用。但如果 Rust 成為編寫需要快速和裸機的新代碼的常用方法,我們就會開始注意到,慢慢地,我們的軟件環境會越來越可靠,不會再像以前那樣不穩定、不安全。
沒有人比 Hoare 更驚訝了。“大多數語言,”他說,“都是半途夭折了。”
原文發表于 The TechNocrat,經原作者授權,InfoQ 翻譯并分享。