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

Rust

维基百科,自由的百科全书
跳转至: 导航搜索
Rust
Rust programming language black logo.svg
编程范型 編譯語言并发计算
函数式指令式
物件导向结构化
設計者 Graydon Hoare
實作者 Mozilla
发行时间 2010年
最新发行时间 1.1 [1] / 2015年6月25日,33天前2015-06-25
型態系統 靜態類型強型別
類型推論結構類型英语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));
            }
        }
    }
}

歷史[编辑]

In addition to conventional static typing, prior to version 0.4 Rust also supported typestates. The typestate system modeled assertions before and after program statements, through use of a special check statement. Discrepancies could be discovered at compile time, rather than once a program was running, as might be the case with assertions in C or C++ code. The typestate concept was not unique to Rust, as it was first introduced in the NIL programming language.[22] Typestates were removed because in practice they found little use, though the same functionality can still be achieved with branding patterns.[23]

The style of the object system changed considerably within versions 0.2, 0.3 and 0.4 of Rust. Version 0.2 introduced classes for the first time, with version 0.3 adding a number of features including destructors and polymorphism through the use of interfaces. In Rust 0.4, traits were added as a means to provide inheritance; interfaces were unified with traits and removed as a separate feature. Classes were also removed, replaced by a combination of implementations and structured types.

Starting in Rust 0.9 and ending in Rust 0.11, Rust removed two built-in pointer types, ~ and @, simplifying the core memory model. It reimplemented those pointer types in the standard library as Box and (the now removed) Gc.

The name "Rust" originates from the fungi of the same name.[24]

参见[编辑]

參考資料[编辑]

  1. ^ The Rust Core Team. Rust 1.1 stable, the Community Subteam, and RustCamp. 2015-06-25 [2015-06-25]. 
  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". 

外部链接[编辑]