Rust與信息學(xué)的三大規(guī)律

在Java世界工作了10年之后,我最近更認(rèn)真地看待Rust。我?guī)缀鯖]有開始Rust編程(,我是一個(gè)完整的新手),但我感到很熱情:我相信Rust值得關(guān)注,因?yàn)樗钦Z(yǔ)言平衡的轉(zhuǎn)變。

品前看菜:

Rust可以在嵌入式芯片,Web應(yīng)用程序和分布式系統(tǒng)中運(yùn)行。它結(jié)合了C的速度,這是一種現(xiàn)代,強(qiáng)大的系統(tǒng),可以安全地管理記憶和高質(zhì)量的生態(tài)系統(tǒng)。它使編寫并發(fā)代碼變得簡(jiǎn)單而安全。Rust社區(qū)熱情,善良,非?;钴S并且構(gòu)建了出色的軟件。Rust已經(jīng)在生產(chǎn)中使用,它工作正常,但有些部分仍在完善中。我要加入樂趣,不讓你知道這是錯(cuò)的:-)

從Java到Rust

Java和Rust是非常不同的語(yǔ)言,據(jù)說(shuō)可以針對(duì)不同的空間。我被問(wèn)到為什么Java開發(fā)人員 - 一個(gè)無(wú)聊的開發(fā)人員 -?會(huì)對(duì)Rust感興趣。事實(shí)證明,我選擇Java的理由與現(xiàn)在引導(dǎo)我走向Rust的理由相同。讓我描述指導(dǎo)我選擇語(yǔ)言和技術(shù)的原則:* 咚咚咚咚?* -----信息學(xué)的三個(gè)定律!

信息學(xué)的三大定律

有許多規(guī)則或法律試圖將軟件的制作或制作方式正式化。一些人從Isaac Asimov的機(jī)器人三法則中汲取靈感。Asimov的定律很有趣,因?yàn)樗鼈兪且粋€(gè)有點(diǎn)令人無(wú)法抗拒的Sci-Fi參考,但它們也很好,因?yàn)樗鼈兒苄〔⑶覂?yōu)先級(jí)清晰。

我將它們稱為信息學(xué)三定律。這些定律在其內(nèi)容中可能不是非常原始 - 而不是真正的定律 - 但是像Asimov的定律一樣,它們?cè)噲D找到最基本的公理,從中可以推導(dǎo)出理想的性質(zhì)。它們是盡力而為的法則,因?yàn)橥昝朗俏覀儫o(wú)法掌握的。

開始了:

1. 程序必須正確。

2. 程序必須是可維護(hù)的,除非它與第一法相沖突。

3. 計(jì)劃必須有效,除非它與第一或第二法相沖突。

第一部規(guī)定意味著計(jì)劃在所有情況下都應(yīng)該按預(yù)期行事。它意味著軟件應(yīng)該嘗試避開所以的錯(cuò)誤,安全問(wèn)題,永遠(yuǎn)不應(yīng)該崩潰。

第二定律意味著程序應(yīng)該精心設(shè)計(jì)記錄 -因?yàn)樗枰獙?duì)代碼有很好的理解 - 并且模塊化,因?yàn)榇蟮恼w塊是不可維護(hù)的。還應(yīng)該有幫助開發(fā)人員維護(hù)程序的工具。部分演進(jìn)不應(yīng)該保證完全重寫,而另一個(gè)開發(fā)人員應(yīng)該能夠進(jìn)行必要的更改,因?yàn)樵O(shè)計(jì)清晰,并且因?yàn)檎Z(yǔ)言可以掌握。

第三定律意味著計(jì)劃應(yīng)該傾向于最有可能的投入的速度和資源消耗的最佳平衡 - 也就是說(shuō),根據(jù)它們的使用方式。這意味著我們應(yīng)該使用最好的數(shù)據(jù)結(jié)構(gòu)來(lái)完成工作,以實(shí)現(xiàn)最佳權(quán)衡?- 因?yàn)榇蠖鄶?shù)時(shí)候沒有全局優(yōu)化 -?適當(dāng)?shù)?b>規(guī)劃規(guī)模并使代碼合理的運(yùn)行它的計(jì)算機(jī)。

