在某些场合下,比如Rust所定位的场合,比竞争对手快10倍甚至2倍,就能决定成败。它决定了一个系统在市场上的命运,在硬件市场也是如此。

——Graydon Hoare

现在所有的计算机都是并行的…… 并行编程就等于编程。

——Michael McCool等,《Structured Parallel Programming》

TrueType字体解析器漏洞被某些国家的攻击者用于实施监控;安全问题对所有软件都非常重要。

—Andy Wingo

从我们开始用高级语言编写操作系统以来,系统编程语言在50年间已经有了长足进展,但是有两个问题一直难以解决:

  • 难以编写安全的代码。在C和C++中,要正确管理内存,非常困难。由此导致的问题一直以安全漏洞的形式困扰着用户,至少可以追溯到1988的莫里斯蠕虫。
  • 难以编写多线程代码,而这又是充分发挥现代机器能力的不二之选。即时是最有经验的程序员,编写多线程代码时也是小心翼翼:并发会引入种类繁多的新bug,而且会使普通的bug更难复现。

来看Rust,这是一门安全、支持并发的语言,而且性能可以媲美C和C++。

Rust是由Mozilla和社区贡献者开发的新编程语言。与C和C++类似,Rust支持开发者细粒度控制内存使用,还保持了语言中的基本操作与所依赖机器的紧密联系,开发者可以预期其代码的开销。Bjarne Stroustrup在其论文《抽象与C++机器模型》(Abstraction and the C++ Machine Model)中曾清晰地阐述C++的设计目标:

一般来说,C++实现遵循零开销原则:无须为未使用的东西付出代价。更进一步,用到的东西,手工优化也不会做得更好。

Rust也遵循这些目标。而且Rust在内存安全和可信赖的并发方面也加入了自己的目标。

Rust实现这些承诺的关键是其创新的所有权(ownership)、移动(move)、借用(borrow)和编译时检查(checked at compile time)系统,而且都精心设计,以配合其灵活的静态类型系统。所有权系统为每个值建立了清晰的生命周期,使得核心语言不再需要垃圾收集,而且支持合理且灵活的接口,用于管理其他各类资源,如套接字(socket)和文件句柄(file handle)。移动(move)将值从一个所有者转移到另一个,借用(borrow)允许代码临时使用一个值,而不影响其所有权。因为很多程序员从没遇到这种形式的特性,所以我们会在第4章和第5章详细解释。

同样的所有权规则也是Rust可信赖并发模型的基础。以互斥量(mutex)和它要保护的数据之间的关系为例,大部分语言将其留给comments;而Rust实际上会在编译时检查,确保你的代码访问数据时锁定了互斥量。大部分语言会警告程序员,将一个数据结构给了另一个线程之后,确保不再使用它;而Rust会检查,确保不会。Rust能够在编译时防止数据竞争。

尽管提供了一些面向对象特性,但Rust实际上并不是一门面向对象语言。尽管像函数式语言那样,Rust倾向于让对计算结果的影响更明确,但它也不是函数式语言。某种程度上,Rust类似C和C++,但并不适用那些语言中的很多惯用法,所以典型的Rust代码和C或C++并不是那么相似。至于Rust到底是什么类型的语言,最好先保留意见,等熟悉了这门语言再看看自己怎么想。

为获得对语言设计的现实反馈,Mozilla用Rust开发了一款新的Web浏览器Servo。Servo的需求和Rust的目标完美匹配:浏览器必须表现良好,要安全地处理不可信数据。Servo使用Rust的安全并发机制,充分发挥机器的能力来执行在C和C++中难以并行化的任务。实际上Servo和Rust在共同成长,Servo使用Rust最新的语言特性,Rust基于Servo开发者的反馈不断演进。