天天看點

有關 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 ↩︎

繼續閱讀