Rust简介
Rust 是由Mozilla主导开发的通用、编译型语言。设计准侧为“安全、并发、实用”,支持函数式、并行式、程序式和面向对象的风格编程。Rust是一门系统编程语言 ,专注于安全 ,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C++类似 ,但是设计者想要在保证性能的同时提供更好的内存安全。 Rust最初是由Mozilla研究院的Graydon Hoare设计创造,然后在Dave Herman, Brendan Eich以及很多其他人的贡献下逐步完善的。 Rust的设计者们通过在研发Servo网站浏览器布局引擎过程中积累的经验优化了Rust语言和Rust编译器。
Rust背景
Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目。第一个有版本号的 Rust 编译器于2012 年 1 月发布。Rust 1.0 是第一个稳定版本,于 2015年5月15日发布。“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团队的负责人。
创建这个新语言的目的是为了解决一个顽疾:软件的演进速度大大低于硬件的演进,软件在语言级别上无法真正利用多核计算带来的性能提升。Rust是针对多核体系提出的语言,并且吸收一些其他动态语言的重要特性,比如不需要管理内存,比如不会出现Null指针等等。
Rust语言特点
语言语法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支持接口继承,但是通过复合替代实现继承;参见继承复合。