繁體
  • 简体中文
  • 繁體中文

熱門資訊> 正文

從電梯故障到編程新寵,Rust為何連續七年稱霸「最受推崇語言」

2024-08-16 12:44

在StackOverflow每年發佈的開發者調查中,最流行的編程語言不是JavaScript就是SQL。

但除了流行程度,StackOverflow還設計了另一種指標:「期待和推崇程度」(Admired and Desired)。

在這個指標上,Rust幾乎是無可質疑的王者,已經連續7年高票當選「最受推崇的語言」。

藍色表示Desired,紅色表示Admired 藍色表示Desired,紅色表示Admired

根據MIT科技評論的報道,有280萬程序員使用Rust編寫代碼,微軟、亞馬遜等科技巨頭都將其視為未來的關鍵。聊天平臺Discord使用Rust來加速系統,Cloudflare使用它處理超過20%的互聯網流量。

甚至美國政府也熱衷於推廣Rust編寫的軟件,以使其流程更加安全。

然而,這個誕生於2006年的語言,最開始只是個人開發者的業余項目;18年后的今天,它已經成為最熱門的新語言之一。

電梯故障誕生的語言

許多軟件項目的誕生,都可以追溯到某個被生活折磨到焦頭爛額的程序員。Rust的故事也與此類似。

2006年,29歲的Graydon Hoare是Mozilla的一名程序員。有一天下班回家,突然發現電梯因為軟件崩潰沒法運行了。

這已經不是第一次了,但Hoare家恰好住在21樓。

他一邊爬樓梯一邊暗自惱火,「這太可笑了,我們這些搞計算機的人,甚至都沒法造出一個不崩潰的電梯!」

作為程序員,Hoare很清楚問題所在——電梯等設備內部的軟件通常都是用C或C++編寫的,好處在於運行速度快,但也很容易意外引入內存錯誤,造成程序崩潰。

微軟估計,其代碼中70%的bug都是由於這些語言的內存錯誤引起的。

或許是被憤怒的情緒激起了創造力,爬完樓梯回到家中后,Hoare打開電腦,開始設計一種新的編程語言。

他希望這種語言能夠編寫出簡潔、短小但運行速度快的代碼,而且能從根本上杜絕內存錯誤。

Rust這個名字也與此有關,根據Hoare的描述,這是一種非常頑強的真菌,「爲了生存而被過度設計」。

即使已經在Mozilla打工10年,Hoare依然很有「極客精神」,在這個業余項目上孜孜不倦地投入了好幾年的精力。但當他向同事們展示時,卻得到了褒貶不一的反應。

有些迴應比較熱情,但得到的白眼更多:「這永遠不會起作用的。」

但幸運的是,Mozilla高管們很感興趣,他們意識到,Rust可以幫助構建更好的瀏覽器引擎。在瀏覽器這種複雜軟件中,有很多機會出現危險的內存錯誤。

Rust如何站穩腳跟

如今,要設計出一種新的編程語言在技術上並不困難,很多程序員都會創建類似的小項目作為業余消遣。

但要想讓一種語言真正得到社區認可、投入廣泛使用,邁入知名編程語言的行列,與Python、JavaScript等並列,這個概率堪比小行星撞地球。

Rust到今天的發展歷程,不僅源於其本身的技術特點,更離不開Mozilla和開源社區在背后的支持。

2009年,Patrick Walton放棄了編程語言方向的博士學習加入Mozilla,他依舊記得JavaScript的發明者Brendan Eich拉他參加Mozilla的一次會議:

「你為什麼不來這個房間看看呢?我們會討論Rust的一些設計決策。」

Walton認為Rust的理念十分不錯,於是和Hoare開始共同進行開發。

這個不斷壯大的團隊后來也有資深工程師Niko Matsakis和Felix Klock等人的加入,兩人都有研究內存和編程語言的學術經歷,本科都畢業於MIT,並分別在ETH和東北大學獲得了博士學位。

Mozilla的高管意識到了Rust的價值,因此他們派了幾名資深工程師參與該項目,包括Patrick Walton(1) 、Niko Matsakis(2)和Felix Klock(3),以及Manish Goregaokar(4),他目前負責 Rust的開發者工具團隊

2009年,Mozilla決定正式贊助 Rust。雖然定位為開源語言,但Mozilla願意僱用全職工程師來引導它的發展方向。

Rust小組接管了公司的一間會議室,Mozilla Research的聯合創始人Dave Herman將這個房間戲稱為「書呆子洞穴」,並在門外貼了一個標誌。

Hoare估計,在接下來的10年里,Mozilla僱傭了十幾名工程師全職從事Rust的開發工作。

根據Walton的回憶,在Rust的開發歷程中,「每個人都感覺自己正在做一件非常偉大的事情」。

