為服務(wù)端編程選擇一種語(yǔ)言應(yīng)該基于你的長(zhǎng)期目標(biāo)和項(xiàng)目的要求,因此,盲目地問(wèn)我應(yīng)該雇用 Go 開發(fā)人員還是應(yīng)該選擇 Rust 進(jìn)行開發(fā)并不能幫助你解決問(wèn)題。
然而,如果你發(fā)現(xiàn)自己陷入了困境,那么這篇文章將為你解惑。下面讓我們開始吧。
Go 是一種靜態(tài)類型的、AOT 編譯的語(yǔ)言,而 Rust 是一種靜態(tài)、強(qiáng)類型與 AOT 編譯的語(yǔ)言,也是一種多范式、高級(jí)和通用的語(yǔ)言。
讓我們從多方位來(lái)評(píng)估這兩種語(yǔ)言。
1. Go 與 Rust 的簡(jiǎn)單性比較
簡(jiǎn)單性是 Go 的主要賣點(diǎn)之一。開發(fā)者只需要幾天甚至幾個(gè)小時(shí)就能上手 golang,而 Rust 則可能需要數(shù)周,這會(huì)對(duì)團(tuán)隊(duì)合作產(chǎn)生很大的影響。
Go 程序容易解讀、編寫,便于在大型團(tuán)隊(duì)中進(jìn)行管理。而 Rust 是一門非常復(fù)雜的語(yǔ)言,需要學(xué)習(xí)成本,要想熟練運(yùn)用,則需要花費(fèi)更多的時(shí)間。
此外,各種有用的功能已被納入 1.18 版本中,如 Golang 中一度缺失的泛型。
2. Go 與 Rust 的性能比較
說(shuō)到性能,Golang 和 Rust 都是非常受歡迎的。它們有很好的內(nèi)部高性能工具來(lái)管理依賴關(guān)系與編譯。由于其對(duì)線程運(yùn)行方式和線程間資源共享方式的完美控制,Rust 幾乎總是能在運(yùn)行時(shí)基準(zhǔn)測(cè)試中擊敗 Go。
兩種語(yǔ)言 – Rust 和 Go – 使用了類似的格式化工具。Rust 有 rustfmt,Go 有 gofmt,它們會(huì)自動(dòng)按照規(guī)范的風(fēng)格重新格式化你的代碼。
Go 對(duì)架構(gòu)的細(xì)節(jié)進(jìn)行了抽象,以幫助程序員集中精力解決手頭的問(wèn)題,這與我們?cè)?Rust 中了解到的情況完全相反。
雖然 Go 與 Rust 相比運(yùn)行速度較為遜色,但它的開發(fā)和編譯速度更快。這是因?yàn)?Rust 編譯器進(jìn)行了大量的優(yōu)化和檢查,這也使得 Rust 不適合于大型項(xiàng)目。
然而,在部署時(shí),它們都是一樣的。它們產(chǎn)生靜態(tài)的二進(jìn)制文件作為輸出。你并不需要一個(gè)解釋器來(lái)運(yùn)行它。
同時(shí),如果你被微服務(wù)開發(fā)或用 Golang 構(gòu)建服務(wù)端程序所困擾,你應(yīng)該從 Golang.Company?雇傭 Go 開發(fā)者[1],他們會(huì)協(xié)助你完成各個(gè)環(huán)節(jié),并為你建立一個(gè)可擴(kuò)展的、強(qiáng)大的應(yīng)用程序。
下圖描述了 Rust 和 Go 之間的基準(zhǔn)測(cè)試狀況。
3. Go 與 Rust 的并發(fā)比較
Go 對(duì)并發(fā)性有很好的支持,大多數(shù)開發(fā)者認(rèn)可 goroutines 和 channel 是 Golang 最好的功能。然而,這些特性在 Rust 中也有,可以通過(guò)標(biāo)準(zhǔn)庫(kù)或第三方庫(kù)(如 Tokio)使用。
Rust 的并發(fā)模型被視為“正確的”,這意味著編譯器在編譯時(shí),在程序執(zhí)行之前,就能夠捕捉到一類線程安全的錯(cuò)誤。這使得開發(fā)者可以避免一些錯(cuò)誤,比如在沒(méi)有任何同步的情況下將其寫入同一個(gè)共享變量中。
Goroutines 可以理解為輕量級(jí)的線程,是運(yùn)行時(shí)管理的 Go 對(duì)象,并在操作系統(tǒng)線程之間進(jìn)行調(diào)度。goroutines 非常容易創(chuàng)建,而且消耗很低,堆棧的大小可以隨時(shí)間調(diào)整。因?yàn)椴僮飨到y(tǒng)線程的成本遠(yuǎn)高于 goroutines,開發(fā)者可以建立成千上萬(wàn)的 goroutines 來(lái)代替。
Go 的這種解決方案的缺點(diǎn)是增加了 CPU 和內(nèi)存開銷。然而,Rust 對(duì)這個(gè)問(wèn)題有一個(gè)解決方案,它努力將即使是微小的開銷也降到最低。
4. Go 與 Rust 的錯(cuò)誤處理比較
這兩種編程語(yǔ)言在處理錯(cuò)誤方面使用類似的方式。在 Golang 中,除了錯(cuò)誤之外,函數(shù)還將返回幾個(gè)值。Rust 使用專用的枚舉類型來(lái)處理錯(cuò)誤, 它有兩個(gè)子類型, Result 類型和 Err 類型。
錯(cuò)誤處理可以通過(guò)用問(wèn)號(hào)(?)來(lái)解開,使其不像 Golang 那樣冗長(zhǎng)。對(duì)于這兩種語(yǔ)言來(lái)說(shuō),處理方式都很詳細(xì)和清晰。
這些方法可以幫助開發(fā)者定位沒(méi)有得到正確處理的方法,這也使得 Rust 和 Go 中的代碼編寫更容易、更安全。
如果你想知道語(yǔ)言流行度趨勢(shì),可以看如下圖表。
5. 內(nèi)存安全和安全性
Rust 創(chuàng)新性地在編譯時(shí)使用所有權(quán)機(jī)制來(lái)確保內(nèi)存安全, 所以開發(fā)者必須做一些列措施以確保代碼的安全。編譯器是非?!皣?yán)格”的,因?yàn)樗粫?huì)讓任何不安全的內(nèi)存代碼通過(guò)。Rust 還提出了多種并發(fā)模型,以確保在內(nèi)存安全方面沒(méi)有漏洞。
而 Go 并不是內(nèi)存安全的,在 Go 中,非原子性的多字結(jié)構(gòu)實(shí)現(xiàn)了接口和分片。此外,數(shù)據(jù)競(jìng)爭(zhēng)會(huì)導(dǎo)致無(wú)效值,有時(shí)甚至?xí)?dǎo)致內(nèi)存損壞。
然而,Go 和 Rust 都可以被認(rèn)為在處理 use-after-free 和懸空指針?lè)矫媸前踩?。Go 使用自動(dòng)垃圾收集器來(lái)限制與內(nèi)存泄漏有關(guān)的問(wèn)題。另一方面,所有權(quán)和借用功能是 Rust 的一大特色。根據(jù)這個(gè)原則,每個(gè)項(xiàng)目都有一個(gè)所有者,該所有者可以借出或?qū)⑵滢D(zhuǎn)交給其他人。
Rust 還允許我們建立許多不可變的引用或有且只有一個(gè)的可變引用。通過(guò)這種方法,Rust 無(wú)需垃圾收集器就能解決內(nèi)存問(wèn)題,在性能上優(yōu)于 Golang。
然而,有一點(diǎn)是你必須記住的。即使 Rust 編譯器在捕捉內(nèi)存錯(cuò)誤方面非常高效,并幫助你寫出了性能非常好的代碼,它也是有代價(jià)的。這就是彼得-帕克原則,這意味著你在使用 Rust 時(shí)必須非常小心。
下面是一張描述 Go 和 Rust(以及 Java)之間內(nèi)存使用情況的圖表。
6. 社區(qū)
Golang 是在 2009 年出現(xiàn)的,而 Rust 是在 2013 年開始的,再加上 Golang 的簡(jiǎn)單性,它因此成為了最受開發(fā)者歡迎的語(yǔ)言之一。
此外,Go 中的庫(kù)和框架比 Rust 更成熟,尤其是與網(wǎng)絡(luò)開發(fā)有關(guān)的庫(kù)和框架。
然而,Rust 的開發(fā)者非常善于溝通,而且作為一種像 Go 一樣的開源語(yǔ)言,會(huì)有進(jìn)一步的發(fā)展。
7. 職業(yè)前景
最后,職業(yè)前景是你必須考慮的一個(gè)方面。如果你的目標(biāo)是被雇用,你應(yīng)該看一下?lián)碛凶疃喙ぷ鳈C(jī)會(huì)的市場(chǎng)。你可以看到幾乎沒(méi)有 Rust 相關(guān)的工作,卻有很多 Golang 的。
使用 Golang 的公司有谷歌、Uber、Twitch、Dailymotion、SendGrid、Dropbox、Soundcloud 等,而使用 Rust 的公司有則有 Brave(Github)、Atlassian、Amazon、Discord 等。
Rust 開發(fā)者的平均年薪約為 12 萬(wàn)美金。然而,Golang 開發(fā)者的平均年薪約為 13.5 萬(wàn)美元。
如果你的項(xiàng)目涉及到 Web 開發(fā)及可分發(fā)的服務(wù)器,那么建議你選擇 Go。編程部分非常簡(jiǎn)單,而且并發(fā)模型會(huì)對(duì)你有很大的幫助。但是如果你要開發(fā)一個(gè) CLI 應(yīng)用程序,那么你應(yīng)該選擇 Rust,因?yàn)樗俗址幚硐嚓P(guān)庫(kù)。雖然如此,Rust 并不是一門那么容易掌握的語(yǔ)言。
相關(guān)鏈接:
[1] https://golang.company/go-developers
原文地址:
https://medium.com/@golang_company/golang-vs-rust-which-language-to-be-choose-for-server-side-programming-628cd81c1184
原文作者:
Golang Company
本文永久鏈接:
https://github.com/gocn/translator/blob/master/2023/w01_golang_vs_rust.md
譯者:pseudoyu
校對(duì):小超人
往期推薦
「每周譯Go」了解?Go 中的 defer
沒(méi)錯(cuò),這是2023年開篇!
「每周譯Go」如何在Go中定義并調(diào)用函數(shù)
想要了解Go更多內(nèi)容,歡迎掃描下方??關(guān)注公眾號(hào),回復(fù)關(guān)鍵詞 [實(shí)戰(zhàn)群]??,就有機(jī)會(huì)進(jìn)群和我們進(jìn)行交流文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-431053.html
分享、在看與點(diǎn)贊Go?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-431053.html
到了這里,關(guān)于Golang vs Rust ——服務(wù)端編程應(yīng)該選擇哪種語(yǔ)言的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!