這三項(xiàng)定律共同創(chuàng)造了一個(gè)充滿活力的生態(tài)系統(tǒng)社區(qū)的要求。開發(fā)人員無(wú)法單獨(dú)編寫正確,可維護(hù)和高效的程序,因?yàn)楝F(xiàn)代程序依賴的代碼多于單個(gè)開發(fā)人員可以生成的代碼。他們必須重用社區(qū)提供的組件。他們必須分享社區(qū)健康的信念 - 無(wú)論是增長(zhǎng)還是大到足以維持現(xiàn)有組件并建立新組件。這使得圍繞語(yǔ)言的社區(qū)成為選擇編程環(huán)境的最重要因素。

三個(gè)定律和秩序

毫無(wú)疑問(wèn),正確性是我們?cè)谲浖械闹饕P(guān)注點(diǎn)。如果一個(gè)軟件無(wú)法正常工作,那就不值得運(yùn)行了。如果它不安全,則存在安全風(fēng)險(xiǎn)。這顯然使我們的第一定律成為正確

但是,有人可能會(huì)爭(zhēng)論可維護(hù)性是否應(yīng)該比效率更重要,反之亦然。當(dāng)完全忽略可維護(hù)性時(shí),程序可能有可能實(shí)現(xiàn)更好的性能,并且僅考慮正確性和可維護(hù)性的編程可能導(dǎo)致程序完全低效。

實(shí)際上,可維護(hù)性和效率是相互交織的:良好的架構(gòu)是圍繞有效的解決方案構(gòu)建的。例如,XI Editor 旨在成為“未來(lái)20年”的高性能編輯器,它是圍繞Rope數(shù)據(jù)結(jié)構(gòu)構(gòu)建的。專門自上而下設(shè)計(jì)系統(tǒng)可能會(huì)妨礙實(shí)現(xiàn)有效的解決方案;?自下而上地設(shè)計(jì)它們可能會(huì)泄漏太多的實(shí)現(xiàn)細(xì)節(jié),并且會(huì)阻止干凈,松散耦合的架構(gòu)。

盡管如此,如果一個(gè)軟件是正確的并且效率極高但無(wú)法維護(hù),那么它只不過(guò)是一個(gè)黑盒子。如果我們無(wú)法理解,我們是否相信它是正確的?反過(guò)來(lái)說(shuō),一個(gè)低效但正確+可維護(hù)的程序可能還是可以挽救的??删S護(hù)性成為第二定律。

定律和語(yǔ)言

信息學(xué)的三個(gè)定律僅涉及程序。然而,編程語(yǔ)言可以提供保證,構(gòu)造,工具,執(zhí)行環(huán)境,社區(qū)或生態(tài)系統(tǒng),幫助開發(fā)人員制定守法程序。讓我們來(lái)看看一些球員。

系統(tǒng)語(yǔ)言

C和C ++共享一些屬性。他們非常適合編寫快速,低占用空間的代碼。手動(dòng)內(nèi)存管理將安全性留給了開發(fā)人員(他們幾乎無(wú)法記住他們離開手機(jī)的位置!)。C就像買個(gè)玩具不給電池一樣還需要自給自足,因此您經(jīng)常最終重寫數(shù)據(jù)結(jié)構(gòu);?C ++是一個(gè)怪物,每個(gè)項(xiàng)目都定義了他們使用或不使用的語(yǔ)言部分(谷歌因不使用例外而聞名)。因?yàn)樗鼈兌疾话踩?,取決于另一個(gè)庫(kù)會(huì)增加安全漏洞的風(fēng)險(xiǎn)。

Go 填補(bǔ)了C ++里能把開發(fā)者嚇跑的 Void類型。它旨在快速并使用例程輕松編寫并發(fā)代碼。它是有筆C ++更安全垃圾收集。它具有簡(jiǎn)單的類型系統(tǒng),缺乏泛型和代數(shù)數(shù)據(jù)類型,不支持現(xiàn)代語(yǔ)言代碼中的重用功能。盡管如此,它仍然擁有一個(gè)非常活躍的社區(qū),可能被Google的光環(huán)所吸引,并追隨著Docker的腳步。

JVM生態(tài)系統(tǒng)