這種興奮也蔓延到了Mozilla大樓之外。到2010年代初,Rust吸引了來自世界各地的志願者。其中有些在科技巨頭工作,還有一個主要貢獻者是來自德國的高中生。

2010年在加拿大不列顛哥倫比亞省舉行的Mozilla會議上,Eich向與會者表示,將會有一場關於實驗性編程語言的演講,「除非你是真正的編程語言迷,否則不要參加」。但最后,整個房間座無虛席。

Steve Klabnik從2012年開始加入Rust的開發工作,並在此后的10年時間中始終負責文檔的編寫。他表示,移除垃圾收集機制(garbage collection, GC)讓Rust成為一種「更精簡、更出色的語言」。

「不會有任何人將你稱為為『菜鳥』,任何問題都不會被當成愚蠢的問題。」當時在Mozilla從事Rust工作的微軟首席工程師Nell Shamrell-Harrington這樣形容。

Shamrell-Harrington認為,這種社區氛圍的部分原因是Hoare很早就發佈的禁止騷擾的「行爲準則」,要求每個Rust的貢獻者都應該遵守。

Rust社區接受了這套準則,有長期成員表示,相比其他語言,Rust吸引了更高比例的少數羣體。

不僅僅是程序員,連Rust的編譯器都更加友好。在報錯信息中,它會對bug進行描述,並禮貌地給出修復建議。

「當我犯錯誤時,C和C++的編譯器會讓我感覺自己是個糟糕的人,但Rust編譯器更像是在指導你編寫超級安全的代碼。」

雖然Rust團隊都是由真正的大佬組成,但開發過程依舊漫長而艱辛。

從2009年Mozilla將Rust納入麾下開始,直到2015年,團隊才最終發佈了Rust的1.0「穩定」版本,它足夠可靠,可供公司真正投入商用。

六年時間中,程序員們始終渴望發佈demo,儘管編譯器總是崩潰。

根據Walton的回憶,他經常在電腦面前彎腰坐好幾個小時,Klabnik在發佈前的2周時間內趕出了約45頁的文檔。

2015年5月15日,Rust終於問世,Mozilla的投資也很快得到了回報。

2016年,公司的一個開發小組發佈了Servo,是一種用Rust構建的全新瀏覽器引擎;第二年,另一個小組用Rust重寫了Firefox渲染CSS的部分,使使瀏覽器的性能得到了顯著提升。

此外,瀏覽器中的處理MP4多媒體文件的代碼曾被認為不安全、有惡意代碼風險,也用Rust進行了重寫。

除了Mozilla,也有越來越多的公司開始使用Rust,包括三星、Facebook、Dropbox等。很快,Rust就被用於編寫重要的軟件的核心。

2020年,Dropbox推出了新版本的「同步引擎」,負責在用户計算機和Dropbox雲存儲之間同步文件。

這個系統最初用Python編寫,但隨着規模擴展到數十億個文件(以及數萬億個在線同步文件),工程師們用Rust重寫了這些功能。

他們表示,Rust使這種複雜性的處理過程變得更容易,甚至令人愉快。

Rust發展速度之迅猛令人難以置信,不僅僅是IT行業,汽車和航空航天公司也開始採用Rust構建關鍵代碼。

Dropbox的工程師Parker Timmerman預測,Rust將變得無處不在。

微軟高管甚至公開暗示了許多科技公司在私下考慮的事情:新代碼中將越來越多使用Rust,而越來越少地使用C和C++,最終可能完全棄用后者。

這種説法也許有點誇張,畢竟已經存在的C和C++代碼不會立刻消失,而且還會繼續運行數十年。

但如果Rust逐漸成為需要快速運行的裸機代碼的首選,我們的軟件環境將逐漸變得可靠,減少程序崩潰,減少不安全感。

前段時間的微軟藍屏事件就已經向我們展示了,當今的計算機程序依舊有自己的「軟肋」,而且一旦出現大規模的程序崩潰,會帶來難以估量的破壞和損失。

根除內存錯誤

Rust之所以能用如此快的速度威脅到C和C++的地位,與語言本身的安全特性有非常密切的關係。

我們可以粗略地將計算機的動態內存想象為一塊黑板,軟件運行時,會不斷地將少量數據寫入黑板,同時跟蹤數據的位置,並及時刪除無用數據。

這個過程看似簡單,但其實涉及到相當多的機制設計和工程決策,不同的編程語言會用不同的方式實現。

C或C++等比較古早的語言會給程序員更多權力,決定軟件如何以及何時使用「黑板」。

這種能力相當有用:通過自行控制和分配動態內存,程序員可以設計出運行速度很快的軟件,因此C和C++常用於編寫「裸機」代碼(bare-metal),即直接與硬件交互的代碼。

