
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性能
标準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!("这段代码是可以编辑并且能够运行的!"), _ => {}, } }}