Java是一種相當(dāng)簡(jiǎn)單的常規(guī)語(yǔ)言。在Java中有一個(gè)明確的重用歷史,在整合第三方工件方面可能是冠軍 - 有時(shí)候大型項(xiàng)目看起來(lái)像弗蘭肯斯坦的怪物。Java具有語(yǔ)言和虛擬機(jī)支持的出色工具?,F(xiàn)代JVM可以“及時(shí)”編譯代碼,并將其轉(zhuǎn)換為相當(dāng)高效的本機(jī)代碼。有不同的垃圾收集器提供不同的權(quán)衡。哦,我提到Java社區(qū)是巨大的嗎?

Kotlin試圖通過(guò)減少冗長(zhǎng)和提供更強(qiáng)大的,安全的類型系統(tǒng)來(lái)提供Java“語(yǔ)言”的替代方案。它主要針對(duì)JVM,并且具有與Java相同的優(yōu)點(diǎn)(還有Kotlin / Native)。由JetBrains創(chuàng)建,工具顯然非常出色?,F(xiàn)在官方支持Android開發(fā),它就在這里。

功能編程 - 或FP - 語(yǔ)言

Haskell和OCaml作為研究項(xiàng)目開始了他們的生命,但近年來(lái)在該行業(yè)中越來(lái)越受歡迎。它們是安全的,提供了很好的設(shè)計(jì)原語(yǔ)(特別是類型類和模塊)和編程模型,根據(jù)我的經(jīng)驗(yàn),它可以減少錯(cuò)誤。它們都是垃圾收集的 - GC是為第一種FP語(yǔ)言LISP發(fā)明的。特別是Haskell是完全純粹的,它提供了很多好處:所有效果 - 例如IO? - 都明確表示為類型,這使開發(fā)人員不必?fù)?dān)心意外發(fā)生的副作用,但可能會(huì)變得很麻煩。他們的社區(qū)都包括許多研究人員,幫助建立堅(jiān)實(shí),正式的基礎(chǔ)。

還有更多的語(yǔ)言

我不打算在那里討論所有其他語(yǔ)言。有些人在其生態(tài)系統(tǒng)和社區(qū)中具有非常明顯的優(yōu)勢(shì)?Python擁有出色的數(shù)據(jù)分析生態(tài)系統(tǒng),Erlang幫助構(gòu)建使用actor的容錯(cuò)分布式系統(tǒng),Scala是Kotlin的老兄,更狂野的兄弟,Clojure和Racket是現(xiàn)代Lisps,TypeScript試圖理解JavaScript!

第三定律的覺醒

那里確實(shí)有許多有趣的語(yǔ)言。他們中的大多數(shù)都有自己的優(yōu)勢(shì)和好主意。他們幫助愿意的開發(fā)人員遵循信息學(xué)三法則多少?

可維護(hù)性主要通過(guò)良好的設(shè)計(jì)原語(yǔ)(?語(yǔ)言結(jié)構(gòu)),良好的工具和社區(qū)來(lái)解決。有不同的流派對(duì)什么構(gòu)成一組優(yōu)秀的原語(yǔ)有不同的看法:我個(gè)人贊成用現(xiàn)代的強(qiáng)類型FP語(yǔ)言選擇的那些。

拋開可維護(hù)性,有兩組主流語(yǔ)言:具有手動(dòng)內(nèi)存管理和垃圾收集的語(yǔ)言。由于我們的開發(fā)人員不完善,手動(dòng)內(nèi)存管理也意味著不安全,因此缺乏正確性。垃圾收集雖然產(chǎn)生了管理費(fèi)用,但在過(guò)去25年中一直是新主流語(yǔ)言的事實(shí)上的標(biāo)準(zhǔn),因?yàn)榘踩冉^對(duì)性能更重要。

Rust是第一種提出替代方案的流行語(yǔ)言 - 自動(dòng)內(nèi)存管理和無(wú)垃圾收集的安全性 - 它帶有強(qiáng)大的FP啟發(fā)設(shè)計(jì)原語(yǔ)來(lái)構(gòu)建高級(jí)抽象等等。

如果我們現(xiàn)在可以安全地構(gòu)建更高效的軟件,我們不應(yīng)該嗎?或者我們應(yīng)該優(yōu)化開發(fā)生產(chǎn)力?我們可以兩個(gè)都有嗎?

一個(gè)新的挑戰(zhàn)者

