-
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語言產生背景
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有一個所有權系統,所有的值都有一個唯一的屬主,值的有效範圍跟屬主的有效範圍一樣。值可以通過不可變引用&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 版本
Rust 1.1 穩定版
編譯速度相對於1.0版本提升了32%。
編譯器提示信息更加完善,參數--explain可提供更多編譯錯誤類型的詳解
模塊std::fs中新增了一批穩定版API
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
穩定語句上的屬性
修復空元組 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!("這段代碼是可以編輯並且能夠運行的!"), _ => {}, } } }
- 參考資料
-
- 1. Rust is a systems programming language .Rust[引用日期2018-11-29]
- 2. Rust is mostly safety .Dreamwidth[引用日期2018-11-29]
- 3. Rust vs. C++ Comparison .Apriorit[引用日期2018-11-29]
- 4. The Rust Language .Lambda the Ultimate[引用日期2018-11-29]
- 5. Samsung teams up with Mozilla to build browser engine for multicore machines .arstechnica[引用日期2018-11-29]
- 6. Developer Survey Results 2016 .stackoverflow[引用日期2018-11-29]
- 7. Developer Survey Results 2017 .Stack Overflow[引用日期2018-11-29]
- 8. Developer Survey Results 2018 .Stack Overflow[引用日期2018-11-29]
- 9. Developer Survey Results 2019 .Stack Overflow[引用日期2019-04-12]
- 10. Developer Survey Results 2020 .stackoverflow[引用日期2021-02-21]
- 11. 安裝 Rust .Rust官方.2020-01-05[引用日期2021-01-21]
- 12. 媒體使用手冊 .Rust官方.2020-01-05[引用日期2021-01-21]
- 13. Announcing Rust 1.63.0 .Rust官方.2022-08-11[引用日期2022-08-12]
- 14. 中文官方網站 .Rust程序設計語言[引用日期2017-09-29]
- 15. Changing roles .rust-dev 郵件列表.2013-08-30[引用日期2018-07-01]
- 16. Farewell, Rust .Rust Internals.2017-08-18[引用日期2018-07-01]
- 17. Rust 0.10 Released .mozilla官網[引用日期2014-04-04]
- 18. Interview on Rust, a Systems Programming Language Developed by Mozilla .infoq[引用日期2018-11-30]
- 19. Stack Overflow Developer Survey 2021 .stackoverflow[引用日期2022-08-12]
- 20. Stack Overflow Developer Survey 2022 .stackoverflow[引用日期2022-08-12]
- 21. Announcing Rust 1.75.0 | Rust Blog .Rust blog.2023-12-28[引用日期2024-01-02]
- 收起