天天看点

有关 Rust 语言设计理念、优缺点的一些随笔

文章目录

    • 对 Rust 的一些值得一看的评论
    • Rust 最与众不同的特征 - Memory Management
    • Rust 的优点
    • Rust 的缺点

对 Rust 的一些值得一看的评论

  1. “对 Rust 语言的分析”:https://www.yinwang.org/blog-cn/2016/09/18/rust
  2. “回应王垠的《对 Rust 语言的分析》”:https://www.jianshu.com/p/31087b6b2b86
  3. “怎样看待 Rust 语言 | 知乎”:https://www.zhihu.com/question/20032903

Rust 最与众不同的特征 - Memory Management

Rust 语言在 system programming 领域之所以显得特别与众不同,最重要的一点就是整个 Memory Management 环节的设计:基于 Ownership + Borrowing + Lifetime 的 compile-time 内存管理。之所以说其与众不同,是因为这与其他任何传统 system programming 语言内存管理的机制选择完全不同:

  • C/C++:Let programmers manually manage pointers,and trust that programmers access them and free them correctly (otherwise will cause run-time errors)
  • Java 等:Run-time GC
  • Rust:基于 Ownership + Borrowing + Lifetime,(ideally) 不存在手动管理指针,但同时又是在 compile-time 时 borrow checker 就解析并插入合适的资源释放 routine 从而不存在 run-time GC

而 Rust 也是在 MM 这一方面才体现出其最重要的设计理念:安全,同时快速。即能在编译时检查出几乎所有安全问题,保证得到的代码 run-time error 尽可能少(所以才有 Rust program 只要通过了编译就基本是语义正确的笑言),同时又没有 GC 等等的运行时 overhead,对于编写 system-level 的项目来说是一种重大的进步。当然,这种选择也带来一些弊端,下文也会提及。

Rust 的优点

个人认为 Rust 有如下 5 条优点,是作为最新的 system programming 语言,参考已有语言的缺陷和自己的哲学,综合而来的:

  1. 基于 Ownership、Borrowing、Lifetime 的内存管理机制,如上节所述,是 Rust 最独特的特征,是实现 compile-time 安全性、尽可能减少 run-time error,同时保证运行高效的根基
  2. 基于

    Option

    &

    Result

    的空值和错误处理,保证了代码清晰的情况下,对空值和错误全面而安全地处理,也是 Rust 减少 run-time error 的重要保障之一
  3. 基于 Traits 的简洁而强大的 Generic 范型系统,语法简洁、清晰,没有冗余(带上复杂 Lifetime 之后似乎称不上清晰了…,但还是好过很多语言),也是 Rust 减少 run-time error 的重要保障之一
  4. 优秀的 Macro 宏定义机制,作为一门 system programming 语言,实现了相对比较强大的 meta-programming 能力,使代码简洁易懂,减少常用功能的代码冗余
  5. 完整、易用的工具链 & 凝聚力异常高的社区,使用 Cargo 做项目依赖管理,统一管理的社区 Crates hub(https://crates.io/),以及清晰的教程、完整而易读的文档

可以说,Rust 是一个好学生,学习到已有 system language 的各种不足,如 C/C++ 虽自由却让人头疼的 segfaults,Java 饱受诟病的 VM 和运行时 GC 的低效等,从而创造出一种新的语言设计哲学,走出一条与众不同的个性化的路线。正因如此,Rust 虽然不简单、领域相对小众,也能长居 Stackoverflow 最受喜爱的语言调查的榜首1。

Rust 的缺点

同样的,好学生往往有自己的偏执的一面,不会是完美的,也有许多的缺陷。

  • 与 C 的哲学(C Primer 中所言:完全信任 programmer,给予你充分的实现自由,但需要细心、严谨、有经验去实现,否则 segfault / memory leak 可以 de 到哭)截然相反,为了做到编译时捕捉大部分错误,给予了 programmer 很少的自由,真正触及底层的时候不得不用

    unsafe

    / 暂时还无法有效实现,有时会令人感到束手束脚
  • 不得不引入一些复杂规则(如 Lifetime)来 enable 它的 MM 设计,使得真正复杂 Rust 项目中的 coding 说不上很简洁,更说不上很易懂
  • 上手需要对 CA、PL、OS 的充分理解和传统 system language 的足够经验,才能理解 Rust 的很多设计;萌新上来就学习 Rust 至少对我来说是完全不行的,反而一知半解,不理解为什么要设计成这个样子
  • Rust 把对 programmer 的时间要求从 debugging / performance tuning 上转移到了 “学习 Rust” 的过程上,在这个语言选择和项目迭代愈发灵活快速的时代,我不是很确定这是件好事还是坏事
  1. https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages ↩︎

继续阅读