Rust是一種系統(tǒng)編程語(yǔ)言,運(yùn)行速度極快,可以防止段錯(cuò)誤并保證線程安全。(rust-lang.org

Rust現(xiàn)在已經(jīng)存在了一段時(shí)間,但直到2015年Rust 1.0發(fā)布時(shí)才實(shí)驗(yàn)。從那時(shí)起,這個(gè)語(yǔ)言及其生態(tài)系統(tǒng)不斷發(fā)展壯大。雖然多年來(lái)它仍將改進(jìn),但核心團(tuán)隊(duì)承諾不會(huì)破壞用戶代碼。

與Go一樣,Rust旨在為對(duì)系統(tǒng)編程感興趣的開發(fā)人員提供一個(gè)嚴(yán)肅的選擇。然而,它從語(yǔ)言研究和現(xiàn)有編程語(yǔ)言的成功經(jīng)驗(yàn)中借鑒(雙關(guān)語(yǔ))。

Rust有一個(gè)現(xiàn)代類型系統(tǒng),可以自動(dòng)管理內(nèi)存,并且 - 與輕量級(jí)運(yùn)行時(shí)檢查一起 - 確保安全訪問(wèn)它。它具有泛型和接近Haskell類型類的特征系統(tǒng)。這使得Rust能夠稱之為零成本抽象:擁有出色的設(shè)計(jì)不應(yīng)該損害性能。James Munns?關(guān)于嵌入式編程的精彩演講描述了Rust嵌入式工作組如何構(gòu)建一個(gè)可重用的組件,以便在不犧牲執(zhí)行成本的情況下在微小芯片上抽象各種類型的硬件操作。

當(dāng)我深入研究Rust資源時(shí),從偉大的Rust Book開始,并為我可能感興趣的項(xiàng)目探索GitHub,我注意到這種不妥協(xié)的方法對(duì)社區(qū)和生態(tài)系統(tǒng)的影響有多大。Rust開發(fā)人員的目標(biāo)是實(shí)現(xiàn)最佳的運(yùn)行時(shí)效率,最準(zhǔn)確的抽象和最強(qiáng)的執(zhí)行安全性。它使得Rust非常適合低級(jí)編程,但對(duì)于更高級(jí)別的應(yīng)用程序也非常有趣:雖然人們可以在Rust中編寫Linux內(nèi)核模塊,但它也可用于構(gòu)建REST Web應(yīng)用程序,區(qū)塊鏈節(jié)點(diǎn)甚至單頁(yè)Web?WebAssembly中的應(yīng)用程序!讓我們更深入一點(diǎn),看看它有助于寫作守法程序。

正確性

編寫正確的程序很難。我們?cè)噲D完成的任務(wù)往往含糊不清。盡管如此,語(yǔ)言可以通過(guò)足夠的表達(dá)來(lái)幫助,并且不需要程序員艱難的制定他們的問(wèn)題。Rust擁有全套的現(xiàn)代語(yǔ)言結(jié)構(gòu):代數(shù)數(shù)據(jù)類型(此處稱為枚舉),泛型,特征,類型別名,元組等。它還具有強(qiáng)大的元編程系統(tǒng),使用宏可以完成繁重工作,例如生成序列化器,特征實(shí)現(xiàn),或定義嵌入式DSL。同樣,Rust借鑒了它的靈感來(lái)自Scheme及其后代的Racket,后者特別擅長(zhǎng)構(gòu)建DSL--通過(guò)支持衛(wèi)生宏。

正確性的另一部分是沒有未定義的行為,安全問(wèn)題和崩潰風(fēng)險(xiǎn)。Rust通過(guò)使類型系統(tǒng)知道所有權(quán)來(lái)管理沒有垃圾收集器的內(nèi)存。資源擁有由一個(gè)單個(gè)可變結(jié)合和此所有權(quán)可以由變量傳遞給一個(gè)函數(shù)被轉(zhuǎn)移:Rust稱此移動(dòng)的資源(以類似于C ++的感舉動(dòng)語(yǔ)義)。

