Rust语言

计算机编程语言
收藏
0有用+1
0
Rust是一门系统编程语言 [1],专注于安全 [2],尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C++类似 [3],设计者想要在保证性能的同时提供更好的内存安全。 Rust最初是由Mozilla研究院的Graydon Hoare设计创造,然后在Dave Herman, Brendan Eich以及很多其他人的贡献下逐步完善的。 [4]Rust的设计者们通过在研发Servo网站浏览器布局引擎过程中积累的经验优化了Rust语言和Rust编译器 [5]
Rust编译器是在MIT License 和 Apache License 2.0双重协议声明下的免费开源软件。 Rust已经连续七年(2016,2017,2018,2019,2020, 2021, 2022)在Stack Overflow开发者调查的“最受喜爱编程语言”评选项目中折取桂冠。 [6-10] [19-20]
软件名称
Rust
软件平台
WindowsmacOSLinux [11]
上线时间
2015年5月15日
最近更新时间
2023年2月7日
软件语言
Rust
开发商
Mozilla 基金会
软件授权
Mozilla 基金会 [12]
软件版本
1.75.0 [13] [21]
软件大小
6 至 8 MB

产生背景

播报
编辑
Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目。第一个有版本号的 Rust 编译器于2012 年 1 月发布。Rust 1.0 是第一个稳定版本,于 2015年5月15日发布。 [14]
“Rust”最初是Mozilla公司的 Graydon Hoare的私人项目。2009年Mozilla开始赞助此项目,并有若干 Mozilla 员工参与 Rust 语言的设计和研发。2013年8月,Graydon Hoare卸任 Rust 技术负责人职位,由Brian Anderson接任。 [15]2015年5月15日,Rust 1.0版本正式发布。2017年9月,Brian Anderson离开Mozilla,项目核心团队由 Aaron Turon和 Niko Matsakis接管共同领导,另外,Aaron Turon是 Mozilla的Rust团队的负责人。 [16]
创建这个新语言的目的是为了解决一个顽疾:软件的演进速度大大低于硬件的演进,软件在语言级别上无法真正利用多核计算带来的性能提升。Rust是针对多核体系提出的语言,并且吸收一些其他动态语言的重要特性,比如不需要管理内存,比如不会出现Null指针等等。 [17]

主要功能

播报
编辑
Rust致力于成为优雅解决高并发和高安全性系统问题的编程语言 [18],适用于大型场景,即创造维护能够保持大型系统完整的边界。这就导致了它强调安全,内存布局控制和并发的特点。标准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支持接口继承,但是通过复合替代实现继承;参见继承复合。

版本记录

播报
编辑
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版本
2020年6月18日,Rust发布1.44.1版本
2021年9月9日,Rust发布 1.55.0 版本
2023年12月28日,Rust发布 1.75.0 版本 [21]
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
新的运算符,Rust已经获得了一个新的运算符,通过减少所涉及的视觉污染,能更好的处理错误。
稳定语句上的属性
修复空元组 structs/variants #[derive]
修复 'if' 条件的生存期规则
避免加载和解析未配置的非内联模块

代码示例

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