Rust vs Go,到底該怎麼選?

csdn 發佈 2024-04-29T19:36:02.605489+00:00

擁有 40 多年編程經驗的知名 Go 開發者與作家 John Arundel 在其個人博客分享了《Rust vs Go in 2023》一文,該文章非常中肯地指出了這兩門語言的優缺點,以及適用場景,對於那些不知道如何選擇程式語言的開發者來說,絕對是一篇非常不錯的參考文章。

【CSDN 編者按】

擁有 40 多年編程經驗的知名 Go 開發者與作家 John Arundel 在其個人博客分享了《Rust vs Go in 2023》一文,該文章非常中肯地指出了這兩門語言的優缺點,以及適用場景,對於那些不知道如何選擇程式語言的開發者來說,絕對是一篇非常不錯的參考文章。

原文地址:https://bitfieldconsulting.com/golang/rust-vs-go

未經授權,禁止轉載!

作者 | John Arundel 編譯 | 王子彧

出品 | CSDN(ID:CSDNnews)

今天,如果讓您為您的應用程式選擇最合適的程式語言的話,您會選哪個?為什麼?

那麼,Rust 和 Go 在性能、簡單性、安全性、功能、規模等方面的比較如何?它們的共同點是什麼,它們有什麼根本性的不同?本文為您揭曉答案。

爭論程式語言好壞,毫無意義

首先, Go 和 Rust 都是非常優秀的程式語言。它們憑藉著出色的性能被廣泛採用。你可能常常會看到一些文章對 Go 和 Rust 進行孰優孰劣的討論,其實這毫無意義,每一種程式語言都代表了一定的權衡和取捨。不同的程式語言都會對不同內容進行針對性的優化,選擇最合適的語言,才能事半功倍。

本文將告訴你什麼時候選擇使用 Go 合適,什麼時候使用 Rust 會更好,並且會告訴大家兩種程式語言的本質,即 Go 和 Rust 的道。雖然它們在語法和風格上有很大的不同,但 Rust 和 Go 都是構建軟體的一流工具。

Go、Rust:相同之處

Rust 和 Go 共同點很多,因此經常被放在一起討論。那麼,這兩種語言的共同目標是什麼?

Rust 是一種低級靜態類型的多範式程式語言,專注於安全和性能。

——Gints Dreimanis

然而

Go 是一種開源的程式語言,可以輕鬆地構建簡單、可靠和高效的軟體。

——Golang.org

  • 內存安全

Go 和 Rust 都是現代化的程式語言,它們的首要任務是內存安全。開發者在對 C 和 C++ 等傳統語言長期使用來看,不安全或不正確地訪問內存是造成錯誤和安全漏洞的最大原因之一。

雖然 Rust 和 Go 在處理內存安全方面的方式不同,但目標一致,他們致力於在內存管理方面超越其它語言,幫助開發者寫出正常和高性能的應用程式。

  • 快速、緊湊的可執行文件

基於兩者都是編譯型語言,程序可以直接被翻譯成可執行的機器代碼,並且作為一個單一的二進位文件來部署;與 Python 和 Ruby 此類解釋型語言不同,我們不需要將解釋器、大量的庫以及依賴關係和程序一起分發,這是一個它們較為突出的優勢。因此,相比於解釋型語言,使用 Rust 和 Go 編寫的程序更快。

  • 通用語言

Rust 和 Go 都是可擴展性強的通用程式語言。它們可以開發各種現代軟體,不管是從網絡應用到分布式微服務,還是從嵌入式微控制器到移動應用程式,都可以實現。

它們都擁有優秀的標準庫和高效的第三方生態系統、巨大的商業支持和龐大的用戶基礎。Rust 和 Go 歷史悠久,並且未來幾年內仍會繼續被廣泛使用。因此,學習 Go 或 Rust,不失為一種對時間和精力的合理投資。

  • 實事求是的編程風格