當(dāng)變量綁定超出其詞法范圍時(shí),它所擁有的資源將被刪除 -?也就是說(shuō),已經(jīng)解除分配(可以通過(guò)將其移動(dòng)到遺忘中來(lái)提前刪除該值)。雖然它們可以證明是“活著的”,但價(jià)值觀可以通過(guò)共享方式不可變地借用,也可以以獨(dú)占方式可變地借用。這與C ++引用類似,但它允許Rust編譯器證明不存在對(duì)給定數(shù)據(jù)結(jié)構(gòu)的共享,可變?cè)L問(wèn),并且開發(fā)人員將不用擔(dān)心一件事。

最后但同樣重要的是,Rust通過(guò)確保不跨線程共享非線程安全值來(lái)保護(hù)開發(fā)人員免受許多并發(fā)問(wèn)題的影響。

在Rust中有很多資源可以理解所有權(quán)和借用,但我會(huì)舉一個(gè)簡(jiǎn)單的例子。請(qǐng)注意,所有權(quán)的復(fù)雜性更多,特別是某些類型可以選擇復(fù)制而不是移動(dòng)。例如,“擁有”一個(gè)整數(shù)是沒有意義的,因?yàn)樗苄?,可以?jiǎn)單地復(fù)制。Rust編譯器也在不斷發(fā)展,變得更加智能,并允許更直觀的代碼。

fnmain() {

let s = "Foo".to_string();

let newS = foo(s);

println!("{}", s);

}

fn foo(s:String) ->String{

let s2 ="Bar".to_string();

println!("{}", s2);

? ? s

}

在上面的代碼片段中,創(chuàng)建了一個(gè)名為s的新String,并將其傳遞給函數(shù)foo。因?yàn)?i>foo接受String而不是String的引用,它獲取其所有權(quán)而不僅僅是借用它:String被移動(dòng)foo。后來(lái),還是在嘗試打印時(shí)小號(hào)的Rust編譯器會(huì)抱怨被綁定的資源已經(jīng)被了移動(dòng),因此不再可用。該程序?qū)o(wú)法編譯。

事實(shí)證明,foo返回一個(gè)未更改的s,但編譯器不知道它,也沒有任何開發(fā)人員只關(guān)注函數(shù),foo的簽名和String的特征。知道這些元數(shù)據(jù)應(yīng)該足以知道foo獲得所有權(quán)并且我們對(duì)該資源的訪問(wèn)權(quán)將丟失。

To make our program compile, we can simply print?newS?instead. Rust even lets us call it?s?again, which is great because?s?was not usable after passing it to?foo?anyway! The following program prints “Bar” then “Foo”.

為了使我們的程序編譯,我們可以簡(jiǎn)單地打印newS。Rust 甚至讓我們?cè)俅握{(diào)用s ,這是偉大的,因?yàn)?i>s是不可使用的當(dāng)把它傳遞給給foo之后!以下程序打印“Bar”,然后打印“Foo”。

fn main() {

? ? let s = "Foo".to_string();

? ? let s = foo(s);

? ? println!("{}", s);

}

fn foo(s: String) -> String {

? ? let s2 = "Bar".to_string();

? ? println!("{}", s2);

? ? s

}


查看foo,它還會(huì)在名為s2的變量下創(chuàng)建另一個(gè)String綁定。當(dāng)它超出范圍時(shí)它將被刪除。到目前為止,這看起來(lái)很像自動(dòng)內(nèi)存管理,用于在C ++中的堆棧上分配的結(jié)構(gòu)或Java中的GC管理的引用句柄。不同的是,資源-如堆?;蚨逊峙涞膬?nèi)存-總是有精確的一個(gè)所有者。

這里,在foo中返回s2而不是s會(huì)將s2移回調(diào)用者,程序?qū)⒋蛴 癇ar”“Bar”。順便說(shuō)一句,如果你想知道為什么在打印println之后s2仍然可用!,這是因?yàn)樗?i>打印出來(lái)!只借了它!最后,(?。┮荒苛巳坏仫@示出?println!?是一個(gè)宏。

最后,沒有理由在這里分配一個(gè)String,因?yàn)椤癋oo”和“Bar”常量已經(jīng)在二進(jìn)制文件中。Rust可以直接指向那里并獲得我們可以借用的“切片”。我們使用一個(gè)名為&str的類型,它可以是借來(lái)的String或切片!

可維護(hù)性

