中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

什么是Rust,為什么它如此受歡迎?

發(fā)布于:2021-01-07 10:25:30

0

787

0

Rust 編程 后端

Rust已連續(xù)四年成為Stack Overflow最受歡迎的語言,這表明許多有機會使用Rust的人都愛上了它。但是,大約97%的未使用Rust的調(diào)查對象可能會想,“與Rust有何關系?”

簡短的答案是,Rust解決了許多其他語言中存在的痛點,這為有限的缺點方面邁出了堅實的一步。

我將展示一個示例,介紹Rust為其他編程語言的用戶提供的功能以及當前的生態(tài)系統(tǒng)。在Rust-land上,玫瑰花還不是全部,所以我也談到了缺點。

來自動態(tài)類型的語言

喜歡動態(tài)類型系統(tǒng)還是靜態(tài)類型系統(tǒng)的程序員之間的爭論可能還會持續(xù)數(shù)十年,但是很難爭論靜態(tài)類型的好處。由于人們對當今更大的代碼庫中的動態(tài)鍵入的當前狀態(tài)感到沮喪,因此您只需要查看諸如TypeScript之類的語言或諸如Python的類型提示之類的功能的興起。靜態(tài)類型的語言允許對數(shù)據(jù)及其行為進行編譯器檢查的約束,從而減輕認知開銷和誤解。

這并不是說所有靜態(tài)類型系統(tǒng)都是等效的。許多靜態(tài)類型的語言旁邊都有一個大星號:它們允許使用NULL概念。這意味著任何值都可能是它所說的或什么都沒有,有效地為每種類型創(chuàng)建了第二種可能的類型。與Haskell和其他一些現(xiàn)代編程語言一樣,Rust使用可選類型對這種可能性進行編碼,并且編譯器要求您處理None情況。這可以防止發(fā)生可怕的TypeError:無法讀取null運行時錯誤(或等效語言)的屬性'foo',而是將其提升為可以在用戶看到它之前解決的編譯時錯誤。這是一個向某人打招呼的函數(shù)示例,無論我們是否知道他的名字;如果我們忘記了匹配中的None情況,或者試圖像使用始終存在的String值一樣使用name,則編譯器會抱怨。

fn greet_user(name: Option<String>) {    
    match name {        
        Some(name) => println!("Hello there, {}!", name),   
        None => println!("Well howdy, stranger!"),
    }
}

Rust的靜態(tài)類型盡最大努力擺脫程序員的困擾,同時鼓勵長期的可維護性。 一些靜態(tài)類型的語言給程序員帶來了沉重的負擔,要求他們多次重復變量的類型,這阻礙了可讀性和重構。 其他靜態(tài)類型語言允許整個程序類型推斷。 雖然在初始開發(fā)過程中很方便,但是這會降低編譯器在類型不再匹配時提供有用的錯誤信息的能力。 Rust可以從這兩種樣式中學習,并要求頂層項(如函數(shù)參數(shù)和常量)具有顯式類型,同時允許在函數(shù)體內(nèi)部進行類型推斷。 在此示例中,Rust編譯器可以推斷出double,2和1的類型,因為val參數(shù)和返回類型被聲明為32位帶符號整數(shù)。

fn simple_math(val: i32) -> i32 { 
    let twice = val * 2;
    twice - 1
}

來自垃圾收集語言

使用系統(tǒng)編程語言的最大好處之一就是可以控制低級的細節(jié)。

Rust使您可以選擇將數(shù)據(jù)存儲在堆?;蚨焉希⒃诰幾g時確定何時不再需要內(nèi)存并可以對其進行清理。這樣可以有效利用內(nèi)存,并實現(xiàn)更高性能的內(nèi)存訪問。 Tilde是Skylight產(chǎn)品中Rust的早期生產(chǎn)用戶,他發(fā)現(xiàn)通過在慣用的Rust中重寫某些Java HTTP端點,他們能夠?qū)?nèi)存使用量從5GiB減少到50MiB。當云提供商對增加的內(nèi)存或額外的節(jié)點收取高昂的價格時,這樣的節(jié)省很快就會加起來。

