导读:Rust 是一门注重性能和安全的系统编程语言,通过其独特的所有权系统、借用系统和类型系统,成功地解决了传统系统编程中的许多难题。其开发者友好的语法、丰富的标准库和强大的社区支持,使得 Rust 成为当今编程领域中备受关注的语言之一。
01 引言
Rust 已经不算是一门年轻的语言了,其诞生时间跟 Go 语言差不多。2006 年 Rust 作为 Graydon Hoare 的个人项目出现,2007 年 Google 开始设计 Go。但很明显,Go 的发展要好得多。Rust 在 2015 年才发布了 1.0 版本,而 Go 在 2016 年已经成为了 TIOBE 的年度语言。相较而言 Rust 的发展和前景似乎不怎么好,但其实这与 Rust 语言的定位有非常大的关系。Rust 最初是作为一种在系统编程领域里替代 C/C++ 而出现的语言,其发展自然要缓慢许多。因为在系统编程领域,每走一步都要求非常扎实。
我对 Rust 印象比较深刻的有两件事情:首先是看到一篇文章称其学习曲线非常陡峭,当时就比较好奇一门语言可以难到什么程度。其次则是因为 Linus Torvalds 决定在 Linux Kernel 里添加对 Rust 的支持。Linus 以严苛出名,能受到 Linus 的青睐绝对不是一件容易的事情,这说明 Rust 这门语言必然有独到之处。
最近几年,微软、AWS 等大型商业公司逐渐开始使用 Rust 来编写或重写重要系统。开源界很多重视安全因素的组件,如 sudo/su 也在使用 Rust 进行重写。Rust 除了在系统编程领域变得流行起来,也是 WASM 领域里的推荐语言。这一方面说明 Rust 语言已经逐步成熟,另一方面也说明了 Rust 有非常强的表现能力,在各个领域都能胜任。所以 Fabarta 在开发多模态智能引擎 ArcNerual 时,经过多方面的权衡后选择了 Rust 语言。
在过去的一年多的时间里,团队从 0 到 1 开始学习并应用 Rust,在开发效率、安全性、并发、异步编程等领域都有深入的实践,我们成功发布了 ArcNerual 多模态智能引擎(ArcNerual 详情可以参见附录 1、附录 2)。回过头来看,这是一个非常成功的决定。团队成员之前大多具备 C/C++ 的背景,在上手速度上会有一些优势,后期也有一些 Java/前端背景的同学介入,在其他团队成员的帮助下,上手时间均不超过三个月,实践下来并不像网上一些文章写的那样有非常陡峭的学习曲线。
本文旨在简要叙述 Rust 语言的特性、优势以及实际生产项目中需要的一些注意事项,以便帮助您评估目前团队背景、适合领域、上手成本、熟悉周期、收益等各个方面的内容,最终可以合理决策是否要在新的项目中引入 Rust 语言。
02 Rust 语言概述
Rust 的发展经历了多个阶段,从最初的实验性质到逐渐成熟为一门系统级编程语言。Rust 最初只是 Graydon Hoare 的个人项目,他那时是 Mozilla 的雇员。所以后来 Mozilla 公司开始支持这个项目,并于 2010 年 5 月首次公开发布。在其早期阶段,Rust 主要是作为 Mozilla 的研究项目,致力于解决在编写浏览器引擎(如 Firefox 的 Gecko 引擎)时所面临的内存安全和并发性等挑战。
后来,其独特的所有权系统和内存安全性引起了业界的广泛关注。2010 年之后,Rust 的开发逐渐成为一个开源社区驱动的过程,而不再仅仅是 Mozilla 的内部项目。随着社区的不断壮大和创始人的离去,Rust 逐渐超越了单一公司的项目,成为一个开放、多元的编程语言社区,并不受个别核心人物所控制。
Rust 是一种系统级编程语言,其设计目标可以主要概括为以下三个方面:
-
安全性(Safety): Rust 的最重要设计目标之一即是提供高水平的内存安全性与并发安全性。 通过所有权系统、借用检查器和生命周期机制,Rust 在编译时能够防止许多常见的内存错误,如空指针引用和缓冲区溢出。这使得开发者能够编写更加健壮、可靠的代码,减少了许多传统系统级编程语言中容易出现的安全漏洞,当然从某些方面来说,安全性保证引入是 Rust 难以学习的主要原因,但只要熟悉并运用得当,这会是一个极大的优势,实际上 C++ 也开始讨论引入内存安全机制。
-
高生产力(Productive): “能编译就能工作”。 C/C++ 的程序员会清楚的知道编译通过只是很小的一步,后续还有非常经典的类似“Segmentation fault”错误等着去排查与解决,但 Rust 在这方面给了开发者非常强的信心,叠加零成本抽象原则,开发者可以放心的将内存、并发等问题交给 Rust ,从而极大的提升开发效率。
-
实用性(Practicality): Rust 的设计旨在成为一门实用的系统级编程语言,“you can do anything with Rust”。 Rust 不仅具有对底层硬件的直接控制能力,同时允许开发者使用高级抽象来表达复杂概念。它在性能和开发者友好性之间找到平衡,使得开发者能够编写高性能的代码,同时又不牺牲开发者的便利性。
受益于 LLVM(Low Level Virtual Machine) 这样的编译器基础设施,Rust 在这些设计目标的指导下实现了现代语言的所有特征:
-
静态类型系统:在编译时检查类型,这有助于提前捕获错误,提高代码的稳定性和可维护性。Rust 有一套强大的类型系统来帮助我们正确地编写代码。
-
自动内存管理:减轻开发者手动管理内存的负担。现代语言一般通过垃圾回收(garbage collection)机制来实现,Rust 使用了独特的所有权与借用检查系统,在性能上更有优势。
<