這兩種語言都不是主要的函數式語言(Scala 或 Elixir),也不是完全面向對象的語言(Java 和C#)。相反,雖然 Go 和 Rust 都有與函數式和面向對象編程相關的特性,但它們都是務實的程式語言,旨在以最合適的方式解決問題,而不是強迫採用特定的方法。一般來說,如果你喜歡函數式編程風格,你會在 Rust 中發現更多的設施。

我們可以爭論什麼是 "面向對象 "語言,但實際上,C++、 Java 或 C# 用戶所期望的面向對象的編程風格在 Go 和 Rust 中都不存在。

——Jack Mott

  • 規模化的發展

不管是大型團隊、大型代碼庫還是兩者兼具,Rust 和 Go 的部分優勢決定了它們更適合於這些大型編程。例如,多年來,C 語言程式設計師一直在爭論將括號放在哪裡,以及代碼應該用制表符還是空格縮進,而 Rust 和 Go 通過使用標準的格式化工具(Go 為gofmt,Rust 為rustfmt)和規範化的風格自動重寫代碼,完全解決了這些問題。這並不是說這種特殊的風格本身有多好:而是 Rust 和 Go 的程式設計師都很欣賞這種標準化的做法。

gofmt 的風格沒有人喜歡,但 gofmt 是所有人的最愛。

——Rob Pike

兩種語言得分很高的另一個領域是構建管道。兩者都有出色的內置高性能標準構建和依賴性管理工具;不再需要與複雜的第三方構建系統搏鬥,也不再需要每隔幾年就學習一個新的系統。

在我的職業生涯早期,以 Java 和 Ruby 為背景的 Go 和 Rust 代碼構建讓我承受。當我在谷歌遇到用 Go 編寫的服務時,卻覺得很欣慰,因為我知道它很容易建立和運行。Rust 也是如此,儘管我只在較小的規模上工作過。我希望可無限配置的構建系統的時代已經過去了,所有語言都會有自己專門的構建工具,開箱即可使用。

——Sam Rose

Rust 還是 Go?

兩者都是精心設計的優秀程式語言。但仍有很多人對 " Go 與 Rust "大驚小怪,甚至在社交媒體上大打出手,寫長篇博文說只有傻瓜才會使用 Rust,或者 Go 不是真正的程式語言等。

究其緣由或許是這種行為方式會讓他們自我感覺良好,但毫無意義。那些試圖為你決定項目使用哪種語言,或者告訴你應該學習哪種語言來推進你的編程生涯的聲音,都不會影響到一個明智的人做出重要的選擇。

  • Go 與 Rust 的性能對比

Go 和 Rust 都能生成非常快的程序,因為它們不需要通過解釋器或虛擬機,直接被編譯成了本地機器代碼。

然而,Rust 的性能特別出色。它可以與 C 和 C++ 相媲美,這兩種語言通常被認為是性能最高的編譯語言。但與這些傳統語言不同的是,Rust 不僅提供了內存安全和並發安全,而且 Rust 還能夠創建複雜的抽象。更為重要的是,Rust 使用的都是零成本抽象。

相比之下, Go 的程序性能也非常不錯,它主要是為開發速度(包括編譯)而設計的,而不是執行速度。Go 程式設計師傾向於重視清晰的代碼而不是快速的代碼。

Go 編譯器也不會花很多時間去嘗試生成最有效的機器代碼;它更關心的是快速編譯大量代碼。所以在運行時基準測試中, Rust 通常更勝一籌。

Rust 運行時性能始終如一且可預測的,因為它不用垃圾回收。而 Go 的垃圾收集器非常高效,並且經過優化,使其 STW 的時間儘可能短(每個新的 Go 版本都在縮短)。但是垃圾收集器不可避免地在程序的行為方式中引入了一些不可預測的因素,這在某些應用中可能是一個嚴重的問題,例如嵌入式系統。

因為 Rust 旨在讓程式設計師完全控制底層硬體,所以有可能實現將 Rust 程序優化到非常接近機器的最大理論性能。因此,Rust 以非凡的執行速度勝過所有其他考慮因素的領域,比如遊戲編程、作業系統內核、網絡瀏覽器組件和實時控制系統。

  • 簡單性

如果沒有人能弄清楚如何使用程式語言,那麼速度再快也毫無用處。Go 語言是為了應對 C++ 等語言不斷增長的複雜性而特意設計的,它的語法、關鍵字、功能都非常少。

學習 Go 語言不需要用很長時間,就可以用它寫出可用的程序。

Go 非常容易學習。我知道這是一個經常被吹捧的優點,但我真的很驚訝於自己能夠如此迅速地提高工作效率。多虧了這個語言、文檔和工具,我只用了兩天就寫出了有趣的、可用的代碼。

——一個Rust程式設計師對Go的早期印象

這裡的關鍵詞是簡單。當然,簡單並不等同於容易,只是小而簡單的語言比大而複雜的語言更容易學習。做事的方式並沒有太多不同方式,所以所有寫得好的 Go 代碼往往看起來都一樣。

在我的代碼俱樂部視頻系列中,我從 GitHub 上半隨機地挑選 Go 項目,並與一群 Go 初學者一起探索,看看我們究竟能理解多少代碼。結果往往都比我們預期的要多。

雖然核心語言很小,但 Go 的標準庫卻非常強大。因此,我們不僅僅需要學 Go 語法,也需要學習需要的標準庫的部分。同時,將功能從語言中轉移到標準庫中,能夠讓我們更加專注。

Go 是基於大規模的軟體開發而設計的,包括大型代碼庫和大型團隊。因此,為了能夠讓新手開發者儘快上手,Go 社區重視簡單、明了、常規、直接的程序。

使用 Go,你可以快速完成工作。Go 是我所使用過的最有成效的語言之一。它的口號是:今天解決實際問題。

——Matthias Endler

  • 特點

Rust 相比其他幾種程式語言,兼容性更強。因此,你可以用它實現更多。

——Devathon

Rust 是專門為幫助程式設計師用最少的代碼做最多的事情而設計的,功能性強。例如,Rust 的匹配功能可以讓你相當簡潔地寫出靈活、富有表現力的邏輯。

關於 Rust ,最開始我們有很多需要學習的地方。但其實在 C++ 或 Java 中也有很多東西要學,而且你不會獲得 Rust 的高級特性,比如內存安全。

因為 Rust 表現力強,功能多,所以有人批評 Rust 是一種複雜的語言。在許多情況下,這正是我們所需要的程式語言。

Rust 為程式設計師準備了更複雜的語法和語義(以及可能更高的可讀性成本),以換取最大可能的性能,因此會與 C++ 和 D 爭取思想共享。

——Dave Cheney

雖然 Rust 汲取了 Go 的一些特點,Go 也如此(尤其是泛型),但可以說 Rust 的特點更複雜,而 Go 的特點相對簡單。

  • 並發性

大多數語言都對並發編程提供某種形式的支持(一次執行多項操作),但是 Go 是專為這項工作而設計的。Go 不使用作業系統線程,而是提供了一個輕量級的替代方案:goroutine。

每個 goroutine 是一個獨立執行的 Go 函數,Go 調度器會將其映射到其控制下的一個 OS 線程之一。因此,調度程序只需使用有限的 OS 線程,即可非常有效地管理大量並發的 goroutine。

Go 是高規模並發應用程式的最佳選擇,可實現在一個程序中運行數百萬個並發的 goroutine,並且不會產生嚴重的性能問題,如網絡伺服器和微服務。

Go 的快速、安全和高效,可以讓 goroutines 更好地通信和共享數據。同時,Go 的並發支持設計體驗也很不錯。

一般來說,對並發程序進行推理是很難的。在任何語言中建立可靠、正確的並發程序無疑是一個挑戰。但是 Go 一開始就內置於語言中,因此它的並發編程是最簡單、最完整的。

利用並發性的優勢建立一個很好的應用程式,再部署一組微服務,對於 Go 來說輕而易舉,而對於 Rust 來說並非易事。在某些方面,Rust 對防止與內存有關的安全漏洞的痴迷意味著程式設計師必須不遺餘力地執行那些在其他語言(包括 Go)中會更簡單的任務。

——Sonya Koptyev

相比之下,Rust 中的並發是一個很新的特性,並且還有待穩定中,但是它的發展非常活躍,因此請留意這塊。例如,Rust 的 rayon提供了一種非常優雅且輕巧的方法,可以將順序計算轉換為並行計算。

輕量級的 Goroutine 和 Channel 語法確實很棒,彰顯了語法的威力,即如此小的細節使並發編程比其他語言感覺更好。

——一個 Rust 程式設計師對 Go 的早期印象

雖然在 Rust 中實現並發程序並非易事,但 Rust 可以確保內存安全,這無疑也是一個優勢。比如標準庫的類:在 Go 中,你可以在訪問某些東西之前忘記去獲得一個 Mutex 鎖,但是在 Rust中不行。

Go 鼓勵並發並且在這方面優於 Rust,但這並不是說你不能在 Rust 中找到 Go 面向角色的並發性,這是留給程式設計師的一個練習。

——Dave Cheney

  • 安全性

基於前文闡述,我們不難看出 Go 和 Rust 都以不同的方式來避免一大類與內存管理相關的常見編程錯誤。但是,Rust 的安全性更強。

Rust 的編譯器非常嚴格且學究(pedantic),對於使用的每一個變量和引用的每一個內存地址都會檢查。它避免了一些未知風險。因此,並發和內存安全問題在 Rust 中是不可能的出現的。

——Why Rust?

對我來說,Rust 的關鍵優勢是編譯器支持,它不會讓可能檢測到的任何錯誤通過(說真的,這種感覺就像魔法一樣)。

——Grzegorz Nosek

其實許多語言都有幫助程式設計師避免錯誤的設施,但 Rust 在這方面的優勢更突出,因此可能不正確的程序甚至不會被編譯。

有了 Rust,庫程式設計師可以使用很多工具來防止用戶犯錯。Rust 讓我們可以自信的說,我們擁有一塊特定的數據,而其他東西沒有。有這麼多的工具來防止意外的誤用。這是一種很棒的感覺。

——Sam Rose

對於 Rust 新手來說,與"借閱檢查器(borrow checker)打架 "是常見現象,但在大多數情況下,它發現的問題確實是你的代碼中真正的錯誤(至少是潛在的錯誤)。為了確保正確性與可靠性,它可能會迫使你從根本上重新架構你的程序,以避免遇到這些問題。

語言不會改變編程方式的核心?當你用其他語言工作時,Rust 中關於安全的課程也非常有用。

如果選擇 Rust,通常是基於它能提供的保證:防止空指針和數據競爭安全性,可預測的運行時行為,以及對硬體的完全控制。如果你不需要這些功能,Rust 可能是不是你下一個項目的最佳選擇。這是因為這些保證是有代價的:提升的時間。你需要改掉壞習慣,學習新概念。剛開始,你會經常和借閱檢查器(borrow checker)進行很多鬥爭。

——Matthias Endler

你發現 Rust 的編程模型的挑戰性可能取決於你以前在其他語言中所擁有的經驗。Python 或 Ruby 程式設計師可能會發現它有限制;而其他人可能很高興。

如果你是一個 C 或 C++ 程式設計師,在這些語言中花了幾周的時間來尋找內存安全漏洞,你會非常欣賞 Rust。"與借閱檢查器鬥爭 "變成了 "編譯器可以檢測到這個嗎?"

——Grzegorz Nosek

  • 規模

當下的伺服器程序由數千萬行代碼組成、數百甚至數千名程式設計師進行處理,而且每天都在更新。而 Go 語言就是為了在這種環境下工作而生的。隨著系統的發展,Go 的設計考慮因素包括嚴格的依賴關係管理,隨著系統增長的軟體體系結構的適應性以及跨組件邊界的魯棒性

——Rob Pike

對於大型應用程式和分布式系統來說,執行速度不如開發速度重要:像 Go 這樣刻意追求極簡的語言可以減少初級開發者的啟動時間,使他們更容易處理大型代碼庫的工作。

有了 Go,初級開發者更容易提高工作效率,作為一個中級開發人員,更難引入一些的脆弱的抽象,這將導致下一步的問題。基於此,Rust 在企業軟體開發方面不如 Go 有說服力。

——Loris Cro

當涉及到大型軟體開發時,清晰勝於靈活。Go 的限制性實際上使它比 Rust 等更複雜、功能更強大的語言更適合企業和大型組織。

Rust、Golang:不同之處

雖然 Rust 和 Go 都是常用的語言,但它們並不是真正的競爭對手,因為它們針對的是完全不同的使用情況。

Go 的整個編程方法與 Rust 的完全不同,適用性也不同。

基於此,讓我們比較一下 Rust 與 Go 之間的主要區別。

  • 垃圾回收

"要不要進行垃圾回收 "是一個沒有正確答案的問題。垃圾收集,以及一般的自動內存管理,使得開發可靠、高效的程序更加高效,對一些人來說,必不可少。

但也有人說,垃圾回收及其性能開銷和停頓,使程序在運行時表現得不可預測,並引入了不可接受的延遲。

Go 與 Rust 完全不同。雖然兩者都可以被模糊地描述為系統語言或 C 語言的替代品,但它們有不同的目標和應用,語言設計的風格,以及優先級。垃圾收集就是一個最明顯的不同。在 Go 中使用 GC 使語言更簡單、易推理。

在 Rust 中不實用 GC 會使程序更快(尤其是當你需要保證延遲,而不僅僅是高吞吐量的時候),並且可以啟用 Go 中不可能實現的功能和編程模式(或者至少是在不犧牲性能的情況下)。

——PingCAP

  • Close to the metal

計算機編程的歷史一直是一個越來越複雜抽象的故事,程式設計師在解決問題時不用太擔心底層機器的實際工作情況。

因此,程序更容易編寫,更容易移植。但是對於許多程序來說,對硬體的訪問以及對程序執行方式的精確控制更為重要。

Rust 的目標是讓程式設計師 "更接近金屬",有更多的控制權,但 Go 抽象了架構細節,讓程式設計師更接近問題。

兩種語言都有不同的範圍。Golang 在編寫微服務和典型的 "DevOps " 任務方面表現出色,但它不是一種系統程式語言。Rust 對於並發性、安全性或性能很重要的任務來說更有優勢;但它學習曲線更陡峭。

——Matthias Endler

  • Go 發展的最快

大多數人贊成開發速度優於軟體速度或者性能。但實際上,性能也很重要。Rust 做了一些設計上的權衡,來提升執行速度。

相比之下,Go 更關注簡單性,但是 Go 的構建速度是無可匹敵的,特別是大型代碼庫。

Rust 比 Go 快。在基準測試中,Rust 更快,在某些情況下,還能快到一個數量級。但在你選擇用 Rust 寫程序之前,你會發現 Go 在許多基準測試中並不落後於它,甚至比 Java、C#、JavaScript、Python 等快得多。

如果你需要的是一流的性能,那麼選擇這兩種語言中的任何一種。如果你正在構建一個處理高負載的網絡服務,你希望能夠在縱向和橫向上進行擴展,那麼這兩種語言都會非常適合你。

——Andrew Lader

  • 正確性

另一方面,如果一個程序不需要正常運行的話,它可以任意地快。大多數代碼並不是為長期而寫的,但有些程序的運行時間可以達到幾十年。

在這種情況下,就值得在開發中多花一點時間,確保程序的正確性、可靠性。

Go 和 Rust 都旨在幫助你編寫正確的程序,儘管方式不同。例如,Go 提供了一個很好的內置測試框架,而 Rust 則專注於使用其借閱檢查器消除運行時的錯誤。

我的看法:明天將要發布的代碼選擇 Go,在未來五年內保持不變的代碼選擇 Rust。—Grzegorz Nosek

雖然 Go 和 Rust 都是任何嚴肅項目的絕佳選擇,但讓自己儘可能充分地了解每種語言及其特徵是個好主意。

如果你想加快開發速度編寫許多不同的服務,或者你擁有龐大的開發團隊,那麼 Go 是你的該選擇的語言。Go 提供了一流的並發性,並且還保證內存安全,不強迫你管理每一個最後的細節。

Go 是一種高效的語言,避免讓開發者陷入困境,專注於簡單性和統一性。如果在另一方面,如果需要擰緊性能,那麼 Rust 應該是你的選擇。

——Andrew Lader

歸根結底,合適的語言才是最好的。

合適的語言才是最好的

無論是 Rust 還是 Go,其實都值得我們去認真了解,甚至可以從中獲得一些提升自身或工作的經驗。如果你只能選擇其一,那也要在將 Go 和 Rust 用於各種不同類型的大小程序之後,再做出你的選擇。

想要成為一名成功的軟體工程師,程式語言只是其中一步。設計、工程、架構、溝通和協作都是必不可少的。只有將這些做到了完美,不論你選擇哪種語言,你都會成為一名優秀的軟體工程師。

參考連結:https://bitfieldconsulting.com/golang/tao-of-go

☞科大訊飛回應薪酬回溯制度;OpenAI 宣布開放 API,可將 ChatGPT 集成到自己的產品;Godot 4.0 發布|極客頭條

☞TeaTalk·Online演講實錄|讀懂量子世界的應用與未來
☞ChatGPT API 低價上線,網友:用上 import openai,能開一家創業公司!
關鍵字: