吵翻了!到底該選 Rust 還是 Go,成 2023 年最大技術(shù)分歧
發(fā)布時間:2023-08-25 09:09:38
2023 年,我們有一千個學(xué)習(xí) Rust 的理由。
8 月 7 日,Rust 基金會發(fā)布了 2022 年度 Rust 調(diào)查報告結(jié)果,報告顯示 Rust 采用率不斷提高,超過 90%的調(diào)查受訪者表示自己是 Rust 用戶;29.7% 的受訪者表示,他們在工作中的大部分編碼工作都使用 Rust,比上一年顯著增加了 51.8%。
毋庸置疑,Rust 以其卓越的內(nèi)存安全性和并發(fā)性能正日益成為開發(fā)者關(guān)注的焦點(diǎn)。然而,同樣令人難以忽視的是 Go,這門曾被評選為年度編程語言的相對比較“老牌”的選手。
Go 語言誕生于 2009 年,一開始就因其獨(dú)特的并發(fā)模型和強(qiáng)大的性能優(yōu)勢而受到了極大關(guān)注。值得注意的是,跟 Rust 語言一樣,Go語言的創(chuàng)建者也同樣“討厭”C++,并且 Go 同樣也都是云原生的主導(dǎo)語言。
而在 Stack Overflow 2022 開發(fā)者調(diào)查中,對于“讓人愛恨交織的編程語言”這個問題,在 7 萬份回復(fù)中,程序員們明顯也更為偏愛 Rust,86%的人表示喜歡 Rust,而 64%的人表示喜歡 Go。面對 Rust 的火爆現(xiàn)狀,一些開發(fā)者發(fā)出了靈魂提問:2023 年,Go 還值得學(xué)習(xí)嗎?
另外,這兩天,到底是該選 Rust 還是選 Go,也成為了 Hacker News 上的一個熱門話題:
一位挺 Rust 的網(wǎng)友說道:“我也為這個選擇煩惱了很久。最終 Rust 勝出了。首先,我感覺 Rust 更接近于以前 Pascal 時代的東西,你可以控制一切;其次,如果 wasm 和相關(guān)技術(shù)大爆發(fā),Rust 將是一個更安全的選擇;然后,我們已經(jīng)有了 Python 用于快速開發(fā),因此選擇一些更極端的東西是有道理的,Go 在某種程度上處于中間地帶。最后,Rust 應(yīng)用于內(nèi)核且備受關(guān)注,所以不太可能會被淘汰?!?/span>
另一位持反對意見的開發(fā)者則表示,“我從事 Go 開發(fā)已經(jīng)快十年了,但最近我也嘗試了下 Rust。我認(rèn)為目前有一些對 Rust 的強(qiáng)制性和誤導(dǎo)性偏好,從我在各種初創(chuàng)公司的經(jīng)驗(yàn),包括我目前所在的公司來看,對于后端開發(fā)來說,Go 是迄今為止最佳選擇!注意,在性能、功能或其他方面……這兩種語言非常非常相似!”
不得不說的是,Go 和 Rust 絕對都是優(yōu)秀的編程語言。它們現(xiàn)代、強(qiáng)大、應(yīng)用廣泛,而且有著卓越的性能表現(xiàn)。但如果直接對比 Go 和 Rust 誰更好之類的,真的沒啥意義,因?yàn)槊糠N編程語言都代表著背后一系列深層次的權(quán)衡。不同的語言會針對不同的需求進(jìn)行優(yōu)化,因此我們在選擇語言時,也應(yīng)該考慮自己想要用它解決什么樣的問題。所以我們將從 Go 和 Rust 語言的適用場景出發(fā),探討下 Go 與 Rust 的設(shè)計之“道”。
雖然 Rust 和 Go 在語法和風(fēng)格上差別很大,但它們都是構(gòu)建軟件的一流工具。下面咱們開始具體分析。
Go 與 Rust:相似性
Rust 和 Go 有很多共同點(diǎn),所以人們才經(jīng)常把二者拿來相提并論。那它們有哪些共同目標(biāo)?
Rust 是一種低級靜態(tài)類型的多范式編程語言,更多關(guān)注安全性和性能。
—Gints Dreimanis
而:
Go 是一種開源編程語言,能夠輕松構(gòu)建起簡單、可靠且高效的軟件。
—golang.org
內(nèi)存安全
Go 和 Rust 都屬于重視內(nèi)存安全的現(xiàn)代編程語言。在 C 和 C++等舊語言發(fā)展的這幾十年間,我們已經(jīng)清楚地意識到,引發(fā)錯誤和 bug 的核心原因之一,就是對內(nèi)存的不安全/不正確訪問。
于是 Rust 和 Go 各自給出了不同的解決思路,但二者的目標(biāo)都是在內(nèi)存管理方面更智能、更安全,幫助開發(fā)者編寫出正確且性能極佳的程序。
快速、緊湊的可執(zhí)行文件
二者都屬于編譯語言,也就是說可以將程序直接翻譯成可執(zhí)行的機(jī)器代碼,這樣就能把程序部署成單一二進(jìn)制文件。跟 Python 和 Ruby 等解釋性語言不同,我們不需要隨程序一同發(fā)布解釋器和大量的庫/依賴項(xiàng)。作為這個核心優(yōu)勢的直接體現(xiàn),Rust 和 Go 程序的運(yùn)行速度往往比解釋性語言更快。
通用型語言
Rust 和 Go 都屬于功能強(qiáng)大且可擴(kuò)展的通用編程語言,大家可以用它們開發(fā)出各種現(xiàn)代軟件——從 Web 應(yīng)用程序到分布式微服務(wù),還包括嵌入式微控制器和移動應(yīng)用等等。
兩者都擁有優(yōu)秀的標(biāo)準(zhǔn)庫和蓬勃發(fā)展的第三方生態(tài)系統(tǒng),外加強(qiáng)大的商業(yè)支持與龐大的用戶基礎(chǔ)。二者已經(jīng)存在多年,并將在未來幾年繼續(xù)保持旺盛的發(fā)展勢頭。如今,學(xué)習(xí) Go 或者 Rust 將是非常合理的時間和精力投入方向。
務(wù)實(shí)的編程風(fēng)格
兩者既不過多偏向函數(shù)式語言(例如 Scala 或 Elixir),也不完全面向?qū)ο螅ɡ?Java 和 C#)。相反,雖然 Go 和 Rust 都具備函數(shù)式及面向?qū)ο缶幊痰墓δ?,但卻始終強(qiáng)調(diào)務(wù)實(shí)取向——即以最合適的方式解決問題,而不是通過“意識形態(tài)”強(qiáng)迫大家用特定的方法做事。
但如果您確實(shí)喜歡函數(shù)式編程風(fēng)格,那 Rust 這邊的相關(guān)工具選項(xiàng)更多,這也是 Rust 優(yōu)于 Go 的一點(diǎn)。
我們當(dāng)然可以爭論什么才是真正“面向?qū)ο蟆钡恼Z言。但公平地講,C++、Java 或者 C#用戶所期望的那種面向?qū)ο缶幊田L(fēng)格,在 Go 或者 Rust 中確實(shí)不存在。
—Jack Mott
大規(guī)模開發(fā)
Rust 和 Go 都為大規(guī)模編程提供不少有用功能,所以它們都能適應(yīng)大開發(fā)團(tuán)隊作戰(zhàn)和大體量代碼庫的現(xiàn)實(shí)需求。
例如,C 程序員多年來一直在爭論應(yīng)該把括號放在哪里,還有代碼要不要用制表符或空格進(jìn)行縮進(jìn);但 Rust 和 Go 早已使用標(biāo)準(zhǔn)格式化工具(Go 有 gofmt,Rust 則是 rustfmt)徹底解決了這些問題。它們會使用符合規(guī)范的風(fēng)格自動重寫你的代碼。
并不是說這種特定的格式有多精妙,而是 Rust 和 Go 程序員更加務(wù)實(shí)、寧愿選擇統(tǒng)一的執(zhí)行標(biāo)準(zhǔn)。
gofmt 的風(fēng)格也許不是每個人的最愛,但 gofmt 卻能幫到每一個人。
—Rob Pike
這兩種語言的另一大優(yōu)勢,體現(xiàn)在構(gòu)建管線上。二者都有優(yōu)秀、內(nèi)置且性能出色的標(biāo)準(zhǔn)構(gòu)建與依賴項(xiàng)管理工具。就是說程序員不必跟復(fù)雜的第三方構(gòu)建系統(tǒng)對抗,也用不著每隔幾年就學(xué)習(xí)一種新系統(tǒng)。
我在職業(yè)生涯早期用的是 Java 和 Ruby,所以編寫 Go 和 Rust 代碼一直讓我有點(diǎn)畏懼、覺得自己掌握不了。但等到進(jìn)入谷歌并看到用 Go 編寫的服務(wù)時,我才真正松了口氣,因?yàn)槲野l(fā)現(xiàn)它很容易構(gòu)建和運(yùn)行。
Rust 也是如此。雖然我只在小規(guī)模項(xiàng)目上進(jìn)行過研究,但也看得出它的易用性。我希望那些能夠無限配置的構(gòu)建系統(tǒng)早點(diǎn)成為歷史,現(xiàn)在的新語言都附帶自己的專用構(gòu)建工具而且能夠開箱即用,這樣不好嗎?
—Sam Rose
到底選 Rust 還是 Go?