點(diǎn)擊參加51CTO網(wǎng)站內(nèi)容調(diào)查問(wèn)卷
編譯 | 王瑞平、言征
使用Rust三年多了,我非常喜歡它。Rust不僅幫助我完成了很多任務(wù),還開(kāi)發(fā)出極其可靠的軟件。Rust讓推斷代碼的并發(fā)性和并行性變得更容易。
我可以繼續(xù)贊美Rust,但這并非本篇文章的重點(diǎn)。相反,這篇文章旨在揭露Rust的一些缺點(diǎn),它有時(shí)會(huì)拖慢開(kāi)發(fā)人員的進(jìn)度,需要調(diào)用其它語(yǔ)言才能完成任務(wù)。
1、Rust需要調(diào)用其它語(yǔ)言完成任務(wù)
Rust中沒(méi)有具體調(diào)用系統(tǒng)命令的方法,得通過(guò)crates.io實(shí)現(xiàn)此功能。7年前,syscall crate進(jìn)行了最后一次更新,支持以下平臺(tái):
毫無(wú)疑問(wèn),Linux在列表中出現(xiàn)次數(shù)最多。
不過(guò),如果你仍只使用FreeBSD操作系統(tǒng)而不使用x86_64,你就out了。如果你只關(guān)心NetBSD、OpenBSD或Solaris,你只能get到普通的技能。此時(shí),你可以采取的措施是使用libc crate。
我認(rèn)為這些方式都不太好,這不是系統(tǒng)編程語(yǔ)言該有的狀態(tài)。系統(tǒng)編程語(yǔ)言應(yīng)該可以與其它編程語(yǔ)言互操作,不需要通過(guò)調(diào)用C語(yǔ)言完成任務(wù)。
2、內(nèi)存模型:用Rust語(yǔ)言開(kāi)發(fā)Linux內(nèi)核的攔路虎
上述列表中出現(xiàn)最多的當(dāng)屬Linux。最近幾年,Rust For Linux項(xiàng)目隨著Rust的火爆也開(kāi)始逐漸升溫。但是,Rust想深入Linux的真正核心仍有很長(zhǎng)的路要走,最大的攔路虎是內(nèi)存模型方面的問(wèn)題。
當(dāng)Rust編寫“無(wú)限接近計(jì)算機(jī)底層”的操作內(nèi)核時(shí),內(nèi)存模型會(huì)變得很重要。它是多線程環(huán)境能夠可靠工作的基礎(chǔ),需要對(duì)多線程環(huán)境的運(yùn)作細(xì)節(jié)進(jìn)行完備的定義。
Rust中的lock鎖是與具體要保護(hù)的數(shù)據(jù)是有強(qiáng)綁定關(guān)系的,開(kāi)發(fā)者需要調(diào)用data.lock將鎖進(jìn)行鎖定,只有這樣才能受鎖保護(hù)的數(shù)據(jù)才能被訪問(wèn)。
由于Rust的變量都是有嚴(yán)格的生命周期及借用機(jī)制的,因此,鎖也很可能要在內(nèi)存中移動(dòng),內(nèi)存中對(duì)象的移動(dòng)、所有權(quán)借用等除了造成移動(dòng)鎖之外還會(huì)有移動(dòng)構(gòu)造函數(shù)等問(wèn)題。
但是移動(dòng)鎖、還移動(dòng)構(gòu)造函數(shù)這些概念在之前的Linux中幾乎是聞所未聞的。這些問(wèn)題在Rust只開(kāi)發(fā)上層應(yīng)用時(shí)都不是問(wèn)題,但一旦深入到操作系統(tǒng)內(nèi)核,這些就都成了問(wèn)題。所以,Rust想真正深入到Linux的內(nèi)核當(dāng)中還有很多的路要走。
3、麻煩:你只在GitHub上才能獲得crates包
一旦部分技術(shù)人員放棄使用crates包,隨著時(shí)間的推移更多人會(huì)放棄。我并不是唯一批判這個(gè)系統(tǒng)缺陷的人。
最重要的是,crates.io的注冊(cè)列表只在GitHub上才能get到。這意味著,為了使用crates.io,你必須擁有一個(gè)GitHub帳戶。對(duì)于一些開(kāi)發(fā)人員來(lái)說(shuō),這顯然不是問(wèn)題,但是,并不是所有程序員都能夠適應(yīng)這種形式。
總之,就個(gè)人而言,我認(rèn)為Rust在GitHub上托管他們的代碼糟糕透了。
4、不吐不快:Rust中那些突出的缺陷
除了上述的“吐槽”,Rust編程語(yǔ)言還有一些明顯的缺點(diǎn),在這里做個(gè)總結(jié):
1)編譯時(shí)間
與其對(duì)等的編程語(yǔ)言相比,Rust編譯代碼的速度相對(duì)較慢。原因是它的“編譯單元”不是單個(gè)文件,而是上文提到的crate包。
crate可以包含多個(gè)模塊。因此,它們可以是大型編譯單元。雖然完成了whole-of-crate優(yōu)化,但是,它還需要whole-of-crate編譯,這很耗時(shí)。此外,它還具有一個(gè)復(fù)雜的編譯器工具鏈,該工具鏈包含多個(gè)中間表示,并向LLVM發(fā)送大量代碼。這些都是導(dǎo)致Rust編譯代碼速度變慢的原因。
2)學(xué)習(xí)難度
真正學(xué)會(huì)Rust很難,為了理解它的主要部分,你需要先熟悉C++ 或任何面向?qū)ο蟮恼Z(yǔ)言。
3)過(guò)于嚴(yán)格
在編程方面,嚴(yán)格通常被認(rèn)為是一件好事,但是,Rust有時(shí)有點(diǎn)過(guò)于嚴(yán)格,使用它進(jìn)行編程時(shí)很難偷懶。直到一切都恰到好處,程序才會(huì)正確運(yùn)行。
五、替代品:Zig,小巧而簡(jiǎn)潔
除了Rust,另一種真正引起我注意的語(yǔ)言是Zig。它在編譯時(shí)計(jì)算和執(zhí)行命令,而不是像Rust一樣在運(yùn)行時(shí)執(zhí)行命令。很多程序員已經(jīng)通過(guò)實(shí)踐證明了這一點(diǎn)。Zig不僅成為了完美的替代品, 對(duì)于維護(hù)任何類型的宏觀系統(tǒng)也都游刃有余。
Zig編程語(yǔ)言最主要的優(yōu)點(diǎn)是小巧而簡(jiǎn)潔,正廣受程序員好評(píng)。它專注于調(diào)試你的應(yīng)用程序,而不是調(diào)試你的編程語(yǔ)言知識(shí),沒(méi)有隱式控制流、沒(méi)有隱式內(nèi)存分配、沒(méi)有預(yù)處理器,更沒(méi)有宏。
此外,用Zig編寫的庫(kù)可以在任何地方使用,包括:桌面程序和游戲、低延遲服務(wù)器、操作系統(tǒng)內(nèi)核、嵌入式設(shè)備等。
Zig還提供了defer和errdefer,使所有的資源管理(不僅是內(nèi)存)變得簡(jiǎn)單且易于驗(yàn)證。
六、寫在最后:Rust仍是理想語(yǔ)言
總之,拋開(kāi)上述缺陷不談,我仍認(rèn)為Rust非常接近我的理想語(yǔ)言。但實(shí)際上,我也正在尋找其它語(yǔ)言。
我相信,當(dāng)聽(tīng)到批評(píng)的聲音后,Rust可以已經(jīng)開(kāi)始變革并反思了,也許,更好的解決方案即將出現(xiàn)。這需要一群人共同改進(jìn)這種語(yǔ)言才不會(huì)重復(fù)同樣的錯(cuò)誤。
當(dāng)然,我對(duì)Rust抱怨主要針對(duì)crates.io,相信此類問(wèn)題在不久的將來(lái)都能得以解決。
所以,無(wú)論如何,讓我們盡情幻想“后Rust時(shí)代的理想語(yǔ)言”。這種語(yǔ)言應(yīng)該與Rust類似,同時(shí)具有Zig語(yǔ)言comptime的優(yōu)勢(shì)。
新的語(yǔ)言中會(huì)有borrow checker,它就像Rustc編譯器一樣可以檢測(cè)出錯(cuò)誤的消息。我們也會(huì)更多的支持comptime概念的出現(xiàn)而并非宏。與Rust不同,這種新語(yǔ)言能夠從頭至尾完成各種任務(wù)。
在新語(yǔ)言中,我們可獲得接口等內(nèi)置功能并能夠直接與其它語(yǔ)言以及底層操作系統(tǒng)內(nèi)核通信。最后,我還設(shè)想出一個(gè)庫(kù)包生態(tài)系統(tǒng),它將是完全分布式和去中心化的。
雖然Rust有缺點(diǎn),但它仍然是迄今為止在內(nèi)存訪問(wèn)、安全性和準(zhǔn)確性方面最好的語(yǔ)言。我提到的很多小抱怨都只是從普通程序員角度出發(fā)的。
原文鏈接:https://jeang3nie.codeberg.page/rust-criticism-from-rustacean/