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






