本页使用了标题或全文手工转换

Rust

维基百科,自由的百科全书
跳转至: 导航搜索
Rust
Rust programming language black logo.svg
编程范型 編譯語言并发计算
函数式指令式
物件导向结构化
設計者 Graydon Hoare
實作者 Mozilla
发行时间 2010年
最新发行时间 1.2 [1] / 2015年8月6日,26天前2015-08-06
型態系統 靜態類型強型別
類型推論結構類型英语Structural type system
作業系統 LinuxMac OS XWindowsFreeBSDAndroidiOS
許可證 Apache许可证2.0及MIT許可證[2]
常用文件扩展名 .rs
網站 rust-lang.org

Rust是一个由Mozilla[4]主导开发的通用、编译型编程语言。它的设计准则为“安全,并发,实用”,[5][6]支持函数式并发式程序式以及面向对象的编程风格。

Rust 語言原本是 Mozilla 員工 Graydon Hoare 的私人計畫,而 Mozilla 於 2009 年開始贊助這個計畫[7],並且在 2010 年首次揭露了它的存在[8]。也在同一年,它的編譯器原始碼開始由原本的 OCaml 語言轉移到用 Rust 語言,進行 bootstrapping 工作,稱做 rustc[9],並於 2011 年實際完成[10]。這個可自我編譯的編譯器在架構上採用了 LLVM 做為它的後端。

第一個有版本號的 Rust 編譯器於 2012 年 1 月釋出。[11] Rust 1.0 是第一個穩定版本,於 2015 年 5 月 15 日釋出。[12]

Rust 是在完全開放的情況下進行開發,並且相當歡迎社區的回饋。在 1.0 穩定版之前,語言設計也因為透過撰寫 Servo 瀏覽器編排引擎和 rustc 編譯器本身,而有進一步的改善。雖然它由 Mozilla 資助,但它其實是一個共有專案,有很大部分的代碼是來自於社區的貢獻者。[13]

設計[编辑]

Rust 的設計目標之一,是要使設計大型的網際網路客戶端伺服器的任務變得更容易[14]。因此更加強調安全性、記憶體配置、以及並行處理等方面的特性。在效能上,具有額外安全保證的代碼會比 C++ 慢一些,但是如果以 C++ 也手工提供保證的情況下,則兩者效能上是相似的[15]

它的語法設計,與 C語言C++ 相當相似,區塊 (block) 使用大括號隔開,流程控制的關鍵字如 if, else, while 等等。在保持相似性的同時,Rust 也加進了新的關鍵字,如用於模式符合 (pattern matching) 的 match (與 switch 相似) 則是使用 C/C++ 系統程式語言的人會相對陌生的概念。儘管在語法上相似,Rust 的語義 (semantic) 和 C/C++ 非常不同。

為了提供記憶體安全,它的設計不允許空指標懸空指標[16] [17] 。 資料只能透過固定的初始化形態來建構,而所有這些形態都要求它們的輸入已經分析過了[18]。 Rust 有一個檢查指標生命期間和指標凍結的系統,可以用來預防在 C++ 中許多的型別錯誤,甚至是用了智慧指標功能之後會發生的型別錯誤。

它的型別系統直接地模仿了 Haskell 語言的 type class 概念,並把它稱作「traits」,可以把它看成是一種 ad hoc 多型。Rust 的作法是透過在宣告型別變數 (type variable) 的時候,在上面加上限制條件。至於 Haskell 的高階型別變數 (Higher-kinded polymorphism) 則還未支援。

Rust 雖然有垃圾回收系統,但非如 Java 或 .NET 平台的全自動垃圾回收。

型別推導也是 Rust 提供的特性之一,使用 let 語法宣告的變數可以不用宣告型別,亦不需要初始值來推斷型別。但如果在稍後的程式中從未指派任何值到該變數,編譯器會發出編譯時 (compile time) 錯誤[19]。 函數可以使用泛型化參數 (generics),但是必須綁定 Trait。沒有任何方法可以使用方法或運算子,又不宣告它們的型別,每一項都必確明確定義。

Rust 的物件系統是基於三樣東西之上的,即實作 (implementation)、Trait 以及結構化資料 (如 struct)。實作的角色類似提供 Class 關鍵字的程式語言所代表的意義,並使用 impl 關鍵字。繼承和多型則透過 Trait 實現,它們使得方法 (method) 可以在實作中被定義。結構化資料用來定義欄位。實作和 trait 都無法定義欄位,並且只有 trait 可以提供繼承,藉以躲避 C++ 的「鑽石繼承問題」(菱型缺陷)。

历史[编辑]

2006年,Rust作为Graydon Hoare的个人项目首次出现。

2009年,Graydon Hoare成为Mozilla雇员[7]

2010年,Rust首次作为Mozilla官方项目出现[8]。同年,Rust开始从初始编译(由OCaml写成)转变为自编译[9]

2011年,Rust成功的完成了移植[10]。Rust的自编译器采用LLVM作为其编译后端。

2012年1月20日,第一个有版本号的预览版Rust编译器发布[11]。当前最新版本为0.12,于2014年10月发布。

2013年4月4日,Mozilla基金會宣布將與三星集團合作開發瀏覽器排版引擎Servo将以Rust來實作[20]

2015年5月16日,Rust 1.0.0发布[21]

代码示例[编辑]

下面的代码在Rust 0.11中测试通过,在将来的版本中语法和语义可能会发生变化。

Hello World[编辑]

fn main() {
    println!("hello?");
}

阶乘[编辑]

下面是两个不同版本的阶乘函数,分别以递归循环的方法写成:

