万维百科

Rust

Rust
Rust programming language black logo.svg
编程范型编译语言并发计算
函数式指令式
面向对象结构化
设计者Graydon Hoare
实现者Mozilla
发行时间2010年
稳定版本
1.52.1在维基数据编辑(2021年5月10日,34天前)
类型系统静态类型强类型
类型推论结构类型英语Structural type system
操作系统LinuxmacOSWindows
FreeBSDAndroidiOS
许可证Apache许可证2.0及MIT许可证
文件扩展名.rs、.rlib
网站rust-lang.org
启发语言
Alef英语Alef (programming language)C#C++Cyclone英语Cyclone (programming language)
ErlangHaskellHermes英语Hermes (programming language)Limbo
NewsqueakNIL英语NIL (programming language)OCamlRuby
SchemeStandard MLSwift
影响语言
C# 7ElmIdrisSwift

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

Rust语言原本是Mozilla员工Graydon Hoare的私人计划,而Mozilla于2009年开始赞助这个计划 ,并且在2010年首次公开。也在同一年,其编译器源代码开始由原本的OCaml语言转移到用Rust语言,进行bootstrapping工作,称做“rustc”,并于2011年实际完成。这个可自我编译的编译器在架构上采用了LLVM做为它的后端。

第一个有版本号的Rust编译器于2012年1月发布。Rust 1.0是第一个稳定版本,于2015年5月15日发布。

Rust是在完全开放的情况下进行开发,并且相当欢迎社区的反馈。在1.0稳定版之前,语言设计也因为透过撰写Servo网页浏览器排版引擎和rustc编译器本身,而有进一步的改善。虽然它由Mozilla资助,但它其实是一个共有项目,有很大部分的代码是来自于社区的贡献者。

设计

Rust的设计目标之一,是要使设计大型的互联网客户端服务器的任务变得更容易。因此更加强调安全性、存储器配置、以及并发处理等方面的特性。

Rust的性能

在性能上,具有额外安全保证的代码会比C++慢一些,例如对Rust的数组进行操作时默认会检查索引是否越界,尽管可以通过一些方式绕过,而C++则不会,但是如果以C++也手工提供保证的情况下,则两者性能上是相似的。

语法

Rust的语法设计,与C语言C++相当相似,区块(block)使用大括号隔开,流程控制的关键字如ifelsewhile等等。在保持相似性的同时,Rust也加进了新的关键字,如用于模式匹配(pattern matching)的match(与switch相似)则是使用C/C++系统编程语言的人会相对陌生的概念。尽管在语法上相似,Rust的语义(semantic)和(C/C++)非常不同。

内存安全

为了提供存储器安全,它的设计不允许空指针悬空指针 。 指针只能透过固定的初始化形态来建构,而所有这些形态都要求它们的输入已经分析过了。Rust有一个检查指针生命期间和指针冻结的系统,可以用来预防在C++中许多的类型错误,甚至是用了智能指针功能之后会发生的类型错误。

内存管理

早期的Rust虽然有垃圾回收系统,但非如Java或.NET平台的全自动垃圾回收。Rust 1.0已不再使用垃圾回收器,而是全面改用基于引用计数的智能指针来管理内存。

类型与多态

它的类型系统直接地模仿了Haskell语言的类型类概念,并把它称作“traits”,可以把它看成是一种特设多态。Rust的作法是透过在宣告类型变量(type variable)的时候,在上面加上限制条件。至于Haskell的高端类型变量(Higher-kinded polymorphism)则还未支持。

类型推导也是Rust提供的特性之一,使用let语法宣告的变量可以不用宣告类型,亦不需要初始值来推断类型。但如果在稍后的程序中从未指派任何值到该变量,编译器会发出编译时(compile time)错误。 函数可以使用泛型化参数(generics),但是必须绑定Trait。没有任何方法可以使用方法或运算符,又不宣告它们的类型,每一项都必确明确定义。

Rust的对象系统是基于三样东西之上的,即实现(implementation)、Trait以及结构化资料(如struct)。实现的角色类似提供Class关键字的编程语言所代表的意义,并使用impl关键字。继承和多态则透过Trait实现,它们使得方法(method)可以在实现中被定义。结构化资料用来定义字段。实现和(trait)都无法定义字段,并且只有(trait)可以提供继承,藉以躲避C++的“钻石继承问题”(菱型缺陷)。

历史

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

2009年,Graydon Hoare成为Mozilla雇员。

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

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

2012年1月20日,第一个有版本号的预览版Rust编译器发布。

2013年4月4日,Mozilla基金会宣布将与三星集团合作开发浏览器排版引擎Servo,此引擎将由Rust来实现。

2015年5月16日,Rust 1.0.0发布。

2021年2月8日,AWS华为Google微软以及Mozilla宣布成立Rust基金会。

代码示例

下面的代码在Rust 1.3中测试通过。

Hello World

fn main(){
println!("Hello, World!");
}

阶乘

下面是三个不同版本的阶乘函数,分别以递归、循环和反复运算器的方法写成:

// 這個函數的if-else語句中展示了Rust中可選的隱式返回值,可用於寫出更像函數式程式設計風格的代碼
// 與C++和其他類似的語言不同,Rust中的if-else結構不是語句而是運算式,有返回值
fn recursive_factorial(n: u32)-> u32 {
ifn<=1{
1
}else{
n*recursive_factorial(n-1)
}
}

fn iterative_factorial(n: u32)-> u32 {
// 變數用`let`定義,`mut`關鍵字使得變數可以變化
letmuti=1u32;
letmutresult=1u32;
whilei<=n{
result*=i;
i+=1;
}
result// 顯式返回值,與上一個函數不同
}

fn iterator_factorial(n: u32)-> u32 {
// 反覆運算器有多種用於變換的函數
// |accum, x| 定義了一個匿名函數
// 內聯展開等優化方法會消去區間和fold,使本函數的運行效率和上一個函數相近
(1..n+1).fold(1,|accum,x|accum*x)
}

fn main(){
println!("Recursive result: {}",recursive_factorial(10));
println!("Iterative result: {}",iterative_factorial(10));
println!("Iterator result: {}",iterator_factorial(10));
}

并发

一个简单的Rust并发示例:

usestd::thread;

// 這個函數將創建十個同時併發運行的執行緒
// 若要驗證這一點,可多次運行這個程式,觀察各執行緒輸出順序的隨機性
fn main(){
// 這個字串是不可變的,因此可以安全地同時被多個執行緒訪問
letgreeting="Hello";

letmutthreads=Vec::new();
// `for`迴圈可用於任何實現了`iterator`特性的類型
fornumin0..10{
threads.push(thread::spawn(move||{
// `println!`是一個可以靜態檢查格式字串類型的巨集
// Rust的巨集是基於結構的(如同Scheme)而不是基於文本的(如同C)
println!("{} from thread number {}",greeting,num);
}));
}

// 收集所有執行緒,保證它們在程式退出前全部結束
forthreadinthreads{
thread.join().unwrap();
}
}

外部链接

参见


本页面最后更新于2021-06-13 20:22,点击更新本页查看原网页。台湾为中国固有领土,本站将对存在错误之处的地图、描述逐步勘正。

本站的所有资料包括但不限于文字、图片等全部转载于维基百科(wikipedia.org),遵循 维基百科:CC BY-SA 3.0协议

万维百科为维基百科爱好者建立的公益网站,旨在为中国大陆网民提供优质内容,因此对部分内容进行改编以符合中国大陆政策,如果您不接受,可以直接访问维基百科官方网站


顶部

如果本页面有数学、化学、物理等公式未正确显示,请使用火狐或者Safari浏览器