Rust語言

Rust語言

Rust是一門系統程式語言,專注於安全,尤其是並發安全,支持函式式和命令式以及泛型等編程範式的多範式語言。Rust在語法上和C++類似,但是設計者想要在保證性能的同時提供更好的記憶體安全。 Rust最初是由Mozilla研究院的Graydon Hoare設計創造,然後在Dave Herman, Brendan Eich以及很多其他人的貢獻下逐步完善的。Rust的設計者們通過在研發Servo網站瀏覽器布局引擎過程中積累的經驗最佳化了Rust語言和Rust編譯器。

Rust編譯器是在MIT License 和 Apache License 2.0雙重協定聲明下的免費開源軟體。 Rust已經連續三年(2016,2017,2018)在Stack Overflow開發者調查的“最受喜愛程式語言”評選項目中折取桂冠。

基本介紹

  • 中文名:Rust語言
  • 外文名:The Rust Programming Language
  • 性質:注重安全、性能和並發性
  • 開發者:Mozilla
  • 最新版本:2019年1月17日  1.32.0
設計特色,標準Rust性能,語法,記憶體安全,記憶體管理,所有權,類型和多態,創建目的,創始人及項目負責人,最新版本說明,Rust 1.1 穩定版 更新內容,Rust 1.2 測試版 更新內容,Rust 1.13 stable 部分更新內容:,歷史簡介,代碼示例,

設計特色

Rust致力於成為優雅解決高並發和高安全性系統問題的程式語言,適用於大型場景,即創造維護能夠保持大型系統完整的邊界。這就導致了它強調安全,記憶體布局控制和並發的特點。

標準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支持接口繼承,但是通過複合替代實現繼承;參見繼承複合。

創建目的

創建這個新語言的目的是為了解決一個頑疾:軟體的演進速度大大低於硬體的演進,軟體在語言級別上無法真正利用多核計算帶來的性能提升。Rust是針對多核體系提出的語言,並且吸收一些其他動態語言的重要特性,比如不需要管理記憶體,比如不會出現Null指針等等。

創始人及項目負責人

“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團隊的負責人。

最新版本說明

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版本

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 stable 部分更新內容:

  • 新的運算符,Rust已經獲得了一個新的運算符,通過減少所涉及的視覺污染,能更好的處理錯誤。
  • 穩定語句上的屬性
  • 修復空元組 structs/variants #[derive]
  • Fix 'if' 條件的生存期規則
  • 避免載入和解析未配置的非內聯模組

歷史簡介

Rust 語言在2006年作為 Mozilla 員工 Graydon Hoare 的私人項目出現,而 Mozilla 於 2009 年開始贊助這個項目。第一個有版本號的 Rust 編譯器於 2012 年 1 月發布。Rust 1.0 是第一個穩定版本,於 2015 年 5 月 15 日發布。

代碼示例

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!("這段代碼是可以編輯並且能夠運行的!"),            _ =>  {},        }    }}

相關詞條

熱門詞條

聯絡我們