「Rust語言」以為你喜歡Python?等到你遇見Rust

2021-01-07 騰訊網

一個小眾現象是如何連續五年成為StackOverflow最受歡迎的語言的

有時候舊東西比你想像的更有價值。

來自過去的技術來拯救未來。這就是《Rust》的創造者格雷頓·霍爾(Graydon Hoare)所說的他想要實現的目標。

這是Rust的關鍵特徵之一:使用學術界眾所周知但很少在當代程式語言中實現的技術。老舊、可靠、有時被遺忘的技術。但最重要的是,它運行得非常好。

這些技術主要用於一件事:安全。

聽起來無聊嗎?如果你問社區裡的人,答案是否定的。根據今年的StackOverflow開發人員調查,高達86.1%的Rust開發人員最喜歡這門語言,使它成為自2016年以來最受歡迎的語言。

你可能會認為軟體開發人員是這個星球上最具創新精神的人。然而,Rust與「快速行動,打破常規」的咒語正好相反。儘管如此,Rust開發人員幾乎可以保證學習他們以前從未聽說過的概念。

從一些開發人員使用代數數據類型進行系統編程的新奇性,到Rust自己的內存安全方法:每個開發人員都可以找到一些新的、非常有用的東西來學習。還有更多的理由愛上Rust。

無需垃圾收集,更安全的內存

每一種程式語言都面臨著一個挑戰,即以一種安全有效的方式管理計算機的內存。例如,Python有一個垃圾收集器,它會在程序運行時不斷查找不再使用的內存並清理它。

在其他語言中,如C和c++,程式設計師必須顯式地分配和釋放內存。由於所有與內存相關的問題都在程序運行之前被清除,因此這種方法對於優化性能更好。

另一方面,內存是開發人員需要一直考慮的另一件事。這就是為什麼用C編寫程序比用Python要花更長的時間的原因之一,即使它在一天結束時做的事情是一樣的。

Rust採用另一種方式:在編譯時通過所有權系統分配內存。這是一種巧妙的技巧,可以確保清理未使用的數據,而不必強迫程式設計師一直考慮分配和釋放內存。

Rust使用舊的技術進行有效的內存管理

基本上,所有權是三個規則的集合:

Rust中的每個值都有一個名為owner的變量。

一次只能有一個所有者。

當所有者超出作用域時,值將被刪除,從而釋放內存。

一個簡單的例子是在Rust中賦值一個vector:

fn main() {

let a = vec![1, 2, 3];

let b = a;

println!("a: {:?}", b);

}

在第二行中,創建所有者為a的向量[1,2,3]。之後,b成為向量的所有者。因為在print語句中調用了正確的所有者,這個程序在執行時編譯並返回預期的結果:

a: [1, 2, 3]

另一方面,你可以嘗試調用vector和它之前的所有者a,就像這樣:

fn main() {

let a = vec![1, 2, 3];

let b = a;

println!("a: {:?}", b, a);

}

在這種情況下,編譯器拋出一個錯誤,因為在第三行中已經刪除了a。這個主題有更多的深度,但這是基本的思想。

相比之下,Python會在第二種情況下運行。它的垃圾收集器只會在最後一次調用它之後才丟棄,這對開發人員來說很好,但在內存空間方面就不太好了。

在C中,事情會稍微複雜一些:您必須為a分配內存空間,然後將其指向vector,然後為b分配更多的內存空間,將b指向a,最後在您完成時釋放a和b佔用的空間。

從這個意義上說,Rust到內存的方法是開發速度和性能之間的妥協。雖然它不像Python那麼容易編寫,但是一旦您理解了所有權的概念,它就不會像C那樣笨拙。

另一方面,效率是相當驚人的:例如,開發團隊Tilde在Rust中重寫了一些JavaHTTP片段後,設法減少了90%的內存使用。

誰說Rust不能吸引人?

靜態類型而不太難看

這幾乎是動態類型和靜態類型愛好者之間的一場宗教戰爭。雖然用具有動態類型的語言編寫軟體要容易得多,但代碼可能很快變得難以維護。這就是為什麼Python代碼比C代碼更難維護的原因之一。

另一方面,必須聲明每個變量的類型C-style會非常煩人。如果你曾經嘗試在返回C浮點類型的函數中使用double,你就會明白我的意思。