Window、Linux和MacOS等操作系統的內核都是用C編寫的,在沒有操作系統的機器上,比如收銀機或透析裝置,也都在C或C++上運行。

但這種優勢不是沒有代價的。俗話説得好,「能力越大,責任越大」。

既然C/C++程序員有如此大的權力,能控制內存分配,自然也要仔細跟蹤所有的內存寫入和擦除過程。

誤刪內容,程序會崩潰;忘記及時刪除內容,程序也會崩潰。此外,如果有密碼、財務信息等敏感內容遺留在內存中,還會造成安全隱患,給黑客以可乘之機。

隨着一段C或C++代碼逐漸膨脹,即使是最細心謹慎的程序員也可能會犯很多內存錯誤,從而開發出一個充滿bug的軟件。

無人機公司Fusion Engineering的聯合創始人Mara Bos同時兼任Rust Library團隊負責人,她表示,「在C或C++中,你總是擔心代碼會隨機爆炸。」

90年代,Java、JavaScript和Python等一系列新語言開始流行,它們採取了一種非常不同的方法進行內存自動管理——「垃圾收集器」(garbage collector, GC)。

在軟件運行的同時,GC會每隔一段時間自動清理內存,大大減輕了程序員的壓力。

但可想而知,這類語言雖然有更少的內存錯誤,但失去了這種細粒度的內存管理,程序也會運行得更慢,尤其是GC機制也會造成額外的負擔。

就此,編程語言逐漸分出了兩個陣營——如果對性能要求較高,或是在嵌入式設備上運行,就用C或C++;如果要開發web或移動應用程序,那就需要有GC機制的語言。

通過創建Rust,Hoare希望能區分這些方法之間的差異。用Rust編碼時,程序員不需要手動管理數據在內存中的位置,編譯器會自動幫你做到這一點,但同時也引入了許多嚴格的規則,規定程序內使用或複製數據的操作。

相比Python或JavaScript,這些規則更加繁瑣,因此編碼過程也更加困難,但可以保證程序的「內存安全」。

只要程序通過編譯,就無需擔心你的代碼會存在意外的內存錯誤。

更重要的是,Rust還提供「併發安全」。在現代程序中,併發執行的多個線程可能會嘗試同時修改同一塊內存,

而Rust的內存系統會自動阻止這種情況。

整個2010年代初,Mozilla工程師和世界各地的Rust志願者們逐漸打磨出了Rust的核心,也就是它管理內存的方式。

他們創建了一個「所有權」系統(ownership),規定每條數據只能由一個變量引用,並由編譯器強制執行,這大大降低了出現內存問題的機率。

Mozilla工程師Manish Goregaokar如今負責Rust的開發者工具團隊,他表示,Rust採用的許多技巧並不是什麼新想法,其中大多都是幾十年前的研究。但Rust工程師善於發現這些經過精心打磨的概念,並將其轉化為實際可用的功能。

隨着團隊逐漸改進內存管理系統,Rust對GC的依賴逐漸減少,到2013年,開發團隊就從Rust中徹底移除了GC組件。

然而,有些工程師認為Rust仍然保留了一些類似GC機制的元素,比如引用計數系統(reference counting),作為內存所有權機制的一部分。

沒有垃圾清理機制,程序就不需要定期中斷以清理內存,Rust的運行速度也隨之加快,性能接近C和C++的水準,但保證了內存安全。

Rust在逐漸推廣時展現出的高性能常常讓工程師們為之振奮。

Discord的工程師們對Go的GC機制積怨已久,即使代碼構建得非常仔細,沒有垃圾可以收集,Go也依舊會兩分鍾暫停一次執行GC。

2020年,他們用Rust重寫了系統,發現運行速度比原來提高了10 倍。

AWS的高管和工程師也越來越相信,Rust可以幫助他們編寫更安全、更快的代碼。

他們進行了相關的研究,發現相比Java,基於Rust的類似代碼的耗電量可以減少一半,這就意味着可以用相同的設備運行2×的工作負載。

Rust能從業余項目逐漸發展至今天的成就,沒有人比Hoare更感到驚訝。畢竟,大多數語言在正式面世之前,就已經半途而廢了。

(聲明:本文僅代表作者觀點,不代表新浪網立場。)

風險及免責提示:以上內容僅代表作者的個人立場和觀點,不代表華盛的任何立場,華盛亦無法證實上述內容的真實性、準確性和原創性。投資者在做出任何投資決定前,應結合自身情況,考慮投資產品的風險。必要時,請諮詢專業投資顧問的意見。華盛不提供任何投資建議,對此亦不做任何承諾和保證。