我可以說(shuō)些什么而不讓大家生氣嗎?
Rust和Go哪個(gè)更好?你應(yīng)該為下一個(gè)項(xiàng)目選擇哪種語(yǔ)言,為什么??jī)烧咴谛阅堋⒑?jiǎn)單性、安全性、功能特性、規(guī)模化(scale)和并發(fā)性等方面如何比較?它們有什么共同點(diǎn),又有什么根本區(qū)別?讓我們通過(guò)Rust和Go的友好且公平的比較來(lái)找到答案。
首先,非常重要的是,Go和Rust都是絕對(duì)優(yōu)秀的編程語(yǔ)言。它們現(xiàn)代、強(qiáng)大、被廣泛采用,并提供卓越的性能。
Rust是一種低級(jí)靜態(tài)類(lèi)型多范式編程語(yǔ)言,專(zhuān)注于安全性和性能 -- Gints Dreimanis[2]
然而:
Go是一種開(kāi)源編程語(yǔ)言,可以輕松構(gòu)建簡(jiǎn)單、可靠且高效的軟件 -- golang.org[3]
在本文中,我將嘗試簡(jiǎn)要概述我認(rèn)為的哪種場(chǎng)景下Go是理想的選擇,以及哪種場(chǎng)景下Rust可能是更好的選擇。
兩種語(yǔ)言的共同目標(biāo)是什么?
從歷史來(lái)看,軟件錯(cuò)誤和安全漏洞的最大原因之一是不安全或不正確地訪問(wèn)內(nèi)存。
Rust和Go以不同的方式處理這個(gè)問(wèn)題,但兩者的目標(biāo)都是比其他語(yǔ)言在管理內(nèi)存方面更智能、更安全。
它們都是編譯語(yǔ)言,這意味著你的程序?qū)⒈恢苯泳幾g為可執(zhí)行的機(jī)器代碼,以便你可以將程序部署為單個(gè)二進(jìn)制文件。與Python或Ruby等解釋語(yǔ)言相比,這也使得Rust和Go程序擁有極快的執(zhí)行速度。
Rust和Go都是功能強(qiáng)大、可擴(kuò)展的通用編程語(yǔ)言,你可以使用它們來(lái)開(kāi)發(fā)各種現(xiàn)代軟件。兩者都擁有優(yōu)秀的標(biāo)準(zhǔn)庫(kù)和蓬勃發(fā)展的第三方生態(tài)系統(tǒng),以及強(qiáng)大的商業(yè)支持和龐大的用戶(hù)群。
雖然Go和Rust都具有與函數(shù)式和面向?qū)ο缶幊?(OOP) 相關(guān)的功能特性,但它們都是實(shí)用語(yǔ)言(pragmatic languages),旨在以最合適的方式解決問(wèn)題。
Rust和Go都有一些有用的功能特性,使它們適合大規(guī)模編程,無(wú)論是大型團(tuán)隊(duì),還是大型代碼庫(kù),或兩者兼而有之。
例如,Rust和Go都使用標(biāo)準(zhǔn)代碼格式化工具(Go的gofmt,Rust的rustfmt),這結(jié)束了關(guān)于括號(hào)放置位置的無(wú)用爭(zhēng)論。
兩者還具有優(yōu)秀的內(nèi)置高性能標(biāo)準(zhǔn)構(gòu)建和依賴(lài)管理工具;不再需要與復(fù)雜的第三方構(gòu)建系統(tǒng)搏斗,也不必每隔幾年學(xué)習(xí)一個(gè)新系統(tǒng)。
雖然Rust和Go有很多共同點(diǎn),但在某些領(lǐng)域,理性的人可能會(huì)更喜歡一種語(yǔ)言而不是另一種語(yǔ)言,以滿足項(xiàng)目的特定需求。
Go和Rust都非常快。然而,Go的設(shè)計(jì)更有利于快速編譯,而Rust則是針對(duì)快速執(zhí)行進(jìn)行了優(yōu)化。
Rust的運(yùn)行時(shí)性能也更加一致,因?yàn)樗皇褂美厥諜C(jī)制。另一方面,Go的垃圾回收器減輕了程序員的一些負(fù)擔(dān),使其更容易專(zhuān)注于解決主要問(wèn)題,而不是內(nèi)存管理的細(xì)節(jié)。
對(duì)于執(zhí)行速度勝過(guò)所有其他考慮因素的領(lǐng)域(例如游戲編程、操作系統(tǒng)內(nèi)核、Web瀏覽器組件和實(shí)時(shí)控制系統(tǒng)),Rust是更好的選擇。
從設(shè)計(jì)上來(lái)說(shuō),Go是一種小型語(yǔ)言:它的語(yǔ)法、關(guān)鍵字和語(yǔ)言結(jié)構(gòu)都非常少。你可以快速學(xué)習(xí)Go的基礎(chǔ)知識(shí)并使用該語(yǔ)言提升工作效率。
這使得Go在時(shí)間跨度短的項(xiàng)目中或需要快速引入大量新程序員的團(tuán)隊(duì)中具有優(yōu)勢(shì),尤其是在他們相對(duì)缺乏經(jīng)驗(yàn)的情況下。
另一方面,Rust幾乎擁有你能想象到的編程語(yǔ)言的所有功能特性,還有一些你可能無(wú)法想象的功能特性。這使得它成為一種強(qiáng)大且富有表現(xiàn)力的語(yǔ)言,可以通過(guò)多種不同的方式來(lái)完成同一件事。
如果你是從其他語(yǔ)言過(guò)渡到Rust的,你可能可以找到你習(xí)慣的大多數(shù)功能的Rust等效項(xiàng)。當(dāng)大型項(xiàng)目需要從C++或Java等傳統(tǒng)語(yǔ)言遷移時(shí),這給Rust帶來(lái)了優(yōu)勢(shì)。
與大多數(shù)語(yǔ)言不同,Go語(yǔ)言的設(shè)計(jì)內(nèi)置了對(duì)并發(fā)編程的支持,例如 goroutine(線程的輕量級(jí)版本)和通道(在并發(fā)任務(wù)之間通信數(shù)據(jù)的安全有效的方法)。
這些使得Go成為網(wǎng)絡(luò)服務(wù)器和微服務(wù)等大規(guī)模并發(fā)應(yīng)用程序的完美選擇。
Rust經(jīng)過(guò)精心設(shè)計(jì),以確保程序員無(wú)法做一些他們不想做的不安全的事情,例如覆蓋共享變量。編譯器要求你明確在程序的不同部分之間共享數(shù)據(jù)的方式,并且可以檢測(cè)許多常見(jiàn)的錯(cuò)誤和bug。
因此,所謂的“與借用檢查器(borrow checker)戰(zhàn)斗”是新Rust程序員的常見(jiàn)抱怨。用安全的Rust代碼實(shí)現(xiàn)程序通常意味著從根本上重新思考其設(shè)計(jì),這可能會(huì)令人沮喪,但當(dāng)可靠性是你的首要任務(wù)時(shí),這樣做的好處是值得的。
Go旨在讓你輕松擴(kuò)展項(xiàng)目和開(kāi)發(fā)團(tuán)隊(duì)。它的極簡(jiǎn)設(shè)計(jì)帶來(lái)了一定的一致性,并且明確定義的標(biāo)準(zhǔn)風(fēng)格的存在意味著任何Go程序員都可以相對(duì)快速地閱讀和理解新的代碼庫(kù)。
當(dāng)談到大型軟件開(kāi)發(fā)時(shí),清晰勝于聰明。對(duì)于大型組織,尤其是許多分布式團(tuán)隊(duì)來(lái)說(shuō),Go是一個(gè)不錯(cuò)的選擇。其快速構(gòu)建時(shí)間也有利于快速測(cè)試和部署。
Rust和Go的設(shè)計(jì)團(tuán)隊(duì)做出了一些截然不同的選擇,所以讓我們看看這些權(quán)衡取舍使這兩種語(yǔ)言彼此截然不同的一些領(lǐng)域。
一般來(lái)說(shuō),具有垃圾回收和自動(dòng)內(nèi)存管理功能的語(yǔ)言(如Go)可以快速輕松地開(kāi)發(fā)可靠、高效的程序,對(duì)于某些人來(lái)說(shuō)這是最重要的。
但是垃圾回收由于其性能開(kāi)銷(xiāo)和停止世界(Stop-The-World)的暫停,可能會(huì)使程序在運(yùn)行時(shí)的行為變得不可預(yù)測(cè),有些人發(fā)現(xiàn)這種不一致是不可接受的。
程序員必須明確負(fù)責(zé)分配和釋放每個(gè)字節(jié)內(nèi)存的語(yǔ)言(例如Rust)更適合實(shí)時(shí)或超高性能應(yīng)用程序。
計(jì)算機(jī)編程的歷史是一個(gè)日益復(fù)雜的抽象的故事,它讓程序員可以解決問(wèn)題,而不必過(guò)多擔(dān)心底層機(jī)器的實(shí)際工作方式。
這使得程序更容易編寫(xiě)并且可能更可移植。但對(duì)于許多程序來(lái)說(shuō),訪問(wèn)硬件以及精確控制程序的執(zhí)行方式更為重要。
Rust的目標(biāo)是讓程序員“更接近金屬”,擁有更多的控制權(quán),而Go抽象了架構(gòu)細(xì)節(jié),讓程序員更接近問(wèn)題。
Rust進(jìn)行了許多設(shè)計(jì)權(quán)衡,以實(shí)現(xiàn)最佳的執(zhí)行速度。相比之下,Go更關(guān)心簡(jiǎn)單性,并且愿意為此犧牲一些(運(yùn)行時(shí))性能。
在這一點(diǎn)上你是喜歡Rust還是Go取決于你是愿意花更多的時(shí)間等待程序構(gòu)建,還是等待程序運(yùn)行。
Go和Rust都旨在幫助你編寫(xiě)正確的程序,但方式不同:例如,Go提供了出色的內(nèi)置單元測(cè)試框架和豐富的標(biāo)準(zhǔn)庫(kù),而Rust則專(zhuān)注于利用其借用檢查機(jī)制(borrow checker)消除運(yùn)行時(shí)錯(cuò)誤。
公平地說(shuō),用Go編寫(xiě)給定的程序更容易,但結(jié)果可能比Rust版本更容易包含錯(cuò)誤。Rust對(duì)程序員施加了紀(jì)律約束,但Go讓程序員選擇他們想要對(duì)特定項(xiàng)目采取的紀(jì)律程度。
我希望這篇文章能讓你相信Rust和Go都值得你認(rèn)真考慮。你應(yīng)該拒絕這種錯(cuò)誤的困境:你只能學(xué)習(xí)其中之一。事實(shí)上,你了解的語(yǔ)言越多,你作為軟件開(kāi)發(fā)人員的價(jià)值就越高。
你學(xué)習(xí)的每一種新語(yǔ)言都會(huì)給你思考問(wèn)題的新方法,這只能是一件好事。任何軟件項(xiàng)目的質(zhì)量和成功最重要的因素不是語(yǔ)言的選擇,而是程序員的技能。
當(dāng)使用最適合你的語(yǔ)言時(shí),你變得最熟練,并且你也能享受到最多的編程帶給你的樂(lè)趣。因此,如果問(wèn)題是“我應(yīng)該學(xué)習(xí)Rust或Go嗎?”,唯一正確的答案是“是的”。
本文鏈接:http://www.www897cc.com/showinfo-26-67845-0.html2024年的Rust與Go,你看明白了嗎?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: Python Fire讓命令行接口開(kāi)發(fā)變得簡(jiǎn)單
下一篇: 寫(xiě)一個(gè) Vue3 Hooks,準(zhǔn)確計(jì)算網(wǎng)頁(yè)的幀數(shù) FPS