Rust 是由 Mozilla 主导开发的通用、编译型编程语言,以“安全、并发、实用”为设计准则,支持函数式、并发式、过程式以及面向对象的编程风格。
最初是 Mozilla 员工 Graydon Hoare 的私人项目,在 2010 年首次公开;2011 年,其编译器开始由原本的 OCaml 语言转移到用 Rust 语言,实现自举,这个版本的编译器在架构上采用了 LLVM 做为后端。
Rust 语言
Rust 1.0 是第一个稳定版本,于 2015 年 5 月 15 日发布。
性能、安全、易编写是传统软件开发中语言选型需要考虑的点,但一直以来,往往无法全部兼顾;强调易编写和安全的语言往往很慢(比如 Python),强调性能的语言往往很难驾驭(如 C 和 C++ ),让人又爱又恨。
那不禁要问,这三点都能在一种语言中实现吗?更重要的是,即便有,能获得开发者们的认可吗?Rust 语言的诞生便是为了解决这个问题,目前由 AWS、华为、谷歌、微软 和 Mozilla 等公司成立的 Rust 基金会也正是为了让 Rust 变得更好,进而推进 Rust 语言获取更多开发者的认可。
Rust 的目的是快速、安全和尽可能的容易编写,最终被广泛使用。创建一种安全、性能和易编写并重的语言的理由很多。
Rust 最初是 Mozilla 的一个研究项目,部分目的是重新实现 Firefox 浏览器的关键组件。有几个关键原因推动了这一决定:
但这些优点不仅仅是浏览器需要,是所有软件都需要的,而这也是为什么 Rust 从一个浏览器组件项目演变成了一个完整的语言项目。Rust 通过以下特点实现了其安全性、速度和易用性:
Rust 代码可以在多个平台上编译成本地机器代码。二进制文件是独立的,除了操作系统可能提供的运行时间外,没有外部运行时间,而且性能与用 C/C++ 编写的程序的性能一样好。
Rust 是跨平台的,可以在三个主要平台:Linux、Windows 和 MacOS 上运行,并都提供完整的工具链、库管理;Rust 工具链在 Windows 的能力与在 Linux 和 MacOS 上一样。除此之外,Rust 还支持开发 Linux 内核。
不安全使用内存的代码不能通过Rust的编译,大多数内存错误的程序都是在程序运行时发现的。Rust的语法和语言隐喻(language metaphors)确保了空指针或悬空指针、数据竞赛等内存问题不会进入生产,因为编译器会强制要求修复这些问题,否则无法通过编译。
Rust程序中的每一点内存都是通过所有权自动跟踪和释放的,对象之间所有权的转移方式由编译器严格控制,所以在运行时不会出现内存分配错误的情况;
而所有权也意味着Rust不需要像Java和C#语言那样需要垃圾回收机制来释放内存,也就不再需要额外的STW时间,给Rust带来了另一种性能提升。
对于新人来说,如果发现 Rust 语言无法实现他想要的功能,或者语言缺少想要的特性,那么这个开发者往往会选择离开,就更别谈愿意用这种语言开发程序了。
Rust 的原生语言特性:宏、泛型、模式匹配和组合(通过 traits)都是 Rust 中的一等公民。与 C++ 等语言相比,大部分都能对应起来,对于这些语言的开发者来说,转入 Rust 开发,难度不会太高。
Rust 更大的使命之一是鼓励 C 和 C 开发者尽可能地使用 Rust,但是 C 和 C 语言并没有一个像样的标准库,并且在标准库中能够使用容器、集合和迭代器,字符串操作,线程,管理进程,访问网络和文件I/O等等。
Rust 在其标准库中做到了所有这些,甚至更多;因为 Rust 是为跨平台而设计的,所以它的标准库只能包含可以安全可靠地跨平台移植的库。像 Linux 的 epoll 这样的操作系统的平台特定函数必须通过第三方库的函数来支持,比如 libc、mio 或 tokio。
在没有标准库的情况下使用 Rust 也是可能的,这样的场景往往是:嵌入式系统或操作系统内核。
衡量一门语言的实用性的一个标准是,在第三方的帮助下,可以用它做多少事情。Cargo 是 Rust 库(crate)的官方仓库,列出了大约 6万 多个 crate。
其中有相当数量的是与常用库或框架的 API 绑定,因此 Rust 可以作为这些框架的一个可行的语言选择。每个开发者都可以提交的自己开发的三方库到官方库,贡献给其他开发者使用。
尽管 Rust 具有所有吸引人的、强大和有用的功能,但它也有缺点。其中一些障碍使新的 "Rustaceans"(Rust 粉丝之间的相互称呼)和老手都被绊倒。
Rust 仍然是一种年轻的语言,它在2015年才发布1.0版本。尽管语言的许多核心语法和功能已经被敲定,但围绕它的许多其他特性仍在不断变化。
例如,异步操作在Rust中仍然是一项正在进行的工作。异步的某些部分比其他部分更成熟,而且许多部分是通过第三方组件提供的。
Rust作为一个全新的语言,他的所有权、借用和Rust的内存管理对于许多新手Rust程序员都有一个共同的痛点,就是 fighting the borrow checker,在不充分了解Rust特有的机制之前,会经常触发编译器发出这个提示。因此,入门Rust语言要比其它语言花费更多时间和精力。
与其他语言相比,Rust 的隐喻使得代码更加冗长。例如,Rust 中的字符串连接并不总是像 string1+string2 那样直截了当。一个对象可能是可变的,另一个是不可变的。Rust 倾向于把更多问题让程序员提前解决,或者告诉编译器如何处理,而不是让编译器猜测。
像 C/C++ 一样,Rust 可以用来编写系统级软件,因为它允许直接操作内存;很多时候,Rust 被用来插入现有的 C/C++ 编写的库;因此就避免不了的要和C/C++编写的库相互调用,但是 Rust 并没有提供一个很好的解决方案。
官方团队意识到了其中的许多问题,并正在努力改善这些问题。例如:为了使 Rust 更容易与 C/C++ 相互协作,Rust 引入了 bindgen 这样的项目,它可以自动生成 Rust 与 C 代码的绑定。
尽管 Rust 有着不少的不尽如人意之处,但也确确实实为解决安全和性能问题提供了一种可行的解决方案,现在也有越来越多的开发者和科技巨头加入了进来,和官方团队一起努力,想办法来解决这些问题,让 Rust 变得更好。