放眼編程語(yǔ)言界,新舊勢(shì)力的交替歷來(lái)暗潮涌動(dòng)又動(dòng)人心弦。而在最近兩年,Rust的表現(xiàn)不可謂不搶眼。
根據(jù)SlashData 2021年開(kāi)發(fā)者報(bào)告顯示,使用Rust編程的開(kāi)發(fā)人員在過(guò)去24個(gè)月內(nèi)增長(zhǎng)了兩倍,達(dá)到了220萬(wàn)。過(guò)去C/C++、Java等是大廠的常用語(yǔ)言,而如今,字節(jié)跳動(dòng)、亞馬遜、谷歌、蘋(píng)果均已經(jīng)用上了Rust語(yǔ)言,這意味著學(xué)好Rust語(yǔ)言就有機(jī)會(huì)找到高薪工作。
不過(guò),也有人認(rèn)為Rust學(xué)習(xí)門檻高,戲言“Rust的語(yǔ)法有點(diǎn)反人類”。那么事實(shí)到底如何呢?
“當(dāng)紅炸子雞”Rust:高效、安全但難學(xué)
Rust最初由Mozilla員工Graydon Hoare在2006年設(shè)計(jì)和發(fā)布,目前由Mozilla團(tuán)隊(duì)和一眾開(kāi)源社區(qū)成員共同開(kāi)發(fā)和維護(hù)。
Rust能火,并非偶然。Graydon Hoare曾形容:“Rust是一種采用過(guò)去的知識(shí)解決將來(lái)的問(wèn)題的技術(shù)。”站在前人的肩膀上,Rust很大程度上解決了很多其他編程語(yǔ)言的痛點(diǎn)。
首先,Rust發(fā)揮了靜態(tài)語(yǔ)言的優(yōu)勢(shì)。相較動(dòng)態(tài)語(yǔ)言在調(diào)試和運(yùn)行時(shí)的不確定性,靜態(tài)類型的語(yǔ)言允許對(duì)數(shù)據(jù)及其行為預(yù)先進(jìn)行編譯器級(jí)別的檢查和約束,在運(yùn)行時(shí)只保留少量的類型檢查,這極大地避免了程序員的麻煩,同時(shí)有益于鼓勵(lì)長(zhǎng)期的可維護(hù)性。
其次,Rust解決了并發(fā)條件下的數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題,讓并發(fā)更容易。當(dāng)兩個(gè)線程同時(shí)訪問(wèn)同一內(nèi)存時(shí)會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng),這就可能導(dǎo)致某些不可預(yù)測(cè)的行為。Rust從編譯階段就將數(shù)據(jù)競(jìng)爭(zhēng)解決在了萌芽狀態(tài),保障了線程安全。用戶可以用庫(kù)的形式實(shí)現(xiàn)各種高效且安全的并發(fā)編程模型,進(jìn)而充分利用多核時(shí)代的硬件性能。
再者,Rust做到了更好的內(nèi)存安全特性。在內(nèi)存管理上,常見(jiàn)的方式有兩種:要么如Java、Python一樣使用垃圾回收算法,要么像C++一樣手工管理內(nèi)存。但垃圾自動(dòng)回收必然影響性能,手工管理內(nèi)存則可能會(huì)出現(xiàn)內(nèi)存泄漏和懸停指針之類的問(wèn)題。Rust不同,其所有權(quán)系統(tǒng)在編譯時(shí)就分析程序的內(nèi)存管理,而且沒(méi)有額外的運(yùn)行時(shí)開(kāi)銷。這種無(wú)垃圾回收器的內(nèi)存安全機(jī)制是Rust經(jīng)典且核心的設(shè)計(jì)之一。
還有,作為系統(tǒng)級(jí)編程語(yǔ)言,Rust的基本理念是 “零成本抽象”。這一理念讓Rust具備高級(jí)語(yǔ)言表達(dá)能力的同時(shí),又不會(huì)帶來(lái)性能損耗。與其他系統(tǒng)級(jí)編程語(yǔ)言(如C或C++)相比,Rust不需要程序員將所有時(shí)間都花在細(xì)節(jié)上,而是通過(guò)添加更高層次的編程概念,確保使用的抽象幾乎沒(méi)有運(yùn)行時(shí)開(kāi)銷,這種抽象與等效的手寫(xiě)代碼具有同等的性能。
總的來(lái)說(shuō),在性能上,Rust內(nèi)存利用率極高,能夠勝任對(duì)性能要求特別高的服務(wù);在安全性上,Rust豐富的類型系統(tǒng)和所有權(quán)模型保證了內(nèi)存安全和線程安全,在編譯期就能夠有效阻斷各種錯(cuò)誤的產(chǎn)生。
有著如此表現(xiàn)的Rust雖然還是編程語(yǔ)言界的“小鮮肉”,卻迅速收獲了開(kāi)發(fā)者們的青睞。根據(jù)Stack Overflow 2021年開(kāi)發(fā)者調(diào)查報(bào)告,Rust連續(xù)六年成為最受開(kāi)發(fā)者喜愛(ài)的編程語(yǔ)言。
不過(guò),“最受喜愛(ài)”并不等于“最想使用”。
盡管口碑好、人氣高,但Rust的學(xué)習(xí)成本高幾乎是眾所周知的。在官方的多次調(diào)查中,不少開(kāi)發(fā)者提到需要降低學(xué)習(xí)門檻,讓Rust更容易被學(xué)習(xí)。2021年Rust Survey調(diào)查中,有47.41%的受訪者認(rèn)為采用Rust很有挑戰(zhàn)性,僅有17.14%認(rèn)為挑戰(zhàn)性不大。
圖源:互聯(lián)網(wǎng)
可以說(shuō),除了部分具備一定的C/C++經(jīng)驗(yàn)的開(kāi)發(fā)者在使用Rust時(shí)會(huì)容易一點(diǎn),很多人會(huì)因?yàn)椤疤y上手”而對(duì)Rust望而生畏。
Rust對(duì)決C++:以卵擊石還是后生可畏
Rust到底值不值得花功夫去上手?我們可以從它與其他語(yǔ)言的比較中一窺端倪。
Rust常常被認(rèn)為是C++的競(jìng)爭(zhēng)語(yǔ)言,但這種說(shuō)法也會(huì)被一些C++擁護(hù)者吐槽為“碰瓷”。不可否認(rèn),Rust很受歡迎,且頗有后勁,但目前來(lái)說(shuō),C++的主導(dǎo)地位依舊不可動(dòng)搖。宏觀來(lái)看,C++擁有更大的社區(qū)、更廣泛的用例,并且在實(shí)戰(zhàn)中得到了絕大多數(shù)企業(yè)的認(rèn)可。但另一方面,Rust在安全性上表現(xiàn)更優(yōu),沒(méi)有C++那么重的歷史包袱,作為新生力量潛力更大,等生態(tài)更加豐富后可能會(huì)更有作為。
內(nèi)存安全:同為系統(tǒng)級(jí)編程語(yǔ)言,C++為了保持速度,沒(méi)有走內(nèi)置垃圾回收機(jī)制的路子,將內(nèi)存安全問(wèn)題留給了開(kāi)發(fā)人員。而Rust通過(guò)其所有權(quán)系統(tǒng)全面強(qiáng)制并提高了其內(nèi)存安全性,基本消除了手動(dòng)內(nèi)存管理的需要。
智能指針:Rust和C++語(yǔ)言都廣泛支持指針,在兩種語(yǔ)言中,首選都是智能指針。Rust標(biāo)準(zhǔn)庫(kù)提供了幾種與C++類似的智能指針,如Box相當(dāng)于C++中的std::unique_ptr;Rc相當(dāng)于C++中的std::shared_ptr。
框架和庫(kù):Rust和C++都有大量的框架和庫(kù)可以使用。盡管發(fā)展時(shí)長(zhǎng)差距較大,但Rust目前已經(jīng)有大量庫(kù)可供網(wǎng)頁(yè)開(kāi)發(fā)、游戲開(kāi)發(fā)、區(qū)塊鏈等使用。而
C++庫(kù)主要是標(biāo)準(zhǔn)庫(kù),是類和函數(shù)的集合。兩種語(yǔ)言都有大量活躍的貢獻(xiàn)者。
包管理和工具:Rust的官方包管理器是Cargo,就普遍反饋來(lái)說(shuō)比較好用、很有競(jìng)爭(zhēng)力。而C++在包管理方面也有Conan之類的工具,發(fā)展也不錯(cuò)。兩者使用體驗(yàn)如何見(jiàn)仁見(jiàn)智。
并發(fā)性:兩種語(yǔ)言在并發(fā)中表現(xiàn)均很穩(wěn)健。但在線程安全方面,面對(duì)數(shù)據(jù)競(jìng)爭(zhēng)這種難以定位的并發(fā)漏洞類型,Rust的內(nèi)存安全特性更有助于預(yù)防這類問(wèn)題的發(fā)生。不過(guò),對(duì)自身代碼非常自信的程序員可能會(huì)覺(jué)得,Rust在實(shí)現(xiàn)多線程應(yīng)用時(shí)過(guò)于束縛。
社區(qū)支持:C++有C++標(biāo)準(zhǔn)委員會(huì)的領(lǐng)導(dǎo),而Rust也有Rust基金會(huì)的支持。兩種語(yǔ)言的社區(qū)都很活躍。不過(guò)因?yàn)镃++發(fā)展時(shí)間要長(zhǎng)得多,生態(tài)上肯定要比Rust成熟很多,受眾基礎(chǔ)也要大得多。
歸根結(jié)底,所有語(yǔ)言都是工具,真正使用時(shí)都要因地制宜。作為一門優(yōu)缺點(diǎn)都極為鮮明的語(yǔ)言,Rust在實(shí)戰(zhàn)中表現(xiàn)如何仍需要開(kāi)發(fā)者的親手驗(yàn)證。有位C++程序員的評(píng)價(jià)或許可以給我們更多啟發(fā):
“雖然Rust定位于一門系統(tǒng)級(jí)編程語(yǔ)言,但它并沒(méi)走C++兼容C的老路,完全沒(méi)有歷史的包袱,可以輕裝上陣,充分吸收各家編程語(yǔ)言之長(zhǎng),避其之短。Rust有完全不亞于C++的表達(dá)能力和性能,又解決了C++的最大痛點(diǎn)(內(nèi)存安全、線程安全),這對(duì)C++程序員來(lái)講無(wú)疑是非常有吸引力的。目前,C++仍然是我的主力編程語(yǔ)言,但我對(duì)Rust是看好的。它不僅實(shí)用,反過(guò)來(lái)也會(huì)促進(jìn)對(duì)C++中關(guān)鍵概念和問(wèn)題的理解?!?/p>
前景:Rust會(huì)登頂嗎?
在代碼江湖,編程語(yǔ)言總是呈現(xiàn)出“江山代有才人出”的態(tài)勢(shì)。Rust作為一門年輕的語(yǔ)言,面向一眾老前輩,也展示出了作為后起之秀的銳氣和野心。
在今年上半年, Rust語(yǔ)言設(shè)計(jì)團(tuán)隊(duì)(Lang Team)在官方博客中公布了Rust語(yǔ)言2024年的更新路線圖。這張路線圖昭示了Rust語(yǔ)言的未來(lái)發(fā)展方向。其重點(diǎn)有三:
一是努力拉平陡峭的學(xué)習(xí)曲線。面向Rust學(xué)習(xí)門檻高的問(wèn)題,Lang Team力圖通過(guò)各種手段簡(jiǎn)化程序,使開(kāi)發(fā)者能更輕松地表達(dá)代碼意圖,而不需要處理邏輯實(shí)現(xiàn)的各種細(xì)枝末節(jié)。
二是讓Rust庫(kù)的生態(tài)系統(tǒng)更加輕松協(xié)調(diào)。Lang Team希望通過(guò)幫助管理功能生命周期,擴(kuò)展庫(kù)的功能,以及增強(qiáng)互操作性,使庫(kù)的作者能夠更好地服務(wù)于他們的用戶。
三是進(jìn)一步擴(kuò)大Rust項(xiàng)目規(guī)模。為更有效地推進(jìn)Rust發(fā)展,Lang Team希望讓開(kāi)發(fā)者能對(duì)團(tuán)隊(duì)的現(xiàn)存問(wèn)題、工作狀況一目了然,并對(duì)他們可以如何提供幫助更加清晰,使開(kāi)發(fā)人員能夠積極參與推動(dòng)他們熱衷的工作。
不過(guò),對(duì)于Rust的前景,依舊眾說(shuō)紛紜。
有人說(shuō),Rust可能還是干不過(guò)老語(yǔ)言,終究難逃曇花一現(xiàn)的命運(yùn);
也有人說(shuō),Rust可能在Web應(yīng)用開(kāi)發(fā)、嵌入式設(shè)備開(kāi)發(fā)等領(lǐng)域另辟洞天、大有作為;
還有人說(shuō),Rust也許會(huì)吞下C++大部分應(yīng)用場(chǎng)景,在漫長(zhǎng)的發(fā)展期后完成登頂……
而對(duì)于程序員是否要學(xué)Rust,支持和反對(duì)陣營(yíng)也同樣各執(zhí)己見(jiàn)。
支持者給出的理由,主要集中在以下幾點(diǎn):
- Rust站在巨人的肩膀上,也確實(shí)解決了C++的部分問(wèn)題,很好地平衡了性能和開(kāi)發(fā)效率。
- 一些企業(yè),尤其是大型公司,已經(jīng)在使用Rust或正計(jì)劃使用Rust。以后對(duì)于Rust開(kāi)發(fā)者的需求會(huì)持續(xù)上升,而且可以預(yù)見(jiàn)薪酬很可觀。
- 作為一門年輕的語(yǔ)言,Rust的領(lǐng)域還沒(méi)那么卷。抓住這個(gè)時(shí)機(jī)就有望成為這片“新大陸”的掘金者。
反對(duì)者則認(rèn)為:
- 從職業(yè)發(fā)展考慮,對(duì)萌新來(lái)說(shuō),學(xué)習(xí)Rust得不償失。因?yàn)镽ust目前還是一門小眾語(yǔ)言,將來(lái)會(huì)發(fā)展成什么樣均未可知。而其他更為成熟的語(yǔ)言,掌握之后在實(shí)踐中已經(jīng)可以滿足大部分業(yè)務(wù)需求。
- Rust的學(xué)習(xí)門檻決定了,有能力鉆研其語(yǔ)法的程序員,用別的語(yǔ)言也很少會(huì)犯Rust想要從根源上杜絕的"低級(jí)錯(cuò)誤";而對(duì)于基礎(chǔ)薄弱、編程思維混亂的程序員,很少能學(xué)進(jìn)去Rust。這個(gè)矛盾就讓Rust有點(diǎn)“不上不下”。
- 程序真正面向的是人,而不是機(jī)器。語(yǔ)法簡(jiǎn)單、易于理解、減少程序員的心智負(fù)擔(dān)才應(yīng)該是編程語(yǔ)言未來(lái)的發(fā)展方向。Rust顯然不符合這一點(diǎn)。
回顧這些論點(diǎn),可以發(fā)現(xiàn),其實(shí)作為局中人,要預(yù)判一門語(yǔ)言的發(fā)展是很難的,因?yàn)闆](méi)有人可以窺見(jiàn)其發(fā)展全貌。而且每門語(yǔ)言的發(fā)展也需遵循其自身的生命周期,不同階段的評(píng)判標(biāo)準(zhǔn)不同,結(jié)論自然也不一樣?;蛟S就像有人說(shuō)的,“我不討厭任何編程語(yǔ)言,我只是討厭還沒(méi)掌握的言?!本唧w到每一個(gè)開(kāi)發(fā)者,所有的爭(zhēng)論、質(zhì)疑、好惡都要在嘗試、學(xué)習(xí)、實(shí)操中逐步地變化演進(jìn)。
參考資料:
https://zhuanlan.zhihu.com/p/342849423
https://blog.csdn.net/oSuiYing12/article/details/106844271
https://www.toutiao.com/article/7083687609608339998/
https://lang-team.rust-lang.org/roadmaps/roadmap-2024.html
https://thestack.technology/rust-language-explosive-growth-challenges-rust-governance/