今天,如果讓您為您的應用程序選擇最合適的編程語言的話,您會選哪個?為什么? 那么,Rust 和 Go 在性能、簡單性、安全性、功能、規(guī)模等方面的比較如何?它們的共同點是什么,它們有什么根本性的不同?本文為您揭曉答案。 爭論編程語言好壞,毫無意義 首先, Go 和 Rust 都是非常優(yōu)秀的編程語言。它們憑借著出色的性能被廣泛采用。你可能常常會看到一些文章對 Go 和 Rust 進行孰優(yōu)孰劣的討論,其實這毫無意義,每一種編程語言都代表了一定的權衡和取舍。不同的編程語言都會對不同內容進行針對性的優(yōu)化,選擇最合適的語言,才能事半功倍。 本文將告訴你什么時候選擇使用 Go 合適,什么時候使用 Rust 會更好,并且會告訴大家兩種編程語言的本質,即 Go 和 Rust 的道。雖然它們在語法和風格上有很大的不同,但 Rust 和 Go 都是構建軟件的一流工具。 Go、Rust:相同之處 Rust 和 Go 共同點很多,因此經常被放在一起討論。那么,這兩種語言的共同目標是什么?
然而
Go 和 Rust 都是現(xiàn)代化的編程語言,它們的首要任務是內存安全。開發(fā)者在對 C 和 C++ 等傳統(tǒng)語言長期使用來看,不安全或不正確地訪問內存是造成錯誤和安全漏洞的最大原因之一。 雖然 Rust 和 Go 在處理內存安全方面的方式不同,但目標一致,他們致力于在內存管理方面超越其它語言,幫助開發(fā)者寫出正常和高性能的應用程序。
基于兩者都是編譯型語言,程序可以直接被翻譯成可執(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)更多的設施。
不管是大型團隊、大型代碼庫還是兩者兼具,Rust 和 Go 的部分優(yōu)勢決定了它們更適合于這些大型編程。例如,多年來,C 語言程序員一直在爭論將括號放在哪里,以及代碼應該用制表符還是空格縮進,而 Rust 和 Go 通過使用標準的格式化工具(Go 為gofmt,Rust 為rustfmt)和規(guī)范化的風格自動重寫代碼,完全解決了這些問題。這并不是說這種特殊的風格本身有多好:而是 Rust 和 Go 的程序員都很欣賞這種標準化的做法。
兩種語言得分很高的另一個領域是構建管道。兩者都有出色的內置高性能標準構建和依賴性管理工具;不再需要與復雜的第三方構建系統(tǒng)搏斗,也不再需要每隔幾年就學習一個新的系統(tǒng)。
Rust 還是 Go? 兩者都是精心設計的優(yōu)秀編程語言。但仍有很多人對 ' Go 與 Rust '大驚小怪,甚至在社交媒體上大打出手,寫長篇博文說只有傻瓜才會使用 Rust,或者 Go 不是真正的編程語言等。 究其緣由或許是這種行為方式會讓他們自我感覺良好,但毫無意義。那些試圖為你決定項目使用哪種語言,或者告訴你應該學習哪種語言來推進你的編程生涯的聲音,都不會影響到一個明智的人做出重要的選擇。
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 代碼往往看起來都一樣。 在我的代碼俱樂部視頻系列中,我從 GitHub 上半隨機地挑選 Go 項目,并與一群 Go 初學者一起探索,看看我們究竟能理解多少代碼。結果往往都比我們預期的要多。 雖然核心語言很小,但 Go 的標準庫卻非常強大。因此,我們不僅僅需要學 Go 語法,也需要學習需要的標準庫的部分。同時,將功能從語言中轉移到標準庫中,能夠讓我們更加專注。 Go 是基于大規(guī)模的軟件開發(fā)而設計的,包括大型代碼庫和大型團隊。因此,為了能夠讓新手開發(fā)者盡快上手,Go 社區(qū)重視簡單、明了、常規(guī)、直接的程序。
Rust 是專門為幫助程序員用最少的代碼做最多的事情而設計的,功能性強。例如,Rust 的匹配功能可以讓你相當簡潔地寫出靈活、富有表現(xiàn)力的邏輯。 關于 Rust ,最開始我們有很多需要學習的地方。但其實在 C++ 或 Java 中也有很多東西要學,而且你不會獲得 Rust 的高級特性,比如內存安全。 因為 Rust 表現(xiàn)力強,功能多,所以有人批評 Rust 是一種復雜的語言。在許多情況下,這正是我們所需要的編程語言。
雖然 Rust 汲取了 Go 的一些特點,Go 也如此(尤其是泛型),但可以說 Rust 的特點更復雜,而 Go 的特點相對簡單。
大多數語言都對并發(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ā)編程是最簡單、最完整的。
相比之下,Rust 中的并發(fā)是一個很新的特性,并且還有待穩(wěn)定中,但是它的發(fā)展非?;钴S,因此請留意這塊。例如,Rust 的 rayon提供了一種非常優(yōu)雅且輕巧的方法,可以將順序計算轉換為并行計算。
雖然在 Rust 中實現(xiàn)并發(fā)程序并非易事,但 Rust 可以確保內存安全,這無疑也是一個優(yōu)勢。比如標準庫的類:在 Go 中,你可以在訪問某些東西之前忘記去獲得一個 Mutex 鎖,但是在 Rust中不行。
基于前文闡述,我們不難看出 Go 和 Rust 都以不同的方式來避免一大類與內存管理相關的常見編程錯誤。但是,Rust 的安全性更強。
其實許多語言都有幫助程序員避免錯誤的設施,但 Rust 在這方面的優(yōu)勢更突出,因此可能不正確的程序甚至不會被編譯。
對于 Rust 新手來說,與'借閱檢查器(borrow checker)打架 '是常見現(xiàn)象,但在大多數情況下,它發(fā)現(xiàn)的問題確實是你的代碼中真正的錯誤(至少是潛在的錯誤)。為了確保正確性與可靠性,它可能會迫使你從根本上重新架構你的程序,以避免遇到這些問題。 語言不會改變編程方式的核心?當你用其他語言工作時,Rust 中關于安全的課程也非常有用。
你發(fā)現(xiàn) Rust 的編程模型的挑戰(zhàn)性可能取決于你以前在其他語言中所擁有的經驗。Python 或 Ruby 程序員可能會發(fā)現(xiàn)它有限制;而其他人可能很高興。
對于大型應用程序和分布式系統(tǒng)來說,執(zhí)行速度不如開發(fā)速度重要:像 Go 這樣刻意追求極簡的語言可以減少初級開發(fā)者的啟動時間,使他們更容易處理大型代碼庫的工作。
當涉及到大型軟件開發(fā)時,清晰勝于靈活。Go 的限制性實際上使它比 Rust 等更復雜、功能更強大的語言更適合企業(yè)和大型組織。 Rust、Golang:不同之處 雖然 Rust 和 Go 都是常用的語言,但它們并不是真正的競爭對手,因為它們針對的是完全不同的使用情況。 Go 的整個編程方法與 Rust 的完全不同,適用性也不同。 基于此,讓我們比較一下 Rust 與 Go 之間的主要區(qū)別。
'要不要進行垃圾回收 '是一個沒有正確答案的問題。垃圾收集,以及一般的自動內存管理,使得開發(fā)可靠、高效的程序更加高效,對一些人來說,必不可少。 但也有人說,垃圾回收及其性能開銷和停頓,使程序在運行時表現(xiàn)得不可預測,并引入了不可接受的延遲。
計算機編程的歷史一直是一個越來越復雜抽象的故事,程序員在解決問題時不用太擔心底層機器的實際工作情況。 因此,程序更容易編寫,更容易移植。但是對于許多程序來說,對硬件的訪問以及對程序執(zhí)行方式的精確控制更為重要。 Rust 的目標是讓程序員 '更接近金屬',有更多的控制權,但 Go 抽象了架構細節(jié),讓程序員更接近問題。
大多數人贊成開發(fā)速度優(yōu)于軟件速度或者性能。但實際上,性能也很重要。Rust 做了一些設計上的權衡,來提升執(zhí)行速度。 相比之下,Go 更關注簡單性,但是 Go 的構建速度是無可匹敵的,特別是大型代碼庫。
另一方面,如果一個程序不需要正常運行的話,它可以任意地快。大多數代碼并不是為長期而寫的,但有些程序的運行時間可以達到幾十年。 在這種情況下,就值得在開發(fā)中多花一點時間,確保程序的正確性、可靠性。 Go 和 Rust 都旨在幫助你編寫正確的程序,盡管方式不同。例如,Go 提供了一個很好的內置測試框架,而 Rust 則專注于使用其借閱檢查器消除運行時的錯誤。
雖然 Go 和 Rust 都是任何嚴肅項目的絕佳選擇,但讓自己盡可能充分地了解每種語言及其特征是個好主意。
歸根結底,合適的語言才是最好的。 合適的語言才是最好的 無論是 Rust 還是 Go,其實都值得我們去認真了解,甚至可以從中獲得一些提升自身或工作的經驗。如果你只能選擇其一,那也要在將 Go 和 Rust 用于各種不同類型的大小程序之后,再做出你的選擇。 想要成為一名成功的軟件工程師,編程語言只是其中一步。設計、工程、架構、溝通和協(xié)作都是必不可少的。只有將這些做到了完美,不論你選擇哪種語言,你都會成為一名優(yōu)秀的軟件工程師。 參考鏈接:https:///golang/tao-of-go |
|
來自: ZhouAndrew > 《AI&NewIT》