Rust最近有點忙。
前有微軟CTO公開放話:“是時候用Rust取代C/C++創(chuàng)建新項目了!”后有Linus Torvalds表示,如無意外,Linux 6.1將初步支持Rust。
作為一門新語言,Rust近年來可謂風(fēng)頭正盛。
據(jù)開發(fā)者調(diào)查分析公司SlashData報告,從2021年到2022年的第一季度,Rust是使用數(shù)量增長最快的語言。而在StackOverflow相關(guān)調(diào)查中,Rust也多年蟬聯(lián)最受歡迎的編程語言。另外,蘋果、微軟、谷歌、亞馬遜、Meta 等科技巨頭陸續(xù)使用Rust,無疑也加速了Rust生態(tài)的成長。
被很多人視作“C++后繼者”的Rust開始越來越多地進入人們的視野。未來Rust是否會取代C++的議題也逐漸涌現(xiàn),但新舊編程語言之爭素來如此,只有時間才能帶來終局。當(dāng)下,不妨先來看一看Rust最近活躍的身影,從中也許能窺見其一路發(fā)展的履跡。
谷歌:兜兜轉(zhuǎn)轉(zhuǎn),尋覓C++繼任者
在外界看來,谷歌對Rust向來秉持非常開放的態(tài)度。
谷歌于近日推出的開源操作系統(tǒng)KataOS引發(fā)了一波關(guān)注。值得關(guān)注的是,出于將安全性放在首位的宗旨,KataOS專門使用Rust語言開發(fā),并基于seL4微內(nèi)核進行了構(gòu)建。之所以選擇Rust,谷歌方面表示,“這為其安全性提供了一個強有力的起點,因為Rust消除了entire classes錯誤,例如大小差一(off-by-one errors)和緩沖區(qū)溢出”。
除了在新系統(tǒng)開發(fā)中采用Rust編寫,谷歌在去年就宣布AOSP支持使用Rust開發(fā)Android操作系統(tǒng)。彼時,谷歌工程師指出,C和C++中的內(nèi)存安全bug是長期痼疾之一。盡管谷歌已經(jīng)投入了大量的精力和資源來檢測、修復(fù)、預(yù)防這類bug,內(nèi)存安全bug仍然是導(dǎo)致穩(wěn)定性問題的主因,它在Android嚴重安全漏洞中長期占比約70% 。相較于C和C++在內(nèi)存管理方面的復(fù)雜性,Rust可以利用編譯時檢查(確保對象的生命周期和所有權(quán))和運行時檢查(確保內(nèi)存訪問有效)來保證內(nèi)存安全。而且Rust在實現(xiàn)安全性的同時還提供了與C和C++相當(dāng)?shù)男阅堋?/p>
此外,在是否應(yīng)將Rust代碼引入Linux內(nèi)核的討論中,谷歌曾公開表示支持立場。谷歌安全博客曾發(fā)文稱:“我們認為,Rust現(xiàn)在已經(jīng)準(zhǔn)備好加入C語言,成為實現(xiàn)內(nèi)核的實用語言。它可以幫助我們減少特權(quán)代碼中潛在的bug和安全漏洞,同時與內(nèi)核也配合得很好,可以很大程度上保留其性能特性?!?/p>
可以說,谷歌對Rust一直不吝支持。但在尋找C++繼任者的實驗之路上,谷歌并未止步于Rust。
在今年7月舉辦的CPP North C++大會上,谷歌開源并發(fā)布了新型語言Carbon,并稱其是C++的實驗性繼任者。
谷歌工程師Chandler Carruth介紹,Carbon旨在與現(xiàn)有的C++代碼完全互操作,目標(biāo)是盡可能輕松地從C++遷移到Carbon。與之相比,Rust固然在內(nèi)存安全性上優(yōu)勢鮮明,但其可能永遠無法與C++達成足夠的互操作性,以致很難實現(xiàn)平滑遷移。
對于Carbon的出現(xiàn),C++之父Bjarne Stroustrup應(yīng)媒體之邀給出了直白的回應(yīng):“總有新的語言試圖成為C++的繼任者。我歡迎對編程語言和編程風(fēng)格進行實驗,但我不想引發(fā)爭議。批評已建立的語言很容易,因為我們知道它們的問題,但通常很難在不產(chǎn)生語言規(guī)則、庫和管理方面的全新問題的情況下提供替代方案。Carbon太新了,而且規(guī)范不足,以至于我無法真正做出有意義的技術(shù)評論?!?/p>
微軟Azure:CTO力挺Rust與C++之父隔空battle
同樣是支持,相較于谷歌對Rust的態(tài)度,微軟就顯得激進很多。
自2004年以來,微軟安全響應(yīng)中心(MSRC)已對所有報告過的微軟安全漏洞進行了分類,發(fā)現(xiàn)其年度補丁中約有70%是針對內(nèi)存安全漏洞的修復(fù)程序。而造成這一結(jié)果的主要原因是Windows和大多數(shù)其他微軟產(chǎn)品主要使用C和C++這兩種memory-unsafe的語言編寫。
如果能消除這些漏洞將明顯提高軟件安全性,同時降低漏洞修復(fù)成本。于是,微軟開始探索使用諸如Rust之類的memory-safe語言作為C和C++等語言的替代方案,以此來改善應(yīng)用程序的安全狀況。除此之外,在Rust的啟發(fā)下,微軟還著手開發(fā)了自己的內(nèi)存安全編程語言Project Verona。
微軟對Rust前景的看好有目共睹。今年9月,微軟Azure CTO Mark Russinovich的公開表態(tài)又引起了熱議。
Russinovich在推特上表示:“是時候停止使用C/C++創(chuàng)建任何新項目了。如果你要開新項目,而且需要使用非GC語言的時候,建議使用Rust替代。出于安全和可靠的考慮,業(yè)界應(yīng)該宣布棄用C/C++?!辈贿^他也強調(diào),并非是要用Rust完全取代C/C++寫好的東西,只是“對于新工具,我會偏向Rust”。
對這一觀點,Bjarne Stroustrup這次給出的回應(yīng)更為“辛辣”:“人們——尤其是高管——迷戀那些承諾可以讓他們的生活更輕松的新事物,這并不少見。此外,支持新事物遠比解決舊工具和知名工具的已知問題更令人興奮。不過,新語言通常需要多年時間和重大努力才能在其廣泛的應(yīng)用領(lǐng)域與成熟語言相匹配。愛好者很少看到這一點,并且他們的評論往往是片面的。”
同時,Stroustrup表示,多年來他一直致力于提高C++的安全性,現(xiàn)在已經(jīng)可以在ISO C++中實現(xiàn)有保證的完美類型和內(nèi)存安全?!耙⒁獾氖?,包括Rust在內(nèi)的每一種‘安全’語言都存在允許不安全代碼的漏洞。”
Rust加入Linux之旅:千呼萬喚始出來
Rust的迅速崛起離不開頂級的項目引入。而Linux內(nèi)核何時能支持Rust一直備受矚目。
自Rust嶄露頭角,許多人呼吁在Linux內(nèi)核中增加Rust語言的支持,甚至還為此誕生了一個叫“Rust for Linux”的組織。
早在2020年,Linus Torvalds就回應(yīng)過相關(guān)問題,他并沒有否定這一提議。而在Linux Plumbers Conference 2020大會上,內(nèi)核開發(fā)者們普遍達成共識:沒必要將已有內(nèi)核用Rust重寫,應(yīng)專注于可以用Rust編寫的新代碼。此后,Linus也一直對此持觀望和開放態(tài)度。
Rust到底有沒有可能成為Linux內(nèi)核中除C之外的第二種官方語言呢?答案是肯定的。
不過本以為能在6.0版本看到Rust合并進內(nèi)核,但最終沒有實現(xiàn)。究其原因,主要有兩個,一個是非標(biāo)準(zhǔn)的Rust擴展的處理,另一個是Rust編譯器還不穩(wěn)定。Linus表示自己更關(guān)心后面這個原因,因為Rust編譯器的可靠性和穩(wěn)定性更重要。
而今年的LPC大會舉行了一個Rust相關(guān)的小型會議。會上,西部數(shù)據(jù)公司的工程師Andreas Hindborg的發(fā)表頗為引人注目,其主旨是圍繞基于Rust的NVMe驅(qū)動程序。
目前Linux內(nèi)核已經(jīng)擁有出色的由C編寫的NVMe驅(qū)動程序,不需要替換。但鑒于NVMe驅(qū)動程序的廣泛使用度及其重要性,使用Rust編寫的NVMe驅(qū)動程序也是一個非常有趣的嘗試。基準(zhǔn)測試結(jié)果表明,雖然Rust NVMe驅(qū)動程序仍處于早期階段,但其已表現(xiàn)不俗——結(jié)果表明該Rust驅(qū)動程序能夠?qū)崿F(xiàn)與C驅(qū)動程序相當(dāng)?shù)男阅堋?/p>
就在LPC大會之后的2022 Linux內(nèi)核維護者峰會上,Linus提議將Rust支持合并到Linux 6.1中。他表示,希望在內(nèi)核中看到Rust的一個原因是鼓勵新的開發(fā)者研究內(nèi)核。不過他也提醒,目前“Rust只在核心基礎(chǔ)設(shè)施使用”。不過,這對Rust和Linux來說,都將是歷史性的第一步。
新舊語言之爭:唯有時間是永遠的莊家
在編程世界中,新舊語言之爭歷久彌新。不少人期待Rust對標(biāo)C++,就像TypeScript之于JavaScript,Kotlin之于Java。
不過事實上,兩者并非“你死我活”的關(guān)系。一些C++的擁躉也并非完全排斥Rust,一些鼓吹Rust的人或許也并不完全了解Rust,就像某位網(wǎng)友的反諷“They don't write a piece of code, but they're trying to rust everything”。
推陳出新固然是技術(shù)演進的必然,但像C++、C、Java等老牌編程語言能有如今的江山,也非一日之功。況且任何要彌補C++缺陷的語言, 都得和C++協(xié)作, 復(fù)用C++的輪子。
而今時今日,Rust說到底仍然是一門年輕的語言,或許我們可以爭論Rust是否為異步編程提供了最好的模型,擺脫垃圾回收對開發(fā)人員助益如何,但要討論它是否終將取代C++,顯然為時尚早。
對于Rust,無論你是愛它還是恨它,都不能否認其崛起的速度,但未來究竟會如何,尚需時間的檢驗。正如微軟首席工程師Nick Cameron所說,現(xiàn)如今Rust正處于一個良好的發(fā)展局面:受歡迎程度越來越高、貢獻者越來越多,還在一些重要領(lǐng)域進行了應(yīng)用。但在這個充滿變化的時代,從一個研究項目到一個新的、快速變化的語言再過渡到一個流行的、成熟的項目,是一個困難的演變過程。
就開發(fā)人員來說,Rust可能適合也可能不適合你或你的項目,可能是也可能不是創(chuàng)建相關(guān)程序的最優(yōu)解決方案。但至少它提供了一個新的選擇,增加了更多探索和想象的路徑。就像Peter Wayner在《喜歡/討厭Rust的七個理由》一文中總結(jié)的那樣:“作為一門語言,Rust很新穎,學(xué)習(xí)它可以使人的大腦得到延伸。作為程序員,它讓我們有理由重新思考我們的挑戰(zhàn),重新制定我們的目標(biāo),并著手尋找編寫現(xiàn)代軟件的最佳方式。還有什么能比這更好呢?”
參考鏈接:
??https://www.theregister.com/2022/10/17/google_kata_os/?td=rt-3a??
??https://www.theregister.com/2022/09/28/is_it_time_to_retire_c/??