無需連續(xù)運行垃圾收集器,Rust項目非常適合被其他編程語言通過外部功能接口用作庫。這使現(xiàn)有項目可以用快速的Rust代碼替換對性能至關重要的代碼,而不會產(chǎn)生其他系統(tǒng)編程語言固有的內(nèi)存安全風險。某些項目甚至已使用這些技術在Rust中進行了增量重寫。

通過直接訪問硬件和內(nèi)存,Rust是嵌入式和裸機開發(fā)的理想語言。您可以編寫底層代碼,例如操作系統(tǒng)內(nèi)核或微控制器應用程序。在這些特別具有挑戰(zhàn)性的環(huán)境中,Rust的核心類型和功能以及可重用的庫代碼非常出色。

來自其他系統(tǒng)編程語言

對于許多人來說,Rust在很大程度上被視為其他系統(tǒng)編程語言(例如C或C ++)的替代。與這些語言相比,Rust可以提供的最大好處是借閱檢查器。這是編譯器的一部分,負責確保引用不會超出引用的數(shù)據(jù)壽命,并有助于消除由于內(nèi)存不安全而導致的所有類型的錯誤。

與許多現(xiàn)有的系統(tǒng)編程語言不同,Rust不需要您將所有時間都花在細節(jié)上。 Rust力求擁有盡可能多的零成本抽象,這種抽象與等效的手寫代碼具有同等的性能。在此示例中,我們展示了如何使用迭代器(一種主要的Rust抽象)來簡潔地創(chuàng)建一個包含前十個平方數(shù)的向量。

let squares: Vec<_> = (0..10).map(|i| i * i).collect();

當安全的Rust無法表達某些概念時,您可以使用不安全的Rust。這樣可以釋放一些額外的功能,但作為交換,程序員現(xiàn)在有責任確保代碼真正安全。然后,可以將這種不安全的代碼包裝在更高級別的抽象中,以確保對抽象的所有使用都是安全的。

使用不安全的代碼應該是一個經(jīng)過深思熟慮的決定,因為正確使用它需要與負責避免未定義行為的任何其他語言一樣多的思考和關心。最小化不安全代碼是最小化由于內(nèi)存不安全而導致段錯誤和漏洞可能性的最佳方法。

系統(tǒng)編程語言有一個隱含的期望,那就是它們將永遠有效。盡管某些現(xiàn)代開發(fā)并不需要那么長的壽命,但許多企業(yè)希望知道其基本代碼庫可在可預見的將來使用。 Rust意識到了這一點,并圍繞向后兼容性和穩(wěn)定性做出了有意識的設計決策。這是為未來40年設計的語言。

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

Rust的經(jīng)驗比語言規(guī)范和編譯器還重要。創(chuàng)建和維護生產(chǎn)質(zhì)量軟件的許多方面都被視為一流公民??梢酝ㄟ^rustup安裝和管理多個并發(fā)的Rust工具鏈。 Rust安裝隨附Cargo,這是一個命令行工具,用于管理依賴項,運行測試,生成文檔等。由于默認情況下依賴項,測試和文檔可用,因此它們的用法很普遍。 crates.io是用于共享和發(fā)現(xiàn)Rust庫的社區(qū)站點。發(fā)布到crates.io的任何庫都將建立其文檔并在docs.rs上發(fā)布。

除了內(nèi)置工具外,Rust社區(qū)還創(chuàng)建了許多開發(fā)工具。基準測試,模糊測試和基于屬性的測試都可以在項目中輕松訪問和很好地使用。 Clippy提供了額外的編譯器棉絨,而rustfmt提供了自動慣用格式。 IDE支持是健康的,并且每天都在變得越來越強大。

超越技術要點,Rust擁有一個充滿活力的熱情社區(qū)。人們可以通過幾種官方和非官方途徑獲得幫助,例如聊天,用戶論壇,Rust subreddit,當然還有Stack Overflow問題和解答以及聊天室。 Rust擁有一個由出色的審核小組執(zhí)行的行為準則,以確保正式場所受到歡迎,而且大多數(shù)非官方場所也觀察到類似情況。

