複製鏈接
請複製以下鏈接發送給好友

Rust語言

鎖定
Rust是一門系統編程語言 [1]  ,專注於安全 [2]  ,尤其是併發安全,支持函數式和命令式以及泛型等編程範式的多範式語言。Rust在語法上和C++類似 [3]  ,設計者想要在保證性能的同時提供更好的內存安全。 Rust最初是由Mozilla研究院的Graydon Hoare設計創造,然後在Dave Herman, Brendan Eich以及很多其他人的貢獻下逐步完善的。 [4]  Rust的設計者們通過在研發Servo網站瀏覽器佈局引擎過程中積累的經驗優化了Rust語言和Rust編譯器 [5] 
Rust編譯器是在MIT License 和 Apache License 2.0雙重協議聲明下的免費開源軟件。 Rust已經連續七年(2016,2017,2018,2019,2020, 2021, 2022)在Stack Overflow開發者調查的“最受喜愛編程語言”評選項目中折取桂冠。 [6-10]  [19-20] 
軟件名稱
Rust
軟件平台
Windows、macOSLinux [11] 
上線時間
2015年5月15日
最近更新時間
2023年2月7日
軟件語言
Rust
開發商
Mozilla 基金會
軟件授權
Mozilla 基金會 [12] 
軟件版本
1.75.0 [13]  [21] 
軟件大小
6 至 8 MB

Rust語言產生背景

Rust語言在2006年作為 Mozilla 員工 Graydon Hoare 的私人項目出現,而 Mozilla 於 2009 年開始贊助這個項目。第一個有版本號的 Rust 編譯器於2012 年 1 月發佈。Rust 1.0 是第一個穩定版本,於 2015年5月15日發佈。 [14] 
“Rust”最初是Mozilla公司的 Graydon Hoare的私人項目。2009年Mozilla開始贊助此項目,並有若干 Mozilla 員工參與 Rust 語言的設計和研發。2013年8月,Graydon Hoare卸任 Rust 技術負責人職位,由Brian Anderson接任。 [15]  2015年5月15日,Rust 1.0版本正式發佈。2017年9月,Brian Anderson離開Mozilla,項目核心團隊由 Aaron Turon和 Niko Matsakis接管共同領導,另外,Aaron Turon是 Mozilla的Rust團隊的負責人。 [16] 
創建這個新語言的目的是為了解決一個頑疾:軟件的演進速度大大低於硬件的演進,軟件在語言級別上無法真正利用多核計算帶來的性能提升。Rust是針對多核體系提出的語言,並且吸收一些其他動態語言的重要特性,比如不需要管理內存,比如不會出現Null指針等等。 [17] 

Rust語言主要功能

Rust致力於成為優雅解決高併發和高安全性系統問題的編程語言 [18]  ,適用於大型場景,即創造維護能夠保持大型系統完整的邊界。這就導致了它強調安全,內存佈局控制和併發的特點。標準Rust性能與標準C++性能不相上下。

Rust語言語言特點

Rust語言語言語法

Rust的具體語法和C,C++類似,都是由花括號限定代碼塊,還有一樣的控制流關鍵字,例如if,else,while,和for。然而也並非所有的C或者C++關鍵字被實現了。某些Rust函數(比如關鍵字match用於模式匹配)對於那些精通這些語言的人就沒那麼熟悉了。儘管與C/C++極其相似,Rust在深層語法上跟元語言家族的語言像是Haskell更接近。基本上一個函數體的每個部分都是表達式,甚至是控制流操作符。例如,那個普通的if表達式也取代了C的三元表達式。一個函數不需要以return表達式結束,在這種情況下函數最後的表達式就是返回值

Rust語言內存安全

Rust語言系統設計於保證內存安全,它在安全代碼裏不允許空指針,懸垂指針和數據競爭。數值只能用一系列固定形式來初始化,要求所有輸入已經被初始化。在其它語言中複製函數指針或者有效或者為空,比如在鏈表二叉樹數據結構中,Rust核心庫提供Option類型,用來測試指針是否有值。Rust同時引入添加語法來管理生命週期,而且編譯器通過租借檢查器來説明相關理由。

Rust語言內存管理

Rust不像Go,Java以及.NET Framework那樣使用自動垃圾回收系統。不同的是Rust通過RAII來管理內存和資源,還可選引用計數。Rust以低開銷提供資源確定性管理。Rust也支持值的棧分配並不表現暗箱。
Rust裏也有引用概念(用&符號),不包含運行時引用計數。使得此類指針的安全性已獲得租用檢查器的編譯時驗證,阻止懸垂指針和其它形式的未定義行為

Rust語言所有權

Rust有一個所有權系統,所有的值都有一個唯一的屬主,值的有效範圍跟屬主的有效範圍一樣。值可以通過不可變引用&T傳遞,可變引用&mut T傳遞,T值遞。在任何時候,或者有多個不可變引用,或者只有一個可變引用。Rust編譯器在編譯時執行這些規則同時檢查所有引用的有效性

Rust語言類型多態

