?作者 | 云昭
2022,越來(lái)越多的開(kāi)發(fā)者會(huì)發(fā)現(xiàn),組長(zhǎng)開(kāi)始讓自己組用 Rust 來(lái)重構(gòu)項(xiàng)目了,即便是組長(zhǎng)不 Push,身邊的同事好像也在悄咪咪地練習(xí)“borrow checker”,有時(shí)還會(huì)看見(jiàn)同事對(duì)著屏幕發(fā)飆:什么玩意兒,不倒騰了!
網(wǎng)友戲稱:只需要十行 Rust 代碼,就能讓你果斷放棄!
學(xué) Rust 難,已經(jīng)是一個(gè)共識(shí)。然而,那些吐槽難的同學(xué),往往會(huì)過(guò)一段時(shí)間重新操練起來(lái),屢戰(zhàn)屢敗,屢敗屢戰(zhàn)。曾有一位資深的技術(shù)大牛吐槽:我放棄 Rust 已經(jīng)四次了!
Rust 讓人既愛(ài)又恨,恨得腦袋火冒三丈,直噴這代碼連鍵盤都不夠敲了,但又每次看到 Github 上的項(xiàng)目運(yùn)行得如此高效優(yōu)雅,讓人卻之不恭。
來(lái)源:知乎
1、Rust 魅力所在
企業(yè)對(duì)于 Rust 的吹捧已非一時(shí)興起。
以近日電商行業(yè)軟件開(kāi)發(fā)商 Shopify 宣布擁抱 Rust 為例,Shopify 從一致性、性能、社區(qū)、生產(chǎn)力、安全等 5 個(gè)方面闡述了 Rust 對(duì)于其業(yè)務(wù)的吸引力和評(píng)估考量。
業(yè)務(wù)需求一致對(duì)口,性能高效,入門雖然難但開(kāi)發(fā)還挺高效,社區(qū)驅(qū)動(dòng)的開(kāi)源項(xiàng)目,內(nèi)存安全??梢哉f(shuō) Shopify 已經(jīng)把 Rust 的每個(gè)好處都說(shuō)了個(gè)遍。
一致性:Shopify 的系統(tǒng)編程需要覆蓋多個(gè)領(lǐng)域,而且隨著時(shí)間的推移,這個(gè)數(shù)字可能會(huì)增加。它們包括高性能服務(wù)器、提高性能或連接到其他庫(kù)的 Ruby 擴(kuò)展,以及編譯到 Web Assembly。Shopify 訴求是對(duì)單一語(yǔ)言進(jìn)行投資,并將其應(yīng)用到眾多領(lǐng)域,這意味著要確定一種可以非常靈活使用的語(yǔ)言。
性能:Shopify 需要能夠高效、可持續(xù)地?cái)U(kuò)展,以支持全球商業(yè)。Rust 為我們提供了可預(yù)測(cè)的本機(jī)代碼性能,包括對(duì)內(nèi)存使用的精細(xì)控制,這使得它適合于我們堆棧的最低級(jí)別。當(dāng)然,Rust 并不是唯一能夠提供或近似這種性能的語(yǔ)言。在此基礎(chǔ)上,還可以考慮使用現(xiàn)代 C++,如果垃圾收集器的分配行為和性能可以接受,則可以使用 Go。
社區(qū):Rust 語(yǔ)言和生態(tài)系統(tǒng)由一個(gè)健康的社區(qū)驅(qū)動(dòng),Shopify 計(jì)劃像 Ruby、Rails、React Native 和其他開(kāi)源項(xiàng)目一樣參與這個(gè)社區(qū)。Rust 的 RFC 過(guò)程和治理結(jié)構(gòu)為包容性、深思熟慮的討論提供了強(qiáng)大的基礎(chǔ),以推動(dòng)語(yǔ)言和工具的未來(lái)。我們的貢獻(xiàn)不僅有望使 Rust 在 Shopify 的使用中更加高效,而且還將改善所有 Rust 開(kāi)發(fā)人員的工作。這也是 Shopify 加入 Rust 基金會(huì)的原因。我們希望支持 Rust 優(yōu)秀的治理模式和“Rust commons”的維護(hù),并將 Shopify 的知識(shí)和觀點(diǎn)帶入更大的 Rust 對(duì)話中。
生產(chǎn)力:在某些圈子里,Rust 以難以學(xué)習(xí)和使用而聞名,但 Shopify 內(nèi)部和外部的開(kāi)發(fā)人員發(fā)現(xiàn),在最初的學(xué)習(xí)期之后,他們使用 Rust 構(gòu)建起來(lái)非常高效和舒適。Rust 還有一個(gè)強(qiáng)大的庫(kù)生態(tài)系統(tǒng)(“crates”)和良好的 IDE 集成工具,當(dāng)然還有非常好的編譯器錯(cuò)誤消息。類型和宏系統(tǒng)的強(qiáng)大功能允許非常有表現(xiàn)力的 API 和語(yǔ)法,將開(kāi)發(fā)人員的精力集中在表達(dá)他們的意思上,而不是在頭腦中玩弄大量的狀態(tài)和不變量。Go 在這里也有很好的聲譽(yù),C 和 C++ 就不那么好了。
安全:Rust 提供了許多讓編譯器幫助確保程序正確的工具,包括它們安全地管理內(nèi)存,并且可以“無(wú)畏地并行”。隨著 Shopify 對(duì) Rust 的使用越來(lái)越復(fù)雜,將找到更多的方法來(lái)使用 Rust 的類型系統(tǒng)和安全規(guī)則來(lái)保持系統(tǒng)中的不變量。從我們最初的項(xiàng)目中,我們發(fā)現(xiàn)與我們?cè)u(píng)估的其他語(yǔ)言相比,Rust 在編譯時(shí)而不是運(yùn)行時(shí)暴露更多的錯(cuò)誤。Rust 開(kāi)發(fā)者經(jīng)常說(shuō)“部署沒(méi)問(wèn)題”,原因就在于此。
2、背后推手
Rust 在編程語(yǔ)言界內(nèi)算是年輕一輩,但能在 Stack Overflow 開(kāi)發(fā)者調(diào)查的“最受喜愛(ài)編程語(yǔ)言”評(píng)選項(xiàng)目中連續(xù)七年摘下桂冠,足以說(shuō)明背后實(shí)力不俗。
這種實(shí)力,除了 Rust 本身的特質(zhì),更多的則來(lái)自于多家頂級(jí)大型公司或者名人的背書。
外界耳熟能詳?shù)目赡芤讓傥④洝?019 年 2 月發(fā)布報(bào)告稱 70% 的安全問(wèn)題為內(nèi)存安全問(wèn)題,為了解決安全問(wèn)題,開(kāi)始嘗試使用 Rust 來(lái)代替 C/C++ 重寫 Windows 組件;微軟的 DeisLabs 團(tuán)隊(duì)也選擇 Rust 來(lái)構(gòu)建 Kubernetes 工具 Krustlet,并稱 Rust 比 Go 更適合 Kubernetes 的開(kāi)發(fā) 。
再比如 Facebook: 從 2016 年開(kāi)始使用 Rust,當(dāng)時(shí)啟動(dòng)了一個(gè)名為 Mononoke 的重寫項(xiàng)目;有 Mononoke 項(xiàng)目作為 Rust 語(yǔ)言是可行的,2019 年內(nèi)部 Rust 開(kāi)發(fā)團(tuán)隊(duì)達(dá)到了 100 人,并開(kāi)始應(yīng)用于 Diem 區(qū)塊鏈項(xiàng)目;2020 年在內(nèi)部成立了 Rust 開(kāi)發(fā)者體驗(yàn)團(tuán)隊(duì),繼續(xù)為 Rust 社區(qū)做貢獻(xiàn),并支持內(nèi)部 Rust 項(xiàng)目開(kāi)發(fā) 。
還有谷歌:2016 年開(kāi)始開(kāi)發(fā)的 Fuchsia 操作系統(tǒng),在 2020 年 12 月首次亮相于 google open source,其中 22% 的代碼為 Rust 編寫 。
值得一提的是,安全的語(yǔ)言特性與區(qū)塊鏈的特性天生有重合性,因此區(qū)塊鏈也成為較早引入 Rust 語(yǔ)言的領(lǐng)域之一。Gavin Wood 博士開(kāi)發(fā)的 Parity 客戶端應(yīng)該是首個(gè)使用 Rust 的區(qū)塊鏈項(xiàng)目,于 2015 年推出,Parity Technologies 的產(chǎn)品還包括 Polkadot、substrate 等 。Parity 一經(jīng)發(fā)布在當(dāng)時(shí)引起了不小的轟動(dòng)。
對(duì)了,Mozilla 作為 Rust 項(xiàng)目的孵化起源地,F(xiàn)ireFox 瀏覽器原本計(jì)劃全部用 Rust 重寫,但事與愿違,最后只完成了不到 10% 的比例,整個(gè) Rust 項(xiàng)目就被砍掉了!不過(guò)正是因?yàn)楸豢?,才?Rust 得以有了今天遍地開(kāi)花的局面。
許多技術(shù)圈內(nèi)的大佬對(duì) Rust 也是推崇備至,Linux 便是其中之一。
由 Linux 基金會(huì)主辦的 2022 開(kāi)源峰會(huì)上,Linus 宣布:Linux 開(kāi)始擁抱 Rust!
不久,Azure CTO Mark Russinovich 甚至在 9 月呼吁停用 C/C++,建議使用 Rust,一時(shí)引起網(wǎng)友熱議。
而時(shí)任微軟首席工程師的 Nick Cameron 在個(gè)人博客經(jīng)??吹?Rust 的字眼,并給出了許多中肯的 Rust 發(fā)展建議。
甚至 Python 的創(chuàng)始人 Guido van Rossum,不惜自損 Python 4.0 也要夸一夸 Rust。Guido 表示 Python 4.0 很難看到曙光,并認(rèn)為 Rust 是一種迷人的語(yǔ)言,幾乎可以完美地處理內(nèi)存管理問(wèn)題。
視線拉回國(guó)內(nèi),華為、阿里、百度、字節(jié)等企業(yè)都已經(jīng)入局了 Rust。華為作為國(guó)內(nèi)唯一 Rust 基金會(huì)創(chuàng)始成員,可以說(shuō)在 Rust 社區(qū)相當(dāng)活躍,比如開(kāi)發(fā)了代發(fā)度量工具 Tokei、Cargo-Geiger ,同時(shí)嘗試將 Rust 應(yīng)用于開(kāi)源項(xiàng)目:StratoVirt 是 openEuler 上的企業(yè)級(jí)虛擬化平臺(tái),面向云數(shù)據(jù)中心,實(shí)現(xiàn)了一套架構(gòu)統(tǒng)一支持虛擬機(jī)、容器、Serverless 三種場(chǎng)景。此外,華為還發(fā)起了 Rusted AI 的非商業(yè)組織,推動(dòng) Rust 在 AI 領(lǐng)域的應(yīng)用落地 。
而字節(jié)跳動(dòng)飛書團(tuán)隊(duì)則從 2017 年開(kāi)始引入 Rust,飛書客戶端非 UI 部分是由 Rust 跨平臺(tái)實(shí)現(xiàn) ;2021 年 5 月開(kāi)源了 rsmpeg 項(xiàng)目(一個(gè) FFmpeg 的庫(kù)),也是采用 Rust 作為主要語(yǔ)言。
阿里則在云原生方面加碼了 Rust 的投入,比如 11 月,Nacos 多語(yǔ)言體系中迎來(lái)了 Rust 版本。
3、2023,Rust 值得再次拾起嗎?
值得,當(dāng)然值得。不管是趨勢(shì)還是現(xiàn)實(shí),Rust 的價(jià)值已經(jīng)十分清晰。
首先從流行度上而言,Stack Overflow開(kāi)發(fā)者調(diào)查以及 Rust 的年度調(diào)查都在表明使用 Rust 作為工作語(yǔ)言的占比正在持續(xù)提高,這種慣性一旦養(yǎng)成,就會(huì)成為當(dāng)年 Java 風(fēng)靡全球之勢(shì)。
此外還是 Rust 基金會(huì)的助力,這種趨勢(shì)會(huì)越來(lái)越快。據(jù)悉,Rust 基金會(huì)的創(chuàng)始成員承諾在 2 年內(nèi),提供每年超過(guò)一百萬(wàn)美元的預(yù)算,用于 Rust 項(xiàng)目的維護(hù)、開(kāi)發(fā)和推廣。
其次,Rust 代表著一種“前衛(wèi)”的編程理念。軟件性能的提升總是滯后于硬件性能的提升。Rust 這種基于多核編程的理念,將對(duì)性能的低級(jí)(low-level)控制與現(xiàn)代語(yǔ)言功能結(jié)合在一起,語(yǔ)法上類似于 C++,但是又可以保證內(nèi)存安全,足以讓它在未來(lái)編程界站穩(wěn)腳跟。
并且,Rust 陸續(xù)提出了“沒(méi)有數(shù)據(jù)爭(zhēng)用的并發(fā)性”、“沒(méi)有垃圾回收的內(nèi)存安全性” 和 “無(wú)懼駭客” 等引人矚目的概念,將無(wú)數(shù)極客大牛吸引聚攏在其項(xiàng)目中,不斷演進(jìn),呈現(xiàn)出越來(lái)越開(kāi)放和健康的社區(qū)生態(tài)。
此外,Rust 還代表了一種新的、開(kāi)源項(xiàng)目的協(xié)作方式:Rust 項(xiàng)目中的決策權(quán)是唯一委派和分配的,核心團(tuán)隊(duì)擁有更多特權(quán)。
最后,需求就在那里,如果說(shuō)以前,領(lǐng)導(dǎo)讓做 Rust 重構(gòu)是為了講故事,自己學(xué) Rust 是為了耍酷,但現(xiàn)如今的 Rust 的應(yīng)用場(chǎng)景愈發(fā)明晰:區(qū)塊鏈開(kāi)發(fā)、嵌入式開(kāi)發(fā)、分布式、云原生、WASL、GUI 等等已經(jīng)到處可以看到它的身影。
之前一種語(yǔ)言單挑多個(gè)領(lǐng)域的夢(mèng)想,Java 嘗試過(guò),但夢(mèng)碎了,Rust 卻成為了新的希望,Shopify 等為代表的公司評(píng)估它與自身的業(yè)務(wù)十分契合,就是一個(gè)例子。
正如一位開(kāi)發(fā)者所評(píng)論的:
Rust 在大型企業(yè)環(huán)境中的一大優(yōu)勢(shì)是它真的非常通用,能夠用一種語(yǔ)言替換多種語(yǔ)言。Rust 真的可以做到 C/C++ 所能做到的一切,Java 所能做的一切,大部分 JavaScript 所能做到(隨著 WASM 情況的改善)。這個(gè)一站式編程語(yǔ)言商店是 Java 的夢(mèng)想,但嵌入式 Java 的失敗和 Java 小程序的失敗扼殺了這個(gè)夢(mèng)想。Rust 有希望復(fù)活它。
4、難學(xué):門檻如何降低
Rust 初學(xué)者經(jīng)常寫到一半,腦海中會(huì)出現(xiàn)一種聲音:何苦為難自己呢?比如下面這位朋友——
本來(lái)想拿 Rust 寫一個(gè)集成業(yè)務(wù)邏輯的 API gateway,結(jié)果被 future 的那些個(gè) error 轉(zhuǎn)來(lái)轉(zhuǎn)去搞得煩不勝煩,想一想發(fā)現(xiàn)這玩意兒又沒(méi)狀態(tài)我折騰它有個(gè)屁用,所以拿 node 隨便搞了搞就上線了。
Rust 學(xué)習(xí)曲線陡峭得厲害是公認(rèn)的。每每一到挫敗之時(shí),Go、C#、Crystal、Dart 就成了它的替代品。許多開(kāi)發(fā)者甚至學(xué)習(xí)了N個(gè)月也搞不明白借用檢查器。
因此,即使 Rust 能產(chǎn)生十分高效的代碼,公司也會(huì)對(duì)他們的開(kāi)發(fā)者使用它的生產(chǎn)力持懷疑態(tài)度。
最大的問(wèn)題是,Rust 是否會(huì)被技術(shù)水平較低的程序員接受,特別是在其復(fù)雜性不斷增加的情況下。Rust 的教學(xué)和培訓(xùn)將是關(guān)鍵。
習(xí)慣是需要培養(yǎng)的,就像垃圾收集、運(yùn)行時(shí)異常、函數(shù)式編程這些陌生的概念一樣,是一個(gè)不斷磨合與適應(yīng)的過(guò)程。
我們可以看到 Rust 方面一直在推廣在學(xué)習(xí)方面不遺余力,從社區(qū)的活躍度,教程的補(bǔ)充等等。此外,Linux 基金會(huì)也在如何用 Rust 編寫內(nèi)核模塊方面發(fā)布了教程。
近期,一位有心之人就利用 OpenAI ChatGPT 學(xué)習(xí) Rust 。有位作者嘗試和它做一些有關(guān) Rust 方面的交流,回答的可以說(shuō)相當(dāng)可以了。比如:
- 編寫一個(gè)讀取文件內(nèi)容的程序并為每一行添加詳細(xì)的注釋
- 給它源碼和編譯器報(bào)的錯(cuò)誤,他給了更清晰的解釋并幫忙修復(fù)了
- 問(wèn)了一個(gè)rust-anlyzer filed to discover workspace 這樣的問(wèn)題,ChatGPT給予了詳細(xì)的解決辦法。后面甚至讓ChatGPT幫忙寫了一個(gè)完整的命令行程序
人之為學(xué)有難易乎?學(xué)之,則難者亦易矣;不學(xué),則易者亦難矣。Rust 虐我千百遍,我待 Rust 如初戀!共勉!?