在離線狀態(tài)下,Rust在全球舉行了多個會議,例如RustConf,Rust Belt Rust,RustFest,Rust Latam,RustCon Asia等。

這并不全是玫瑰

Rust強大的類型系統(tǒng)和對內(nèi)存安全的重視(所有這些工作都是在編譯時強制執(zhí)行的),這意味著在編譯代碼時出現(xiàn)錯誤非常普遍。對于不習慣這種自以為是的編程語言的程序員來說,這可能是一種令人沮喪的感覺。但是,Rust開發(fā)人員花費了大量時間來改進錯誤消息,以確保它們清晰且可操作。閱讀Rust錯誤時,不要讓您的眼睛蒙上眼睛!

聽到某人抱怨自己一直在“與借閱檢查員打架”是很常見的。盡管這些錯誤可能令人沮喪,但重要的是要認識到,所確定的每個位置都有可能以不執(zhí)行相同檢查的語言來引入錯誤和潛在漏洞。

在此示例中,我們創(chuàng)建了一個包含名稱的可變字符串,然后引用該名稱的前三個字節(jié)。盡管該引用非常出色,但我們嘗試通過清除字符串來對其進行突變?,F(xiàn)在無法保證引用指向有效數(shù)據(jù)并對其取消引用可能導致未定義的行為,因此編譯器會阻止我們:

fn no_mutable_aliasing() { 
    let mut name = String::from("Vivian");    
    let nickname = &name[..3];
    name.clear();   
    println!("Hello there, {}!", nickname);
}


error[E0502]: cannot borrow `name` as mutable because it is also borrowed as immutable
 --> a.rs:4:5
  |
3 |     let nickname = &name[..3];
  |                     ---- immutable borrow occurs here
4 |     name.clear();
  |     ^^^^^^^^^^^^ mutable borrow occurs here
5 |     println!("Hello there, {}!", nickname);
  |                                  -------- immutable borrow later used here

For more information about this error, try `rustc --explain E0502`.

有用的是,錯誤消息包含了我們的代碼,并盡最大努力解釋問題,指出確切的位置。

Rust的原型解決方案可能具有挑戰(zhàn)性,因為它具有靜態(tài)類型的性質(zhì),并且因為Rust需要覆蓋100%的條件,而不僅僅是99%。邊緣案例必須具有適用的代碼,即使程序員尚不知道幸福的道路應該做什么。在早期開發(fā)中,這些極端情況通常可以通過使程序崩潰來解決,然后可以在以后添加嚴格的錯誤處理。這與Ruby等語言不同,工作流中的開發(fā)人員經(jīng)常在REPL中試用代碼,然后將其移至原型,而完全不考慮錯誤情況。

Rust仍然是相對較新的,這意味著某些所需的庫可能尚不可用。好處是,有足夠的沃土來開發(fā)這些所需的庫,甚至可能利用相關計算機科學領域的最新發(fā)展。由于具有此功能和Rust的功能,Rust的某些庫(例如正則表達式板條箱)是所有語言中同類產(chǎn)品中最好的。

盡管Rust對穩(wěn)定性和向后兼容性具有堅定的承諾,但這并不意味著該語言已定稿。一個特定的問題可能無法使用語言功能,這將使其表達起來更加簡單,甚至可能表達出來。例如,Rust具有異步期貨已超過三年,但是對語言本身的穩(wěn)定異步/等待支持僅幾個月之久。

Rust編譯器基于LLVM構建,這意味著目標平臺的數(shù)量將小于C或C ++。

來加入我們吧!

無論您現(xiàn)在喜歡哪種編程語言,都一定會對Rust產(chǎn)生興趣或引起您的興趣。這就是為什么我和其他人非常喜歡Rust的原因,還有很多。如果您正在尋找項目中的額外結構,更快或更高效的代碼,或者能夠更快,更安全地編寫高性能代碼的能力,那么現(xiàn)在該看看Rust是否將成為您的下一個最受歡迎的語言!