所有權(quán)系統(tǒng)不僅使程序執(zhí)行安全,而且我認(rèn)為它還使代碼更易于維護(hù)和重用。只需瀏覽一個(gè)函數(shù)或一個(gè)詞法范圍,Rust開發(fā)人員就可以確定其變量的屬性。他們可以構(gòu)建API,更準(zhǔn)確地傳達(dá)應(yīng)該如何使用它們,并從類型檢查器中獲取幫助。

讓我舉幾個(gè)例子。在C中,編譯器不知道函數(shù)返回的指針有效多長(zhǎng)時(shí)間。在垃圾收集語(yǔ)言中,您可以存儲(chǔ)函數(shù)返回的任何引用,并防止一個(gè)潛在的大塊內(nèi)存被釋放。許多Java庫(kù)附帶文檔,描述何時(shí)可以安全地調(diào)用哪些方法,對(duì)象將處于有效狀態(tài)多長(zhǎng)時(shí)間,并通過(guò)異常強(qiáng)制執(zhí)行這些規(guī)則或讓您處理未定義行為的后果。當(dāng)涉及多線程時(shí),這變得更加困難。Rust可以返回在編譯時(shí)已知的給定生命周期內(nèi)有效的引用,提供副本或提供您可以隨時(shí)處置的共享引用。

Rust附帶了Cargo,一個(gè)用于構(gòu)建,管理依賴項(xiàng)(稱為Crates),運(yùn)行測(cè)試,修復(fù)警告等的命令行實(shí)用程序。擁有社區(qū)認(rèn)可的構(gòu)建工具意味著可以將重點(diǎn)放在那里。它有助于Cargo的開發(fā)人員做出了很好的選擇,例如支持開箱即用的盒式語(yǔ)言版本控制,使用人類可讀和可編輯的配置格式(TOML),或支持可重復(fù)的構(gòu)建。還有rustfmt,一個(gè)自動(dòng)格式化程序,可以防止浪費(fèi)時(shí)間手動(dòng)格式化源文件,以及關(guān)于制表符vs空格的無(wú)休止的爭(zhēng)論(擾亂警報(bào):請(qǐng)用4個(gè)空格)。

仍然,Rust的工具是一項(xiàng)正在進(jìn)行中的工作。Java有20年的開端,但語(yǔ)言本身非常適合工具。IDE如何支持宏中的DSL?時(shí)間會(huì)證明。有一個(gè)官方語(yǔ)言服務(wù)器,它具有VSCodeEclipse集成。IntelliJ IDEA還有一個(gè)插件。

Rust編譯器由LLVM提供支持,LLVM是一個(gè)具有高效優(yōu)化器的成熟基礎(chǔ)架構(gòu)。它還可以定位WebAssembly,它允許使用Rust編寫Web應(yīng)用程序,并允許在虛擬空間中運(yùn)行不受信任的代碼。

在我看來(lái),Rust的核心開發(fā)人員一直在積極尋找更好的想法,這是對(duì)Sun?長(zhǎng)期以來(lái)指導(dǎo)Java?的“?Not Invented Here?”綜合癥的一個(gè)令人耳目一新的改變。在這些好主意中,Rust的特性和缺乏結(jié)構(gòu)繼承提供了很好的設(shè)計(jì)原語(yǔ),有助于構(gòu)建模塊化和可維護(hù)的系統(tǒng)。

Rust開發(fā)人員在錯(cuò)誤處理方面做了另一個(gè)很好的選擇?Rust具有Result <T,E>類型,其可以是具有成功值的Ok(T)或具有錯(cuò)誤的Err(E)。Haskell程序員將識(shí)別Either類型。使用常規(guī)構(gòu)造處理錯(cuò)誤意味著可以使用所有常用機(jī)制 - 包括模式匹配,將Result作為值傳遞或序列化。

Rust還使用特征來(lái)使代碼更簡(jiǎn)潔。像Java的可迭代和它的foreach循環(huán),或Haskell的的單子符號(hào),Rust擁有健康確實(shí)對(duì)性狀的頂部句法糖這使得它易于構(gòu)建感覺自然類型。

例如,在嘗試使用+操作時(shí)使用Rust的std :: ops :: Add?trait?。運(yùn)算符重載在C ++中總是有不好的壓力,但這也是Python在數(shù)據(jù)分析方面如此強(qiáng)大的一個(gè)重要原因。Numpy的陣列和矩陣方便地支持我們?cè)诩埳鲜褂玫南嗤僮鞣榱朔乐箾_突,Rust僅允許定義特征的模塊或定義目標(biāo)類型的模塊實(shí)現(xiàn)特征。這是一個(gè)自定義Point類型支持求和的簡(jiǎn)單示例。