/* The branches in this function exhibit Rust's optional implicit return values,
   which can be utilized where a more "functional" style is preferred.
   Unlike C++ and related languages, Rust's `if` construct is an expression
   rather than a statement, and thus has a return value of its own. */
fn fac_recur(n: i32) -> i32 {
    if n <= 1 { 1 }
    else { n * fac_recur(n-1) }
}

fn fac_iter(n: i32) -> i32 {
    // Variables must be declared with the `mut` keyword in order to be mutable.
    let mut i = 1,
            result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result;  // An explicit return, in contrast to the above.
}

并发[编辑]

一个简单的Rust并发示例:

use task::spawn;

/* This function creates ten "tasks" that all execute concurrently.
   Run it to observe the irregular linebreaks that result as each task races
   on stdout, due to the fact that `io::println` may yield to the task
   scheduler between printing its argument and printing a newline. */
fn main() {
    // `times` is a method on numeric types whose only argument is a closure.
    for 10.times {
        do spawn {
            // `each` is a method that accepts a closure with one argument.
            for [1, 2, 3].each |item| {
                // `fmt!` is a macro that statically checks its format string.
                io::println(fmt!("%d", *item));
            }
        }
    }
}

歷史[编辑]

参见[编辑]

參考資料[编辑]

  1. ^ The Rust Core Team. Announcing Rust 1.2. 2015-08-06 [2015-08-06]. 
  2. ^ COPYRIGHT. Rust compiler source repository. [2012-12-17]. 
  3. ^ Lattner, Chris. Chris Lattner's Homepage. Chris Lattner. 2014-06-03 [2014-06-03]. "The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list." 
  4. ^ The Rust Language. Lambda the Ultimate. 2010-07-08 [2010-10-30]. 
  5. ^ The Rust Programming Language. [2012-10-21]. 
  6. ^ Doc language FAQ. [2012-10-21]. 
  7. ^ 7.0 7.1 Project FAQ. 2010-09-14 [2012-01-11]. 
  8. ^ 8.0 8.1 Future Tense. 2011-04-29 [2012-02-06]. "At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us." 
  9. ^ 9.0 9.1 Hoare, Graydon. Rust Progress. 2010-10-02 [2010-10-30]. 
  10. ^ 10.0 10.1 Hoare, Graydon. [rust-dev] stage1/rustc builds. 2011-04-20 [2011-04-20]. "After that last change fixing the logging scope context bug, looks like stage1/rustc builds. Just shy of midnight :)" 
  11. ^ 11.0 11.1 catamorphism. Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency). 2012-01-20 [2012-02-06]. 
  12. ^ rust/RELEASES.md at master · rust-lang/rust · GitHub. GitHub. 
  13. ^ Rust Contributors. 
  14. ^ Avram, Abel. Interview on Rust, a Systems Programming Language Developed by Mozilla. InfoQ. 2012-08-03 [2013-08-17]. "GH: 在其他程式語言中有很多好的、討人喜愛的想法,沒有被廣泛採用的系統程式語言採納... 在 1970 和 80 年代時,有些相當不錯的競爭者同時存在,我想要把它們所有的某些特性再拿出來,因為現況已經改變:網際網路是併發性非常強的系統,也更加重視安全性,所以以往獨鍾 C 以及 C++ 的優勢不再成立。" 
  15. ^ Walton, Patrick. C++ Design Goals in the Context of Rust. 2010-12-05 [2011-01-21]. "... 想要維持和 C 一樣快又同時保證安全是不可能的... C++ 在設計上允許各種低層操作,大部分與迴避型態系統有關,藉此 C++ 有了幾乎無限制的最佳化能力。不過在實際上,C++ 工程師在自己的程式碼中只使用某些特定的工具或技巧,例如透過 pass by alias 傳遞 stack 變數、獨特擁有的物件 (通常是 auto_ptr 或 C++0x 的unique_ptr)、使用 shared_ptr 來達成「引用計數」、COM 等等。Rust 的型態系統的設計目標之一,就是在語言中融入這些安全性設計,並且強迫實行這些原則。這樣的話,效能可以與 C++ 比較,又能同時保持記憶體安全..." 
  16. ^ Rosenblatt, Seth. Samsung joins Mozilla's quest for Rust. 2013-04-03 [2013-04-05]. "[Brendan Eich] 提出,每一年,瀏覽器都會在 Pwn2Own 競賽上發現新的漏洞。他說,Rust「不允許自由讀取記憶體」,但 C++ 則可以。這些便是「導致瀏覽器弱點」,也是能夠自編譯的 Rust 要解決的問題。" 
  17. ^ Brown, Neil. A taste of Rust. 2013-04-17 [2013-04-25]. "... 當然,為了更大程度的記憶體分享,使用者可以實作更複雜的資料結構,並同時保持介面只由被擁有和被管理的參照所組成。如此便解決了競爭存取和懸空指標的問題。" 
  18. ^ Language FAQ. 2015-05-17 [2015-05-17]. 
  19. ^ Walton, Patrick. Rust Features I: Type Inference. 2010-10-01 [2011-01-21]. 
  20. ^ http://arstechnica.com/information-technology/2013/04/samsung-teams-up-with-mozilla-to-build-browser-engine-for-multicore-machines/
  21. ^ http://blog.rust-lang.org/2015/05/15/Rust-1.0.html
  22. ^ Strom, Robert E.; Yemini, Shaula. Typestate: A Programming Language Concept for Enhancing Software Reliability. IEEE Transactions on Software Engineering. 1986 [2010-11-14]. ISSN 0098-5589. 
  23. ^ Typestate Is Dead, Long Live Typestate!. 2012-12-26 [2012-12-28]. 
  24. ^ Internet archaeology: the definitive, end-all source for why Rust is named "Rust". 

外部链接[编辑]