Rust的類型系統支持一種類似類型類的機制,叫“traits”,是被Haskell激發靈感的。這是一種用於特定同質法的設施,通過給類型變量聲明添加約束來實現。其它來自Haskell的特性,如更高類型多態還沒有支持。
Rust為以let關鍵字聲明的變量而產生類型推導特性。這樣的變量不需要賦初值來判斷類型。如果某個分支代碼沒能給變量賦初值將會產生一個編譯時錯誤。對變量進行多次賦值要使用mut關鍵字標記。
函數可以接收泛型參數,但通常要求泛型實現某種特性或者幾種特性。在這種函數里面,這種泛型值只能通過這些特性來使用。這就是説一個泛型函數在定義的時候就能完成類型檢查。這是對標C++模板,那種本質鴨式,只能在以具體類型實例化後完成檢查。C++概念解決同樣的問題,並且有希望能成為C++20標準的一部分。
然而,Rust泛型的實現與C++模板的典型實現類似:每次實例化都會生成一份單獨的代碼這被稱作單態,和經常在Java和Haskell中使用的類型擦除方案類比。單態的好處是為每一個具體用例提供優化代碼,缺點是增長了運行時和很多結果文件。
Rust裏面的對象系統是基於實現,特性和結構化類型的。實現扮演的角色跟其它語言中的類相似,以關鍵字impl來定義。繼承和多態是由特性提供;它們允許方法被定義或者混合在實現裏面。結構類型用於定義字段。實現和特性自己無法定義字段,而且只有特性能夠提供繼承。至於其它好處,這個阻止了多繼承中的菱形繼承問題,像C++一樣。換句話説,Rust支持接口繼承,但是通過複合替代實現繼承;參見繼承複合。

Rust語言版本記錄

Mozilla在2014年10月宣佈發佈Rust編譯器和工具的0.12版。
0.12版有1900多項變化和bug修正,其中主要包括:重寫了入門文檔(現在叫Rust Guide);繼續提高了包管理器Cargo等。
在2015年1月,發佈了Rust-1.0.0-alpha版本。
2015年5月15日,Rust編程語言核心團隊正式宣佈發佈Rust 1.0版本。
2015年6月25日,Rust發佈了1.1版本。同時發佈1.2測試版本
2016年11月14日,Rust發佈了1.13版本,同時發佈1.14測試版本。
2018年1月4日,Rust發佈1.23版本
2018年9月25日,Rust發佈1.29.1版本
2020年6月18日,Rust發佈1.44.1版本
2021年9月9日,Rust發佈 1.55.0 版本
2023年12月28日,Rust發佈 1.75.0 版本 [21] 
Rust 1.1 穩定版
編譯速度相對於1.0版本提升了32%。
編譯器提示信息更加完善,參數--explain可提供更多編譯錯誤類型的詳解
模塊std::fs中新增了一批穩定版API
初步支持靜態鏈接C運行庫MUSL,Linux環境下編譯出的程序可實現零依賴(可以不再依賴glibc
Cargo增加新命令cargo rustc,支持向rustc傳遞任意參數
Rust 1.2 測試版
編譯速度在1.1版本的基礎上再提升30%
並行編譯又能用了,默認未開啓,如果開啓,還能提升33%的編譯速度(數據來自4核編譯rustc)
Cargo性能提升(編譯Servo時啓動速度提升10倍),可在多個package之間共享依賴包緩存
初步支持MSVC(Microsoft Visual C),以後Windows環境中不需要MinGW/MySYS/GCC了
Rust 1.2 穩定版 將在六週之後發佈,屆時還將一併發佈 1.3 測試版
Rust 1.13
新的運算符,Rust已經獲得了一個新的運算符,通過減少所涉及的視覺污染,能更好的處理錯誤。
穩定語句上的屬性
修復空元組 structs/variants #[derive]
修復 'if' 條件的生存期規則
避免加載和解析未配置的非內聯模塊

Rust語言代碼示例

fn main() {
    let greetings = ["Hello", "Hola", "Bonjour",
                     "Ciao", "こんにちは", "안녕하세요",
                     "Cześć", "Olá", "Здравствуйте",
                     "Chào bạn", "您好"];

    for (num, greeting) in greetings.iter().enumerate() {
        print!("{} : ", greeting);
        match num {
            0 =>  println!("This code is editable and runnable!"),
            1 =>  println!("¡Este código es editable y ejecutable!"),
            2 =>  println!("Ce code est modifiable et exécutable !"),
            3 =>  println!("Questo codice è modificabile ed eseguibile!"),
            4 =>  println!("このコードは編集して実行出來ます!"),
            5 =>  println!("여기에서 코드를 수정하고 실행할 수 있습니다!"),
            6 =>  println!("Ten kod można edytować oraz uruchomić!"),
            7 =>  println!("Esse código é editável e executável!"),
            8 =>  println!("Этот код можно отредактировать и запустить!"),
            9 =>  println!("Bạn có thể edit và run code trực tiếp!"),
            10 => println!("這段代碼是可以編輯並且能夠運行的!"),
            _ =>  {},
        }
    }
}

參考資料
展開全部 收起