use std::ops;

#[derive(Debug)]

struct Point(i32, i32);

impl ops::Add<Point> for Point {

? ? type Output = Point;

? ? fn add(self, _rhs: Point) -> Point {

? ? ? ? Point(self.0 + _rhs.0, self.1 + _rhs.1)

? ? }

}

fn main() {

? ? let p1 = Point(5, 6);

? ? println!("p1: {:?}", p1);

? ? let p2 = Point(5, 4);

? ? println!("p2: {:?}", p2);

? ? let p3 = p1 + p2;

? ? println!("p3: {:?}", p3);

}

效率

Rust?速度很快,運(yùn)行速度可與C相媲美。因?yàn)樗鼪]有垃圾收集器,所以沒有隱藏的成本 - 即使沒有暫停,GC代碼也會(huì)在不同的線程中運(yùn)行并消耗資源。

由于注重效率,社區(qū)很容易為所有事情運(yùn)行基準(zhǔn)。由于代碼共享既簡(jiǎn)單又安全,我們可以重用高性能數(shù)據(jù)結(jié)構(gòu)。在最近的博客中,Bryan Cantrill比較了程序的C和Rust版本,并將40%的運(yùn)行時(shí)改進(jìn)歸因于使用BTreeSet,這是Rust標(biāo)準(zhǔn)集合中開箱即用的高效數(shù)據(jù)結(jié)構(gòu)。

Rust允許用戶控制其數(shù)據(jù)結(jié)構(gòu)的內(nèi)存布局,并使間接顯式。這有助于編寫緩存友好的代碼,但也可以與C連接.Rust的FFI與C很簡(jiǎn)單并且沒有開銷,這使得調(diào)用任何系統(tǒng)原語(yǔ)變得容易(但它是不安全的并且應(yīng)該被適當(dāng)?shù)匕b)。這是我們?cè)贘ava中不愿意做的事情,特別是出于穩(wěn)定性原因 - 段錯(cuò)誤會(huì)使JVM崩潰 - 但這可能很有用。例如,最快的?Java Web服務(wù)器之一使用JNI來(lái)調(diào)用Linux的epoll,并且似乎比NIO(Java的標(biāo)準(zhǔn)非阻塞網(wǎng)絡(luò)庫(kù))表現(xiàn)更好。

說(shuō)到這一點(diǎn),如果我們阻止等待IO的線程,那就沒有意義了。Rust帶有零成本期貨,包括非阻塞,背壓流。期貨與異步Result <T,E>非常相似,這使得它們與現(xiàn)有模式非常吻合。

Rust的旗艦非阻塞IO庫(kù)Tokio以未來(lái)為基礎(chǔ),為非阻塞編程提供一致且流暢的抽象。Tokio反過(guò)來(lái)由Web?框架使用的Hyper?HTTP庫(kù)使用。

因?yàn)槠谪浐土麈溄涌赡茏兊萌唛L(zhǎng),所以可以使用async?/?await?來(lái)編寫像慣用的Rust代碼那樣的異步代碼?,F(xiàn)在,await作為宏實(shí)現(xiàn),但它將在以后成為標(biāo)準(zhǔn)的Rust功能!

社區(qū)和生態(tài)系統(tǒng)

人們可以看到Rust社區(qū)多年來(lái)為語(yǔ)言及其生態(tài)系統(tǒng)付出的巨大努力。他們從Rust開始的經(jīng)歷非 常愉快和熱情。我發(fā)現(xiàn)精神動(dòng)畫所謂的Rustaceans邀請(qǐng)和煽動(dòng)。

Rust有官方論壇討論渠道,您可以在那里獲得幫助,并看到核心開發(fā)人員討論技術(shù)問(wèn)題。一切都在公開發(fā)展和辯論,歡迎捐款。

周報(bào)給出了更新和不斷改進(jìn)的情緒。它選出了“本周的板條箱”來(lái)宣傳社區(qū)的努力。它需要在問(wèn)題上尋求幫助,有時(shí)甚至在正式的Rust分發(fā)中。

