Rust

Rust是由Mozilla主导开发的通用、编译型编程语言。设计准则为“安全、并发、实用”，支持函数式、并行式、过程式以及面向对象的程式设计风格。
Rust语言原本是Mozilla员工Graydon Hoare的个人专案，而Mozilla于2009年开始赞助这个专案 ，并且在2010年首次公开。也在同一年，其编译器原始码开始由原本的OCaml语言转移到用Rust语言，进行自我编译工作，称做「rustc」，并于2011年实际完成。这个可自我编译的编译器在架构上采用了LLVM作为它的后端。
第一个有版本号的Rust编译器于2012年1月释出。Rust 1.0是第一个稳定版本，于2015年5月15日释出。
Rust在完全公开的情况下开发，并且相当欢迎-{zh-hans:社区;zh-hant:社群}-的回馈。在1.0稳定版之前，语言设计也因为透过撰写Servo网页浏览器排版引擎和rustc编译器本身，而有进一步的改善。它虽然由Mozilla资助，但其实是一个共有专案，有很大部分的程式码是来自于-{zh-hans:社区;zh-hant:社群}-的贡献者。

**设计 **
Rust的设计目标之一，是要使设计大型的网际网路客户端和伺服器的任务变得更容易。因此更加强调安全性、记忆体配置、以及并行处理等方面的特性。

**性能**
在效能上，具有额外安全保证的代码会比C++慢一些，例如Rust对数组进行操作时会进行边界检查（尽管可以通过一些方式绕过），而C++则不会，但是如果等价的C++代码作手工检查，则两者效能上是相似的。

**编译报错**
比起C/C++，Rust编译器的对于代码中错误的提示更清晰明了，开发者可根据提示轻松地修复代码中的错误。

**编译速度**
由于其编译器会做出额外的安全检查，Rust的编译速度有时低于C/C++。

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

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

**所有权**
Rust设计了一个所有权系统，其中所有值都有一个唯一的所有者，并且值的作用域与所有者的作用域相同。值可以通过不可变引用（&T）、可变引用（&mut T）或者通过值本身（T）传递。任何时候，一个变量都可以有多个不可变引用或一个可变引用，这实际上是一个显式的读写锁。Rust编译器在编译时强制执行这些规则，并检查所有引用是否有效。

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

**类型与多态**
它的型别系统直接地模仿了Haskell语言的类型类概念，并把它称作「traits」，可以把它看成是一种特设多态。Rust的作法是透过在宣告型别变数（type variable）的时候，在上面加上限制条件。至于Haskell的高阶型别变数（Higher-kinded polymorphism）则还未支援。
型别推导也是Rust提供的特性之一，使用let语法宣告的变数可以不用宣告型别，亦不需要初始值来推断型别。但如果在稍后的程式中从未指派任何值到该变数，编译器会发出编译时（compile time）错误。函数可以使用泛型化参数（generics），但是必须绑定Trait。不能使用方法或运算子而不-{zh-tw: 宣告; zh-hans: 声明}-它们的型别，每一项都必确明确定义。
Rust的物件系统是基于三样东西之上的，即实作（implementation）、Trait以及结构化资料（如struct）。实作的角色类似提供Class关键字的程式语言所代表的意义，并使用impl关键字。继承和多型则-{zh-tw: 透过; zh-hans: 通过}-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发布。
2020年3月27日，Rust核心团队成员Steve Klabnik在官方博客发表了一篇名为《Goodbye, docs team》的文章，叙述了Rust文档的现状。
2021年2月8日，AWS、华为、Google、微软以及Mozilla宣布成立Rust基金会，并承诺在两年时间里每年投入不少于 100 万美元的预算，以用于 Rust 项目的开发、维护和推广。
2022年9月19日，Linux初始开发者 Linus Torvalds 表示在Linux核心6.1版中会有对Rust的初步支援。
2023年4月6日，Rust基金会发布了新商标政策草案，修订了关于如何使用Rust标志和名称的规则，导致了Rust用户社区的负面反应和抗议。

**生态系统**
除了编译器和标准库，Rust生态系统还包括用于软件开发的额外组件。官方推荐使用Rustup，一个Rust工具链安装程序来管理这些组件。

**Cargo**
Cargo是Rust的软件包管理器，用来下载和构建依赖关系。Cargo还充当了Clippy和其他Rust组件的封装器。它要求项目遵循一定的目录结构。
Cargo.toml文件指定了项目所需的依赖和版本要求，告诉Cargo哪些版本的依赖关系与该包兼容。Cargo默认从crates.io中获取依赖，但Git仓库和本地文件系统中的包也可以作为依赖。

**集成开发环境支持**
rust-analyzer 是一系列工具，可以通过语言服务器协议为集成开发环境（IDE）和文本编辑器提供有关某一Rust项目的信息。利用它，开发者可以在编辑Rust代码时使用自动完成和编译错误显示等功能。

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

**Hello World**
fn main() {
println!("Hello, World!");
}
如果不想使输出包含换行符(\n)，可以使用print!巨集代替println!巨集。

**阶乘**
下面是三个不同版本的阶乘函数，分别以递回、回圈和迭代器的方法写成：
// 这个函数的if-else语句中展示了Rust中可选的隐式返回值，可用于写出更像函数式程式设计风格的代码
// 与C++和其他类似的语言不同，Rust中的if-else结构不是语句而是运算式，有返回值
fn recursive_factorial(n: u32) -> u32 {
if n  u32 {
// 变数用`let`定义，`mut`关键字使得变数可以变化
let mut i = 1u32;
let mut result = 1u32;
while i  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并行计算例子：
use std::thread;
// 这个函数将创建十个同时并行的执行绪
// 若要验证这一点，可多次运行这个程式，观察各执行绪输出顺序的随机性
fn main() {
// 这个字串是不可变的，因此可以安全地同时被多个执行绪访问
let greeting = "Hello";
let mut threads = Vec::new();
// `for`回圈可用于任何实现了`iterator`特性的类型
for num in 0..10 {
threads.push(thread::spawn(move 
{
// `println!`是一个可以静态检查格式字串类型的巨集
// Rust的巨集是基于结构的（如同Scheme）而不是基于文本的（如同C）
println!("{} from thread number {}", greeting, num);
}));
}
// 收集所有执行绪，保证它们在程式退出前全部结束
for thread in threads {
thread.join().unwrap();
}
}

**参考资料**

**参阅**
 Servo

**外部链接**
  官方网站date=20190602230110 （ 简体中文date=20200526125214 、 正体中文date=20200524191231 ）-  The Rust-dev Archivesdate=20120314111211 （邮件列表）-  Rust主源代码库及缺陷跟踪系统date=20130903163230 于Github-  Rust语言Wikidate=20140210170626 于Github- Rust教学date=20200630015918