Rust走了一條中間的路:它是一個靜態類型系統,但它只需要程式設計師指定頂級類型,如函數參數和常量。在函數體內部,允許使用python風格的類型推斷。

Rust的一個特別有用的特性是,它也沒有任何類型。這允許您在編譯時處理異常,從而保證程序在最終用戶中平穩運行。考慮這個例子,我們可以得到一個人的全名,不管他是否有中間名:

fn get_full_name(fname: &str, mname: Option, lname: &str) -> String {

match mname {

Some(n) => format!("{} {} {}", fname, n, lname),

None => format!("{} {}", fname, lname),

}

}

fn main() {

println!("{}", get_full_name("Ronald", None, "McDonald"));

println!("{}", get_full_name("Dwight", Some("P."), "Eisenhower"));

}

雖然在其他語言中也有None的版本,但它以一種簡潔的方式展示了Rust的雄心:在保持代碼儘可能持久和可維護性的同時,不讓編寫變得過於困難。

一種極好的系統編程方法

雖然Python是一種通用程式語言,但Rust像C一樣,是用於系統編程的。雖然Rust不是為最終用戶製作應用程式的理想語言,但它非常適合構建為其他軟體提供服務的軟體。

因此,效率是Rust的核心。最好的例子是零成本抽象,它解釋代碼的同時將內存使用保持在最低限度。正如c++的發明者Bjarne Stroustrup所說:「不用的東西,不用付錢。」而且:你所使用的,你不能再更好的手動代碼。」

例如,考慮在Python中把不超過1000的所有整數相加:

sum(range(1000))

這在每次代碼運行時都要進行1000次迭代和添加—您可以想像這會使代碼變慢多少。相比之下,在Rust方面考慮同樣的事情:

(0..1000).sum()

這個編譯成常數499500。實際上,內存使用量已經減少了1 / 1000。

雖然這些抽象在C語言中也存在,但是Rust大量地使用了它們——事實上,一個目標就是在語言中添加儘可能多的零成本抽象。在這個意義上,Rust有點像下一個級別的C。

C已經存在了40多年,Rust的目標也是如此。Rust非常強調向後兼容,所以今天您仍然可以在Rust 1.0中運行代碼。同樣地,如果您今天編寫Rust代碼,您應該仍然能夠在二十年後運行它。Rust不會生鏽!

一個小而不可思議的社區

它強調安全性和可持續性,所有漂亮的細節都說明了這一點,也難怪Dropbox在《Rust》中重寫了許多核心結構。Rust的第一個大讚助商Mozilla在其中編寫了Firefox的重要部分。微軟認為C和c++對於關鍵任務軟體不再安全,並在Rust問題上投入了越來越多的資金。

不僅是大公司,對Rust的熱愛也影響到個人程式設計師。儘管到目前為止StackOverflow的調查對象中只有5%的人使用Rust,但這些開發人員對該語言非常有熱情。

這是有原因的。不僅語言規範和編譯器是經過深思熟慮的。有rustup安裝和管理工具鏈。還有Cargo,這是一個命令行工具,它隨Rust安裝而來,幫助管理依賴關係、運行測試和生成文檔。

板條箱。用戶可以共享和發現庫和文檔。在rs中記錄它們。有來自Clippy的編譯器lints和來自rustfmt的自動格式化。

除此之外,還有官方和非官方的聊天、看板、用戶論壇、StackOverflow問題和世界各地的會議。在一個把友善看得高於一切的社區裡,還有什麼更好的要求嗎?

缺點:在你會走路之前,你需要先跑

關於Rust的一個令人沮喪的事情是高昂的啟動成本。雖然在大多數語言中,你需要一到兩天的時間來學習,但這更像是一到兩周的「Rust」。

這是因為有許多其他語言沒有使用的新概念,而且在編譯時通常會有很多錯誤。您需要在第一天就處理所有異常,不能像在Python中那樣編寫一個臨時代碼來運行並在以後添加異常。

此外,由於Rust仍然是相當新的,並不是所有您可能需要的庫都在那裡。除了官方文檔和StackOverflow上的各種問題,也沒有那麼多的教程。