Rust社區(qū)在GitHub上非?;钴S,并將許多問(wèn)題標(biāo)記為任何想成為貢獻(xiàn)者的“第一個(gè)好問(wèn)題”。事實(shí)上,在Rust中沒有像Apache或Eclipse這樣的開源基礎(chǔ),但是有一個(gè)強(qiáng)大的自由軟件文化。Mozilla贊助了Rust - 許多核心開發(fā)人員都是Mozilla員工 - 但是許多大型項(xiàng)目仍然存在于個(gè)人GitHub帳戶中。

社區(qū)仍然足夠緊密,每個(gè)人都在共同建立一個(gè)完整的生態(tài)系統(tǒng)。為了安全起見,Rust開發(fā)人員基本上重寫了所有內(nèi)容,盡可能地依賴Rust代碼而不是包裝C,C ++或Go庫(kù)。

開發(fā)人員可以將他們的箱子發(fā)布到crates.io。Rust標(biāo)準(zhǔn)庫(kù)非常小,甚至是可選的,并且通過(guò)設(shè)計(jì),大多數(shù)常見功能的開發(fā) - 例如期貨,序列化或日志記錄 - 都發(fā)生在不同的板條箱中。一些板條箱通過(guò)RFC流程標(biāo)準(zhǔn)化。

由于其品質(zhì)和社區(qū),Rust吸引了大量的人才。Rust有一個(gè)很好的?加密?生態(tài)系統(tǒng),用于并發(fā)數(shù)據(jù)并行的庫(kù)。您可能有興趣使用QUIC?這里有一個(gè)圖書館!你在考慮Haskell的Quickcheck嗎?檢查!還是模糊測(cè)試?GTK + UI?沒問(wèn)題!你喜歡GraalVM嗎?Rust有HolyJit!NomPest是兩個(gè)用于解析的庫(kù)。人們?cè)赗ust?寫OpenGL?視頻游戲,其他人寫網(wǎng)絡(luò)服務(wù)或者WebAssembly虛擬機(jī)。

將來(lái)<Rust,_>

Rust通過(guò)實(shí)現(xiàn)零成本抽象并將一套優(yōu)秀的,經(jīng)過(guò)驗(yàn)證的創(chuàng)意與一種免費(fèi)提供內(nèi)存安全性的新方法相結(jié)合,創(chuàng)造了一項(xiàng)新的交易。它通過(guò)允許高級(jí)構(gòu)造重新發(fā)明系統(tǒng)編程,并可靠地提供高級(jí)編程速度和控制。

人們?nèi)匀贿x擇語(yǔ)言和框架,因?yàn)樗鼈兙哂猩a(chǎn)力并且可以保證用于特定目的。如果您想構(gòu)建Web應(yīng)用程序,Ruby on Rail或Java是安全的選擇。

我個(gè)人被Java的整體工程質(zhì)量,工具,生產(chǎn)力和舒適性所破壞。Rust在那里顯然不太成熟,但我會(huì)打賭社區(qū)中的動(dòng)態(tài)行動(dòng),以及更多采用Rust的公司,并幫助使其成為世界一流的編程環(huán)境。

在幾年內(nèi),Rust可能會(huì)提供一個(gè)高效,安全的編程環(huán)境,感覺像Java一樣可靠且無(wú)風(fēng)險(xiǎn)。有趣的部分是到達(dá)那里。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • 今天就忽然想吃辣條,發(fā)現(xiàn)衛(wèi)龍辣條這幾年的價(jià)格呈幾何增長(zhǎng)。 還有,為什么官方都說(shuō)了賣三塊,小超市你還賣三塊五,市場(chǎng)壟...
    荒與凈閱讀 464評(píng)論 0 0
  • 題目:子數(shù)組最大累加和 給定一個(gè)數(shù)組arr,返回子數(shù)組的最大累加和 例如:arr = [1,-2,3,5,-2,6...
    wenyilab閱讀 1,790評(píng)論 1 3
  • 我非常討厭饑餓的感覺。 現(xiàn)在那令人神經(jīng)崩潰的饑餓感又徐徐地襲來(lái)了,我強(qiáng)烈地感受到了。 身旁躺著我的先生,他仿佛也剛...
    htrAE閱讀 383評(píng)論 0 0

友情鏈接更多精彩內(nèi)容