【CSDN 編者按】從日常生活中發(fā)現(xiàn)電梯軟件的系統(tǒng)崩潰,到將一個業(yè)余項(xiàng)目發(fā)展成為最受開發(fā)者喜愛的編程語言,這是全球開發(fā)者Graydon Hoare與Rust的一段奇妙故事。
作者 | Clive Thompsonarchive page譯者| 彎月
出品 | CSDN(ID:CSDNnews)
許多軟件項(xiàng)目的建立都是因?yàn)槟硞€地方的某個程序員遇到了一個需要解決的問題。Graydon Hoare 的故事也源于此。
Rust 誕生背景
2006 年,Hoare 是一名 29 歲的計算機(jī)程序員,就業(yè)于開源瀏覽器公司 Mozilla。有一天,回到溫哥華的公寓,他發(fā)現(xiàn)電梯壞了,原因是電梯的軟件系統(tǒng)崩潰了。這已不是第一次發(fā)生這樣的事情。
Graydon Hoare 住在 21 樓,想到要爬樓梯回家,他頓時感到很惱火:“我們這些從事計算機(jī)工作的人甚至無法制造出一部不會崩潰的電梯!”
Graydon Hoare 知道,許多此類的崩潰都是由于程序使用內(nèi)存的方式存在問題而造成的。電梯之類的設(shè)備內(nèi)部的軟件通常是用 C++ 或 C 等語言編寫的,用這兩種語言編寫的代碼運(yùn)行速度非常快,而且代碼非常緊湊。然而,問題在于,這兩種語言也很容易意外引入內(nèi)存錯誤,這些錯誤會導(dǎo)致程序崩潰。根據(jù)微軟的估計,其代碼中 70% 的漏洞是由于使用這些語言編寫的代碼存在的內(nèi)存錯誤造成的。
對于大多數(shù)人而言,當(dāng)知道自己需要爬到 21 樓時,都會很生氣,但也就僅此而已了。但 Graydon Hoare 決心為此做點(diǎn)什么。于是,他打開筆記本,開始設(shè)計一種全新的計算機(jī)語言,他希望這種語言能夠編寫出沒有內(nèi)存錯誤、小而快的代碼。他將其命名為 Rust,英文單詞“rust”本是一種真菌,中文中叫植物銹病的不少都是這類真菌造成的,他說這個名字的寓意是:“為了生存而過度設(shè)計”。
成為“最受程序員喜愛”的編程語言
17 年后,Rust 發(fā)展成為了全球最熱門的新語言之一。有將近 280 萬程序員使用 Rust 編寫代碼,從微軟到亞馬遜,許多公司都將其視為未來的關(guān)鍵。聊天平臺 Discord 使用 Rust 來加速其系統(tǒng),Dropbox 使用它來將文件同步到用戶的計算機(jī),而 Cloudflare 使用它來處理超過 20% 的互聯(lián)網(wǎng)流量。
在 Stack Overflow 的年度調(diào)查中,Rust 連續(xù)七年蟬聯(lián)“最受程序員喜愛”的編程語言。就連美國政府也在積極地推廣 Rust 軟件,將其作為確保流程更安全的一種方式。與許多成功的開源項(xiàng)目一樣,Rust 的發(fā)展也離不開社區(qū)的共同努力,現(xiàn)有數(shù)百名貢獻(xiàn)者仍在支持,其中許多是志愿者。Graydon Hoare 本人在 2013 年退出了該項(xiàng)目,很放心地將其移交給了其他工程師,包括 Mozilla 的核心團(tuán)隊。
創(chuàng)造一種新的計算機(jī)語言并不罕見。許多程序員都會利用業(yè)余時間建立一個小項(xiàng)目。但是,能夠在 JAVA、Python/ target=_blank class=infotextkey>Python 或 Java 等眾多流行的編程語言之中站穩(wěn)腳跟,實(shí)屬罕見。
C/C++ 的天然“大坑”
為了理解 Rust 為何如此實(shí)用,我們應(yīng)該深入了解編程語言對計算機(jī)內(nèi)存的處理。
簡單來說,你可以將計算機(jī)中的動態(tài)內(nèi)存想象成一塊黑板。軟件運(yùn)行時會不斷地在黑板上寫數(shù)據(jù),記錄哪個數(shù)據(jù)保存到了哪里,并在不需要的時候?qū)⑵洳脸5牵煌挠嬎銠C(jī)語言,管理這塊黑板的方式也不同。C 以及 C++ 等早期的語言傾向于賦予程序員很大的權(quán)力,讓他們來決定何時以及如何使用這塊黑板。這種能力很強(qiáng)大,代碼可以動態(tài)控制內(nèi)存,加快軟件的運(yùn)行速度。這就是為什么 C 和 C++ 常用于編寫“裸機(jī)”代碼,即直接與硬件交互。許多沒有 windows 或 linux 之類的操作系統(tǒng)的機(jī)器,比如透析機(jī)或收銀機(jī)等,都運(yùn)行著這樣的代碼。(此外,C 和 C++ 之類的語言也用于更高級的計算:有時操作系統(tǒng)需要與硬件通信。Windows、Linux 和 macOS 的內(nèi)核都是用 C 語言編寫的。)
雖然 C 和 C++ 的速度很快,但這是有代價的。編程人員需要仔細(xì)記錄寫入哪塊內(nèi)存,以及何時擦除。如果不小心忘記刪除某些內(nèi)容,結(jié)果會怎樣?可能會導(dǎo)致軟件崩潰,當(dāng)軟件嘗試使用它認(rèn)為是空的內(nèi)存,但實(shí)際上其中已保存了數(shù)據(jù),就會崩潰。或者,這會成為非法用戶的入侵渠道。
黑客會發(fā)現(xiàn)程序沒有正確清理內(nèi)存,本應(yīng)被清除的密碼或財務(wù)等信息仍然存在,他們就會偷偷攫取這些數(shù)據(jù)。隨著 C 和 C++ 代碼的規(guī)模增大,即便是程序員再細(xì)心,也可能會犯很多內(nèi)存錯誤,從而導(dǎo)致軟件中 bug 累累。
無人機(jī)公司 Fusion Engineering 的聯(lián)合創(chuàng)始人兼 Rust 庫團(tuán)隊負(fù)責(zé)人 Mara Bos 表示:“在 C 或 C++ 中,你總是會擔(dān)心代碼隨時出現(xiàn)問題。”
上個世紀(jì) 90 年代,Java、Java 和 Python 等一系列語言開始流行。這些語言采取了完全不同的方法。為了減輕編程人員的壓力,這些語言使用“垃圾收集器”自動管理內(nèi)存,這些組件會在軟件運(yùn)行時定期清理內(nèi)存。你可以編寫沒有內(nèi)存錯誤的代碼。但缺點(diǎn)是失去了細(xì)粒度的控制。程序的執(zhí)行速度也減慢了(因?yàn)槔占加昧岁P(guān)鍵的處理時間)。用這些語言編寫的軟件需要使用更多的內(nèi)存。因此,編程世界分成了兩大陣營。如果軟件需要快速運(yùn)行或在嵌入式設(shè)備的微型芯片上運(yùn)行,則選用 C 或 C++ 編寫更合適。如果是網(wǎng)絡(luò)應(yīng)用程序或手機(jī)應(yīng)用,則可以選用一種更新的、具有垃圾收集功能的語言。
編程大佬紛紛加入 Rust
Graydon Hoare 創(chuàng)建的 Rust 語言與上述這些方法有很大的不同。Rust 不需要程序員手動找出數(shù)據(jù)在內(nèi)存中的位置,而是由語言本身來管理。但 Rust 對于如何在程序中使用或復(fù)制數(shù)據(jù)有許多嚴(yán)格的規(guī)則。程序員必須學(xué)習(xí)這些編程規(guī)則—— 比 Python 或 Java 更繁瑣的規(guī)則。雖然編寫代碼的難度有所提高,但代碼是“內(nèi)存安全的”,你無需擔(dān)心不小心插入致命的內(nèi)存錯誤。最為重要的是,Rust 還將提供“并發(fā)安全”。現(xiàn)代程序可以同時做多件事——并發(fā),有時不同的線程會嘗試修改同一塊內(nèi)存,而 Rust 的內(nèi)存系統(tǒng)會阻止這種操作。
在剛開始設(shè)計 Rust 時,Graydon Hoare 在 Mozilla 工作,已是一名擁有十多年軟件開發(fā)經(jīng)驗(yàn)的老程序員。起初,Rust 只是一個業(yè)余項(xiàng)目。Graydon Hoare 花了幾年時間來開發(fā) Rust,當(dāng)?shù)谝淮蜗蚱渌绦騿T展示這門語言時,收到的反饋褒貶不一。“有些人很熱情,而有些人則表示不喜歡,還說這門語言壓根不行,永遠(yuǎn)沒機(jī)會使用。”
然而,Mozilla 的高層卻對 Rust 很感興趣。他們認(rèn)為,Rust 可以幫助他們構(gòu)建更好的瀏覽器引擎。瀏覽器是非常復(fù)雜的軟件,出現(xiàn)內(nèi)存錯誤的風(fēng)險極高。
Patrick Walton 也是 Mozilla 的一名員工,他也參與了 Rust 的開發(fā)工作。當(dāng)初,Patrick Walton 放棄繼續(xù)攻讀編程語言博士的學(xué)位,并加入了 Mozilla。偶爾的一次機(jī)會,Java 的創(chuàng)建者 Brendan Eich 把他拉進(jìn)了 Mozilla 的一次會議:“我們在討論 Rust 的設(shè)計決策,你要不要來看看?”Patrick Walton 覺得 Rust 非常棒,于是,他開始和 Graydon Hoare 一起開發(fā)該語言。后來越來越多的工程師加入了他們的隊伍。當(dāng)時的很多人,包括 Mozilla 的工程師 Niko Matsakis 和 Felix Klock,都有內(nèi)存和編程語言相關(guān)的研究經(jīng)驗(yàn)。
Patrick Walton Niko Matsakis Felix Klock Manish Goregaokar圖源:MITTechnologyReview
2009 年,Mozilla 決定正式支持 Rust。該語言是完全開源的,而且其決策由創(chuàng)造者全權(quán)負(fù)責(zé),不過 Mozilla 同意出錢資助幾位工程師。于是,Rust 小組占據(jù)了公司的一間會議室,Mozilla Research 的聯(lián)合創(chuàng)始人 Dave Herman 將其稱為“書呆子洞穴”,并在門外張貼了一個標(biāo)志。在這之后的十年里,Mozilla 雇傭了十幾名工程師全職研究 Rust。
Walton 回憶道:“每個人都覺得自己在從事一項(xiàng)偉大的事業(yè)。” 這種興奮延伸到了 Mozilla 的大樓之外。2010 年代初期,Rust 吸引了世界各個角落的科技志愿者,他們中的有些人在大型科技公司工作。其中一名主貢獻(xiàn)者是德國的一名高中生。2010年,Mozilla 在加拿大不列顛哥倫比亞省舉行會議,Eich 發(fā)表了關(guān)于實(shí)驗(yàn)性語言的演講,他說:“如果你對編程語言充滿了興趣,就一定要試試看 Rust。”
確認(rèn) Rust 核心,程序運(yùn)行更快,更安全
2010 年代初期,Mozilla 的工程師和世界各地的 Rust 志愿者逐漸打磨出了 Rust 的核心:內(nèi)存的管理方式。他們創(chuàng)建了一個“所有權(quán)”系統(tǒng),一個數(shù)據(jù)只能由一個變量引用,這大大降低了內(nèi)存出問題的風(fēng)險。Rust 的編譯器會嚴(yán)格執(zhí)行所有權(quán)規(guī)則。如果編程人員違反這些規(guī)則,編譯器將拒絕編譯代碼,也不會將其變成可運(yùn)行的程序。
Rust 使用的許多技巧都算不上新穎,Manish Goregaokar 是 Rust 開發(fā)人員工具團(tuán)隊的負(fù)責(zé)人,早年曾在 Mozilla 工作,他表示:“大多是幾十年前的研究”。但 Rust 工程師善于發(fā)現(xiàn)這些設(shè)計概念,并將它們轉(zhuǎn)化為實(shí)用的功能。
隨著這個團(tuán)隊不斷改進(jìn)內(nèi)存管理系統(tǒng),逐漸地 Rust 不再需要自己的垃圾收集器,直到 2013 年,他們刪除了垃圾收集器。如今用 Rust 編寫的程序運(yùn)行速度更快,因?yàn)橛嬎銠C(jī)不會每隔一段時間就停下來清理垃圾。Hoare 指出,一些軟件工程師認(rèn)為 Rust 仍然擁有類似于垃圾收集的元素:“引用計數(shù)”系統(tǒng),這個系統(tǒng)是內(nèi)存所有權(quán)機(jī)制的一部分。但無論采用了哪種方式,如今 Rust 的性能確實(shí)提高了,距離硬件越來越近,就像 C 和 C++ 一樣,同時也保證了內(nèi)存安全。
2012 年,Steve Klabnik 開始接觸 Rust 的開發(fā)工作,并在之后的十年里負(fù)責(zé)編寫相關(guān)文檔,他表示,刪除垃圾收集后“Rust 變成了一門更精簡且更有效地語言。”
友好的社區(qū)文化
在此過程中,Rust 社區(qū)建立了一種文化:對新人異常友好,而且非常開放。微軟首席工程師 Nell Shamrell-Harrington 曾在 Mozilla 從事 Rust 的開發(fā)工作,她表示:“我們不會稱任何人為菜鳥,沒有任何問題是愚蠢的問題。”
她說,部分原因是 Hoare 在很早以前就發(fā)布了“行為準(zhǔn)則”,任何為 Rust 做出貢獻(xiàn)的人都應(yīng)該遵守這些準(zhǔn)則。Rust 社區(qū)成員說,社區(qū)接受了這套準(zhǔn)則,并且成功地吸引到了很多編程高手加入 Rust。即便程序員犯錯,編譯器拋出的錯誤消息也很友好,不僅描述了錯誤,而且還會就如何修復(fù)禮貌地提出建議。
Shamrell-Harrington 說:“當(dāng)我犯錯誤時,C 和 C++ 的編譯器會讓我覺得自己是一個很糟糕的人。而 Rust 編譯器更像是在指導(dǎo)你編寫超級安全的代碼。”
2015 年,該團(tuán)隊全力以赴最終發(fā)布了 Rust 的“穩(wěn)定”版本。這個版本非常可靠,可用于為真正的客戶編寫軟件。距離 Rust 歸入 Mozilla 旗下已經(jīng)過去六年了,在漫長的開發(fā)期間內(nèi),編程人員一直渴望嘗試演示版本,盡管這些版本的表現(xiàn)會很糟糕,Goregaokar 說:“編譯器一直在崩潰”。終于是時候?qū)?ldquo;1.0”推向世界了。
Walton 記得自己蜷縮著身體坐在電腦前奮戰(zhàn)了幾個小時。Klabnik“在過去兩周內(nèi)寫了大約 45 頁的文檔,”他回憶道。2015 年 5 月 15 日,他們終于發(fā)布了第一個版本,眾多 Rust 粉絲聚集在世界各地慶祝。
Mozilla 的投資很快開始獲得回報。2016 年,Mozilla 小組發(fā)布了 Servo,這是一款使用 Rust 構(gòu)建的新型瀏覽器引擎。第二年,另一個小組使用 Rust 重寫了 Firefox 中渲染 css 的部分。這一變化給瀏覽器帶來了明顯的性能提升。此外,Mozilla 還使用 Rust 重寫了處理 MP4 多媒體文件的代碼。
很快,Rust 開發(fā)人員就聽到很多公司都在嘗試他們的新語言。
榮獲科技巨頭青睞
三星公司的程序員告訴在法國 Mozilla 辦公室工作的 Klock,他們已經(jīng)開始使用 Rust 語言了。Facebook(現(xiàn)改名為 Meta)使用 Rust 重新設(shè)計了程序員管理其內(nèi)部源代碼的軟件。Walton 如今在 Meta 工作,他表示:“無論怎么夸 Rust 的重要性都不為過。”
很快,許多重要軟件的核心部分都開始采用 Rust 編寫。2020 年,Dropbox 推出了其“同步引擎”的新版本,他們的工程師也用 Rust 重寫了該引擎。該系統(tǒng)最初是用 Python 編寫的,但現(xiàn)在要處理幾十億個文件(以及在線同步的數(shù)萬億個文件)。軟件工程師 Parker Timmerman(最近離開了 Dropbox)表示,Rust 降低了處理如此復(fù)雜的系統(tǒng)的難度。
他說:“使用 Rust 寫程序很愉快,這門語言太棒了,很有趣。你感覺自己就像一位魔術(shù)師,使用其他語言時根本不會有這樣的感覺。我們做了一個很明智的決定,這是一項(xiàng)新技術(shù)。”
一些公司發(fā)現(xiàn) Rust 減輕了他們對內(nèi)存錯誤的恐懼,Mara Bos 使用 Rust 重寫了控制無人機(jī)的軟件,該軟件最初是用 C++ 編寫的。
還有一些人感受到放棄垃圾收集的好處了。在 Discord,長期以來工程師們一直對 Go 中的垃圾收集器很不滿。他們用 Go 編寫的軟件大約每兩分鐘就需要執(zhí)行一次垃圾收集,盡管 Discord 的工程師寫得非常仔細(xì),沒有垃圾需要收集。2020 年,他們用 Rust 重寫了該系統(tǒng),如今運(yùn)行速度提高了 10 倍。
現(xiàn)如今,就連科技巨頭亞馬遜的云計算平臺 AWS 的高管和工程師也越來越相信 Rust 可以幫助他們編寫更安全、更快的代碼。Shane Miller 為 AWS 創(chuàng)建了一個 Rust 團(tuán)隊,他表示:“Rust 具有獨(dú)特的優(yōu)勢,可以提供其他語言無法提供的優(yōu)勢。Rust 能提供一種語言的多種超能力。”
對這家云計算巨頭來說,最重要的是,一項(xiàng)基于 Rust 代碼的研究發(fā)現(xiàn),Rust 代碼的運(yùn)行效率非常高,其耗電量只有用 Java 編寫的同等程序的一半。Miller 說:“因此,我可以創(chuàng)建一個數(shù)據(jù)中心,運(yùn)行 2 倍的工作負(fù)載。或者,只需一半大小的數(shù)據(jù)中心就可以完成同等量的工作,畢竟數(shù)據(jù)中心需要建立在城市中心,不能放到郊區(qū)。”
Rust 的成功讓一些長期貢獻(xiàn)者感到有些緊張。隨著科技巨頭陸續(xù)開始采用這種語言,他們對 Rust 產(chǎn)生的影響也越來越大。這些巨頭公司資金充沛,足夠負(fù)擔(dān)工程師全職開發(fā) Rust,實(shí)際上如今 Rust 團(tuán)隊的幾位領(lǐng)導(dǎo)者就是亞馬遜和微軟的員工。而其他有價值的貢獻(xiàn)者必須在業(yè)余時間從事 Rust 的開發(fā),比如 Bos 除了運(yùn)營她的無人機(jī)創(chuàng)業(yè)公司外,還需要承擔(dān)華為的 Rust 工作,但作為 Rust 庫的團(tuán)隊負(fù)責(zé)人,她的這部分工作并不會獲得任何酬勞。
Bos 表示,這種現(xiàn)象在開源項(xiàng)目中很常見:大公司有能力更多地參與項(xiàng)目開發(fā),他們可以推動整個項(xiàng)目,解決他們關(guān)心的問題,但小公司就沒有這種能力。她說:“大公司確實(shí)有這樣的一些影響力”。但到目前為止,沒有任何公司采取任何措施來敲響警鐘。Klabnik 對亞馬遜參與 Rust 的開發(fā)表示擔(dān)憂,“我擔(dān)心嗎?當(dāng)然擔(dān)心了。我會覺得這個項(xiàng)目比其他項(xiàng)目更糟糕嗎?并不會。”
基金會成立,開源不再用“愛”發(fā)電
2021 年,各大科技公司出資成立了一個非營利性 Rust 基金會,以支持志愿者。在 Miller 領(lǐng)導(dǎo)該基金會的頭兩年里,他們提供了 2 萬美元的資助,用于支持希望承擔(dān) Rust 主要功能開發(fā)但短期內(nèi)需要資金支持的貢獻(xiàn)者。此外,該基金會還為托管 Rust 代碼的服務(wù)器提供了資金,并付錢給一家技術(shù)公司,以確保這些服務(wù)器全天候運(yùn)行。Miller 說,在常見的開發(fā)風(fēng)格中,這項(xiàng)工作以前是由“兩名志愿者完成的,他們基本上有 50% 的時間在待命,其中一名是來自意大利的學(xué)生。”
這種語言的發(fā)展速度非常不可思議。如果說 Rust 誕生于 2006 年,那么如今即將結(jié)束青春期,走向成熟期。汽車公司正在采用 Rust 來構(gòu)建運(yùn)行車輛的關(guān)鍵代碼,航空航天公司也在使用這種編程語言。Dropbox 的 Timmerman認(rèn)為:“將來,到處都會使用 Rust。”微軟高管甚至公開表示,他們將使用 Rust 編寫越來越多的新代碼,而C和C++的使用將越來越少,最終為零。
所有使用 C 和 C++ 編寫的舊代碼不會消失,會一直使用,可能會持續(xù)數(shù)十年。但是,如果 Rust 成為編寫快速和裸機(jī)代碼的常用語言,我們會逐漸地意識到,我們的軟件環(huán)境將變得越來越可靠,不那么容易崩潰,也不至于那么不安全。
看到 Rust 如今的發(fā)展,最驚訝的人莫過于 Hoare 本人。因?yàn)椋?ldquo;許多語言都半路夭折了,”他說。