産生背景
Rust語言在2006年作為 Mozilla 員工 Graydon Hoare 的私人項目出現,而 Mozilla 于 2009 年開始贊助這個項目。第一個有版本号的 Rust 編譯器于2012 年 1 月發布。Rust 1.0 是第一個穩定版本,于 2015年5月15日發布。“Rust”最初是Mozilla公司的 Graydon Hoare的私人項目。2009年Mozilla開始贊助此項目,并有若幹 Mozilla 員工參與 Rust 語言的設計和研發。2013年8月,Graydon Hoare卸任 Rust 技術負責人職位,由Brian Anderson接任。2015年5月15日,Rust 1.0版本正式發布。2017年9月,Brian Anderson離開Mozilla,項目核心團隊由 Aaron Turon和 Niko Matsakis接管共同領導,另外,Aaron Turon是 Mozilla的Rust團隊的負責人。創建這個新語言的目的是為了解決一個頑疾:軟件的演進速度大大低于硬件的演進,軟件在語言級别上無法真正利用多核計算帶來的性能提升。Rust是針對多核體系提出的語言,并且吸收一些其他動态語言的重要特性,比如不需要管理内存,比如不會出現Null指針等等。
主要功能
Rust緻力于成為優雅解決高并發和高安全性系統問題的編程語言,适用于大型場景,即創造維護能夠保持大型系統完整的邊界。這就導緻了它強調安全,内存布局控制和并發的特點。标準Rust性能與标準C++性能不相上下。
語言特點
語言語法
Rust的具體語法和C,C++類似,都是由花括号限定代碼塊,還有一樣的控制流關鍵字,例如if,else,while,和for。然而也并非所有的C或者C++關鍵字被實現了。某些Rust函數(比如關鍵字match用于模式匹配)對于那些精通這些語言的人就沒那麼熟悉了。盡管與C/C++極其相似,Rust在深層語法上跟元語言家族的語言像是Haskell更接近。基本上一個函數體的每個部分都是表達式,甚至是控制流操作符。例如,那個普通的if表達式也取代了C的三元表達式。一個函數不需要以return表達式結束,在這種情況下函數最後的表達式就是返回值。
内存安全
Rust語言系統設計于保證内存安全,它在安全代碼裡不允許空指針,懸垂指針和數據競争。數值隻能用一系列固定形式來初始化,要求所有輸入已經被初始化。在其它語言中複制函數指針或者有效或者為空,比如在鍊表和二叉樹等數據結構中,Rust核心庫提供Option類型,用來測試指針是否有值。Rust同時引入添加語法來管理生命周期,而且編譯器通過租借檢查器來說明相關理由。
内存管理
Rust不像Go,Java以及.NET Framework那樣使用自動垃圾回收系統。不同的是Rust通過RAII來管理内存和資源,還可選引用計數。Rust以低開銷提供資源确定性管理。Rust也支持值的棧分配并不表現暗箱。
Rust裡也有引用概念(用&符号),不包含運行時引用計數。使得此類指針的安全性已獲得租用檢查器的編譯時驗證,阻止懸垂指針和其它形式的未定義行為。
所有權
Rust有一個所有權系統,所有的值都有一個唯一的屬主,值的有效範圍跟屬主的有效範圍一樣。值可以通過不可變引用&T傳遞,可變引用&mut T傳遞,T值遞。在任何時候,或者有多個不可變引用,或者隻有一個可變引用。Rust編譯器在編譯時執行這些規則同時檢查所有引用的有效性。
類型多态
Rust的類型系統支持一種類似類型類的機制,叫“traits”,是被Haskell激發靈感的。這是一種用于特定同質法的設施,通過給類型變量聲明添加約束來實現。其它來自Haskell的特性,如更高類型多态還沒有支持。
Rust為以let關鍵字聲明的變量而産生類型推導特性。這樣的變量不需要賦初值來判斷類型。如果某個分支代碼沒能給變量賦初值将會産生一個編譯時錯誤。對變量進行多次賦值要使用mut關鍵字标記。
函數可以接收泛型參數,但通常要求泛型實現某種特性或者幾種特性。在這種函數裡面,這種泛型值隻能通過這些特性來使用。這就是說一個泛型函數在定義的時候就能完成類型檢查。這是對标C++模闆,那種本質鴨式,隻能在以具體類型實例化後完成檢查。C++概念解決同樣的問題,并且有希望能成為C++20标準的一部分。
然而,Rust泛型的實現與C++模闆的典型實現類似:每次實例化都會生成一份單獨的代碼這被稱作單态,和經常在Java和Haskell中使用的類型擦除方案類比。單态的好處是為每一個具體用例提供優化代碼,缺點是增長了運行時和很多結果文件。
Rust裡面的對象系統是基于實現,特性和結構化類型的。實現扮演的角色跟其它語言中的類相似,以關鍵字impl來定義。繼承和多态是由特性提供;它們允許方法被定義或者混合在實現裡面。結構類型用于定義字段。實現和特性自己無法定義字段,而且隻有特性能夠提供繼承。至于其它好處,這個阻止了多繼承中的菱形繼承問題,像C++一樣。換句話說,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
初步支持靜态鍊接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]
Fix 'if' 條件的生存期規則
避免加載和解析未配置的非内聯模塊
代碼示例



















