< 返回版块

2019-03-21 00:16    责任编辑:Mike

Rust 号称是一门对内存和线程安全的编程语言,这是什么意思呢?

就是说,你在使用 Rust 提供的基础设施进行编程开发的时候,是不会遇到传统意义上讲的:

  1. 空指针
  2. 悬挂指针
  3. 数组越界
  4. 共享全局变量问题
  5. 以及其它在实践中极难调试的小概率型多线程竞争性问题

上述这些问题,是造成现代 IT 工业漏洞和缺陷的最主要原因,也是被黑客利用进行攻击的最主要原因。

有些语言为了解决上述前 3 个问题,引入了 GC,从此就成了有 GC 的语言(Java, C#, Go,以及所有动态语言)。

然而,Rust 把这些问题都解决了,而且还没有引入 GC!

哇哦,你会感觉很惊奇,Rust 有什么魔法,能够做到这些?是靠最佳实践规范吗?

错。Rust 不需要给程序员灌输几百页的最佳实践规范,你只需要按 Rust 编译器的指示来写代码就可以了。也可以理解为 Rust 直接把编程最佳实践融入到了语言本身中,只需要学习语言本身,不需要再去学习一套所谓的 xx 语言高效开发最佳实践课程。

Rust 从以下几个方面,来达到上述目的:

  • 精密的类型系统
  • 所有权系统(Ownership)和借用检查器
  • 生命周期管理
  • 标记特征
  • Safe 层与 Unsafe 层的分开
  • 强迫性的错误处理

我们说 Rust 是安全的,是在其提供的基础设施封装之上使用是安全的、放心的,不会写出有那些漏洞的代码。但并不是说用 C/C++ 写出的代码,就一定是不安全的,有漏洞的。这个逻辑一定要清晰。本质在人。人也可以用 C/C++ 写出完全没有 bug 的代码。

但问题在于,人是有状态的,易犯错的,不同的人的水平也是参差不齐的。总之人是不可靠的。指望人来找出所有的 bug,也是不现实的。Rust 安全编程的意义就在于此。它通过定义语言标准,尽量减少人的状态起伏和水平差异对程序安全性的影响,从而实现安全编程。只要通过 Rust 编译器编译的代码,就“基本上”不会有大问题(逻辑问题除外)。

那你又会问,同样是建立在机器硬件上的代码,从根上凭什么说 Rust 是安全的呢?或者说,这个世界本来就是脏的,Rust 是怎么避免这些脏的内容的呢?答案就在于,Rust 对世界的剖分——把世界分成了 Safe 层和 Unsafe 层。对于底层的操作,Rust 其实跟 C 语言遇到的问题差不多。这时,还得靠人来保证所写的代码的可靠性,无 bug(比如,std 库的实现)。但是 Rust 团队可以保证参与写 std 的人的水平和代码审查能力(代码也是开源的,面向全世界开发者的审查)。然后,Rust 团队把不安全的代码进行封装,封装成 Rust 的库接口,上层开发者在这些封装好的库上进行开发,就进入到 safe 编程的范畴。而这部分人,是绝绝大部分开发者。所以我们说,使用 Rust 进行安全开发。

过于重视安全性,其实会损失一部分的灵活性。这也是 unsafe rust 仍然暴露给上层开发者的原因。对于少数场景下,需要灵活,高效,人又能比较好地保证安全性的情况,人可以使用 unsafe rust 来最大限度的提高性能、压榨机器。然后一批智能指针的提出,也是对强调安全性所丧失的灵活性的补充。

实践证明,使用 Rust 进行开发,能大大减少开发人员的心智负担。将开发人员担心的上线后可能出各种各样奇怪的问题,提前到了编译的时候可能出各种各样的问题。将开发人员与运行中的 bug 做斗争,变成了与编译器做斗争。而后者的心智负担,可能只是前者的 1/10000。

用了 Rust,腰不痛,腿不酸,身体倍棒,吃嘛嘛香。