午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Rust vs Go,到底該怎么選?

 ZhouAndrew 2023-03-02 發(fā)布于江蘇

圖片

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

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

圖片

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

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

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

圖片

Go、Rust:相同之處

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

Rust 是一種低級靜態(tài)類型的多范式編程語言,專注于安全和性能。

——Gints Dreimanis

然而

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

——Golang.org

  • 內存安全

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

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

  • 快速、緊湊的可執(zhí)行文件

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

  • 通用語言

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

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

  • 實事求是的編程風格

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

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

——Jack Mott

  • 規(guī)?;陌l(fā)展

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

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

——Rob Pike

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

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

——Sam Rose

圖片

Rust 還是 Go?

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

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

  • Go 與 Rust 的性能對比

Go 和 Rust 都能生成非??斓某绦颍驗樗鼈儾恍枰ㄟ^解釋器或虛擬機,直接被編譯成了本地機器代碼。

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

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

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

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

因為 Rust 旨在讓程序員完全控制底層硬件,所以有可能實現(xiàn)將 Rust 程序優(yōu)化到非常接近機器的最大理論性能。因此,Rust 以非凡的執(zhí)行速度勝過所有其他考慮因素的領域,比如游戲編程、操作系統(tǒng)內核、網絡瀏覽器組件和實時控制系統(tǒng)。

  • 簡單性

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

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

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

——一個Rust程序員對Go的早期印象

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

圖片

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

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

Go 是基于大規(guī)模的軟件開發(fā)而設計的,包括大型代碼庫和大型團隊。因此,為了能夠讓新手開發(fā)者盡快上手,Go 社區(qū)重視簡單、明了、常規(guī)、直接的程序。

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

——Matthias Endler

  • 特點

Rust 相比其他幾種編程語言,兼容性更強。因此,你可以用它實現(xiàn)更多。

——Devathon

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

圖片

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

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

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

——Dave Cheney

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

  • 并發(fā)性

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

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

Go 是高規(guī)模并發(fā)應用程序的最佳選擇,可實現(xiàn)在一個程序中運行數百萬個并發(fā)的 goroutine,并且不會產生嚴重的性能問題,如網絡服務器和微服務。

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

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

利用并發(fā)性的優(yōu)勢建立一個很好的應用程序,再部署一組微服務,對于 Go 來說輕而易舉,而對于 Rust 來說并非易事。在某些方面,Rust 對防止與內存有關的安全漏洞的癡迷意味著程序員必須不遺余力地執(zhí)行那些在其他語言(包括 Go)中會更簡單的任務。

——Sonya Koptyev

相比之下,Rust 中的并發(fā)是一個很新的特性,并且還有待穩(wěn)定中,但是它的發(fā)展非?;钴S,因此請留意這塊。例如,Rust 的 rayon提供了一種非常優(yōu)雅且輕巧的方法,可以將順序計算轉換為并行計算。

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

——一個 Rust 程序員對 Go 的早期印象 

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

Go 鼓勵并發(fā)并且在這方面優(yōu)于 Rust,但這并不是說你不能在 Rust 中找到 Go 面向角色的并發(fā)性,這是留給程序員的一個練習。

——Dave Cheney

  • 安全性

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

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

——Why Rust?

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

——Grzegorz Nosek

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

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

——Sam Rose

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

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

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

——Matthias Endler

你發(fā)現(xiàn) Rust 的編程模型的挑戰(zhàn)性可能取決于你以前在其他語言中所擁有的經驗。Python 或 Ruby 程序員可能會發(fā)現(xiàn)它有限制;而其他人可能很高興。

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

——Grzegorz Nosek

  • 規(guī)模

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

——Rob Pike

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

有了 Go,初級開發(fā)者更容易提高工作效率,作為一個中級開發(fā)人員,更難引入一些的脆弱的抽象,這將導致下一步的問題?;诖?,Rust 在企業(yè)軟件開發(fā)方面不如 Go 有說服力。

——Loris Cro

當涉及到大型軟件開發(fā)時,清晰勝于靈活。Go 的限制性實際上使它比 Rust 等更復雜、功能更強大的語言更適合企業(yè)和大型組織。

圖片

Rust、Golang:不同之處

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

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

基于此,讓我們比較一下 Rust 與 Go 之間的主要區(qū)別。

  • 垃圾回收

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

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

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

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

——PingCAP

  • Close to the metal

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

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

Rust 的目標是讓程序員 '更接近金屬',有更多的控制權,但 Go 抽象了架構細節(jié),讓程序員更接近問題。

兩種語言都有不同的范圍。Golang 在編寫微服務和典型的  'DevOps ' 任務方面表現(xiàn)出色,但它不是一種系統(tǒng)編程語言。Rust 對于并發(fā)性、安全性或性能很重要的任務來說更有優(yōu)勢;但它學習曲線更陡峭。

——Matthias Endler

  • Go 發(fā)展的最快

大多數人贊成開發(fā)速度優(yōu)于軟件速度或者性能。但實際上,性能也很重要。Rust 做了一些設計上的權衡,來提升執(zhí)行速度。

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

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

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

——Andrew Lader

  • 正確性

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

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

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

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

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

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

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

——Andrew Lader

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

圖片

合適的語言才是最好的

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

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

參考鏈接:https:///golang/tao-of-go

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多