On Rust

由於 Rust 1.0 鍵盤 Release Party 的錄影因為生於操作 Twitch 的關係而沒有保留,自己是感到蠻可惜的。在現在這個時間點 Rust 的中文介紹仍相當稀少的情況下,總覺得還是應該多打一些字來總結一下自己對這個新的語言的看法。本篇的內容主要還是 Release Party 那一天講的內容,那天有收看的 #cschat.tw 版友就可以直接跳過了。

自己在介紹 Rust 這個語言的時候我總是會用一個一句話的版本,就是「C++ The Good Part」。我自己是從 Rust 0.4 開始追這個語言的發展,現今語言的樣貌距離那時候已經非常非常不一樣。這其中當然伴隨許多因素。包含開發過程中領導者的換人,Rust 的原作者也離開 Mozilla,還有從 Servo 那邊得到的 feedback 都影響著這個 development in open 的語言。當然參與的群眾主要也是以 C++ 為主力語言者為眾,所以最後的風格還是很能看到 C++11, C++14, C++17 的影子在的。不過好處是過程中一些 PL 背景的研究者參與,對於 Rust 的型態系統有所貢獻,讓語言的表達力可以維持在高檔並混入一些比較是研究前沿的東西,老實說在 1.0 看到 associated type 也是蠻意外的,這在之前只有在 Haskell 有看過。而 trait 長得也很像是 typeclasss (據說是很像 C++17 的 Concept)

Rust 最具有創新意義的應該是他的 borrow checker 還有 lifetime inference 了吧。在其他主流語言中是沒看過有這種類似 linear type 的實作。雖然會帶給寫程式上的負擔,譬如說要硬是加個 block scope 來讓一些 borrow 失效。不過整體上來說是讓安全性大大提高的,畢竟整個語言就是以 memory safety 為優先而設計。不過這其中最有趣的是 lifetime, borrow 跟 closure 混雜在一起時候的概念。畢竟不像是有 GC 的語言,是另外自己實作語言的 stack 還有 heap。 Rust 的 stack 還有 heap 就真的是 C 一般系統的 stack 還有 heap。所以在處理 closure 的時候,究竟 closure 是不是在 stack 最上層被一個 function 回傳,還有是否能從一個 thread 轉移到另一個 thread 都是需要細心考慮的問題。而 Rust 用 trait 還有 trait object 來用型別盡可能地解決了這個問題。而大部分的工作都可以用型別推導來完成。

另外 Rust 的 Module system 還有 crate package 也是解決了 C++ 長久以來比較不方便的地方。而 Rust 的 macro 也可以提供方便的 conditional compilation 等等問題。比起 C 的 define 要來得安全多了。而錯誤處理選擇用 Option 還有 IoResult 但卻沒有 exception 可能會讓不少人失望,這會讓開發過程要多打許多字。不過畢竟 Rust 牽扯到的是非常低階的層次,要用好 exception 會需要非常小心。就像某些團隊的 C++ guideline 會禁止用 exception 一樣,也是認知到你的團隊的生產力會被團隊中相對不熟悉語言本身問題的人所限制住。團隊中最弱的一個人亂用 exception 就會讓 bug 多出不少,與其用 guideline 沒有強制性,或是用社會性地方式去譴責這樣的行為,也許設計成在語言中會是一種保守但可以理解的選擇。畢竟當你團隊有 100 人以上的時候,機器還是比人可靠多了。

至於 Rust 會不會發展起來,還很難說。目前社群中有不小的動能。而 Rust 的程式碼可以 compile 成 unmangled 讓 C++ 可以 link 也是讓 migration 容易許多。這些都是正向的發展動力。不過軟體的 networking effect 太強,沒有明顯顯著好的生態系統或是剛好打到市場需求點的話,沒有人先跳坑就會沒有進一步的正向循環,帶進錢跟貢獻者。而且同時 C++ 本身也在進步,所以很難說 Rust 是否會成功。更何況是 1.0 還有很多生態系還有編譯速度的問題有待改進。不過畢竟 Rust 這個語言的設計畢竟貼近於個人喜好,我還是希望他成功的,也因此才有這篇文章。如果對 Rust 有興趣想花點時間研究的話,歡迎到 freenode #rust.tw 聊聊天。