好消息是,一旦你掌握了這些概念並編譯了你的程序,它就會像魔法一樣運行。另外,考慮到向後兼容性,它應該在20年內仍然可以工作。

考慮到您的代碼的可持續性,以及Rust是由許多大公司支持的事實,一到兩周的預先學習可能是值得的,儘管有缺點。

This type of Rust won’t make your ship sink.

底線是:無所畏懼地進行攻擊

Rust不僅僅是安全。但難以否認的是,它的許多核心概念旨在消除內存洩漏和其他安全問題。在一個軟體就是一切的時代,安全是必須的。

可能每一種即將到來的語言都有其發展空間:Go越來越多地填充Python和Java的空間,Julia在數據科學領域追逐Python,而Rust則在Python和c++的領域中成長。Rust的特別之處在於它令人難以置信的社區,它的創新特性,以及它被設計用於未來幾十年的事實。

還有很多工作要做,其中只有一小部分可以而且將會生鏽。今天的新語言有很大的機會堅持一段時間,即使其他語言也會在未來幾年出現。但如果我必須把名片放在一種語言上,Rust將是一個安全的賭注。

相關焦點

  • Rust 語言新人入門指南
    如果你抱著之前 1 天上手 Python, 2 天入門 Go 的經驗和優越感來學習 Rust 的話,你可能會遭遇嚴重的失敗感。如果你來自 Haskell/Ocaml 等函數式語言社區,你會有相當的親切感。對於有豐富 C++ 開發經驗的同學來說,上手可能相對比較容易。
  • Rust 語言常用技巧匯集
    Rust是一種全新系統程式語言,Rust語言立足於編譯時安全,由於沒有其他語言GC附帶,Rust也是一門高性能語言,性能堪比C。最近幾年內,Rust被開發人員廣為採納,是好多年年度最受歡迎語言和開發者最想學習的語言。Rust是最有前途可以替代C/C++的語言之一。
  • 【Rust日報】 2019-08-28:Rust異步代碼的優勢:相比於其他語言更加容易調試
    Part I: https://medium.com/dwelo-r-d/using-c-libraries-in-rust-13961948c72a Part II:https://medium.com/dwelo-r-d/wrapping-unsafe-c-libraries-in-rust-d75aeb283c65使用async/await構建高性能TCP客戶端#async
  • Rust 語言入門
    最近的一項 Stack Overflow 調查 發現,近 80% 的受訪者都喜歡或希望使用 Rust 語言進行開發。這個數字令人難以置信!那麼 Rust 有什麼益處呢?本文探討這種類似 C 的語言的精彩亮點,演示為什麼它應該是您要學習的下一種語言。Rust 及其家譜首先,讓我們快速了解一下它的發展歷史。
  • 【Rust日報】 Rust 2021-穩定性
    文章連結,https://jackh726.github.io/rust/2020/10/01/rust-2021.htmlRust如何使我們監控30k/min的API調用在Bearer,我們是一個多語言的工程師團隊。無論是交流的語言,還是變成的語言。我們的技術棧是由Node.js,Ruby,Elixir,以及我們代理庫支持的所有語言之外的其他語言寫的服務組成。
  • 【Rust blog】細說Rust錯誤處理
    對比語言處理錯誤說到unwrap(),我們不得不提到rust的錯誤處理,unwrap() 和Rust的錯誤處理是密不可分的。下面我們就對比兩種語言說說之間區別:golang採用多返回值方式,我們在拿到目標結果時(上面是指文件內容file),需要首先對err判斷是否為nil,並且我們在return時,需要給多返回值分別賦值,調用時要對 if err!=nil做結果判斷。Rust中採用Result的枚舉對象做結果返回。枚舉的好處是:多選一。
  • 為什麼選擇Rust?
    Rust的方式「Rust作為一種程式語言」的不同之處,不是因為它的花哨語法或受歡迎的社區,而是因為人們在使用它編寫程序時能獲得信心。Rust非常嚴格並且追究細節的編譯器會檢查你使用的每個變量和引用的每個內存地址。它可能看起來會妨礙你編寫高效且富有表現力的代碼,但令人驚訝的是,恰恰相反:編寫一個有效且地道的Rust程序實際上比編寫一個有潛在危險的程序更容易。
  • 【Rust日報】 2019-11-15 RustyBox 一個完全用rust重寫的 BusyBox
    RustyBox 一個完全用rust重寫的 BusyBox真的是很猛busybox是linux開發者最常用的一套cmd
  • Rust belt?
    They have been abandoned for so long that the conveyor belts have begun to gather rust – or become rusty.
  • VS Code 搭建 Rust 開發環境
    VS Code 安裝 Rust 插件打開 vs code 找到插件工具欄單擊打開並在搜索欄輸入 「rust」 搜索 Rust 插件上面你看到的圖片是我的電腦已經安裝過了,第一次安裝點擊右邊的 install 安裝。
  • Rust Cookbook 中文版 - Rust 生態中使用各類 crate 來完成編程任務的良好實踐
    《Rust Cookbook 中文版》是 Rust 程序設計語言(Rust 2018 簡體中文版文檔)的簡要實例示例集合:展示了在
  • 在Rust 代碼中編寫 Python 是種怎樣的體驗?
    預覽如果不熟悉inline-python類庫,你可以執行以下操作:fn main() {let who = "world";let n = 5; python!{for i in range('n): print(i, "Hello", 'who)print("Goodbye") }}它允許你將Python代碼直接嵌入Rust代碼行之間,甚至直接在Python代碼中使用Rust
  • 【Rust日報】2020-08-15 Rust Nightly 標準庫文檔已涵蓋了每個關鍵字
    詳細可查看這三個連結:標準庫:https://doc.rust-lang.org/stable/std/#keywordsunsafe 關鍵字:https://github.com/rust-lang/rust/pull/73943原始類型關鍵字:https://github.com/rust-lang/rust/issues/34601學習Rust,沮喪?
  • 腐蝕rust閃退怎麼辦 腐蝕rust程序退出解決方法
    很多玩家在進入腐蝕rust 解決方法 我用的是win10系統 打開任務管理器,在進程裡找到mycolor2 滑鼠右鍵 結束任務再登錄rust 成功解決!
  • 【Rust日報】2020-09-25 構建一個Rust運行時反射系統(第一篇)
    構建一個Rust運行時反射系統(第一篇)作者的公司在做一款叫oso的產品,旨在通過提供一門叫Polar的申明式語言,
  • Rust search extension 0.7 發布!快速搜索 Rust 文檔、屬性和庫的...
    Reddit帖子:Announcing rust-search-extension v0.7! Search std docs, crates, error codes, and attributes in your address bar instantly!
  • 學術界開始從Python轉向Rust
    使用一個名為 Clippy 的第三方插件還可以標記常見錯誤和不建議使用的 Rust 代碼,Patro 非常喜歡該工具。構建Rust應用下面介紹如何創建一個GenBank文件閱讀器,以便你進一步了解Rust的特性•從www.rust-lang.org/learn/get-started下載安裝Rus•到https://github.com/jperkel/gb_read克隆GitHub上的代•執行『cargo run』命令下載外部依賴項並構建應用程式
  • 【Rust每周閱讀】2019-12-28
    v=TF-tXDRAEmg&feature=youtu.beCloser Scrutiny of Rust Collectionshttps://blog.knoldus.com/closer-scrutiny-of-rust-collections/Getting Hands-On with Wasm
  • Rust 中對結構化數據編碼解碼 - Rust 實踐指南
    (package_info["package"]["name"].as_str(), Some("your_package")); Ok(())}因公眾號篇幅和體驗限制,以小端模式(低位模式)字節順序讀寫整數等實例請點擊底部「閱讀原文」,或者訪問 https://rust-cookbook.budshome.com,按照左側導航閱讀
  • 2020 年 6 月程式語言排行榜,Rust 第一次進入榜單前 20.
    TIOBE 2020 年 6 月份的程式語言排行榜已經公布。Rust 之前排名約在 30 位左右,5 月份開始上升到第 21 位,本月直接進入了榜單前 20,這也是它首次進入榜單前 20。在上周 Stack Overflow 公布了 2020 開發者調查報告中,Rust 在開發者最喜愛的程式語言中排行榜首:Rust 相關學習資料:https://www.runoob.com/rust/rust-tutorial.html6 月份跟 5 月份比較沒有很大的變化,C 語言本月還是排在第一,R 語言從第 10 位上升到第 9 位,與 SQL 對調了位置。