用 Rust 來寫個應用,這個想法頗久了。之前呢,要麼找不到合適的場景,要麼覺得 Rust 門檻有些高。直到最近呢,剛好對底層編程有點想法,便想着用這門語言做點東西玩玩。

考慮到,我用這門語言的時間只有一星期多,某些觀點和感受並非那麼準確。因此,我的觀點並不適合作爲一份參考材料。

Rust 是什麼?

讓我來 copy 一下

Rust 是由 Mozilla 主導開發的通用、編譯型編程語言。設計準則爲“安全、併發、實用”,支持函數式、併發式、過程式以及面向對象的編程風格。 Rust 語言原本是 Mozilla 員工 Graydon Hoare 的私人項目,而 Mozilla 於 2009 年開始贊助這個項目,並且在 2010 年首次揭露了它的存在。

順便加上 MDN 上的介紹:

Rust 是一個全新的開源系統編程語言,由 Mozilla 和社區的義務勞動者創造,它幫助開發者創造高速與安全的應用,同時能享受到現代多核處理器的強大特性。Rust 使用易懂的語法避免了段錯誤 (segmentation faults) 並保證了線程安全。

不僅如此,Rust 提供了零成本抽象,更多語義,內存安全保證,不會發生競爭的線程,基於特性 (trait) 的泛型,模式匹配,類型推導,高效的 C 綁定,和最小運行時大小。

所以,就這個簡介來說,這個語言已經差不多有十年的歷史了。

Rust 優點

開始之前,我仍然是要強調一下的,這裏的優點是對比我所學的其它語言而言的,如 Go、Java、Kotlin、TypeScript或者其它。

底層語言 && 系統編程語言

我正在尋找一門不是那麼複雜的底層編程語言,以陪我完成一些更有意思的工作,而且還不需要那種 “指向指針的指針”。就這方面來說,Go 是一門不錯的語言,但是沒有 OO。哦,不對,對於 Go 來說的,它的 OO 應該是: Yes and No

從某種意義來說,Go 也有類似的潛質,面向的也是類似的人羣。然而,從現有的情況來說,Go 更像是面向網絡編程,而非系統編程。

編譯器驅動

我記得我聽聞到的一個關於 Rust 的觀點是:只要編譯成功,基本呢,不會出錯。比如煩人的內存泄漏之類的問題(當然還是會有一些的,只是要寫出來並不是那麼容易)。

編譯器內建了強大的糾錯功能。它把我們在運行時遇到的問題,提前到了編譯時。也因此,相比於其它語言,它可能會降低你的開發速度。

從某中意義上來說,它相當於是內置了一個 Sonarqube、Findbugs 這一類的 SAST(靜態應用程序安全測試)工具。並在編譯時失敗,以強迫你修復潛在的漏洞。

這其實是個缺點,哈哈哈。

交叉編譯

在 Go 一樣,在這一點上遠遠比 C/C++ 還是優秀。

包管理 + 構建

在幾個底層語言裏,C/C++、Go、Rust 裏,幾乎只有 Rust 的包管理是好用的。雖然說 Go 也有,但是就是渣啊。爲了使用方方便,我基本選擇的是拷貝,而不是用 go mod。

與此同時,我們還可以拓展 Cargo 的功能,以進行更多的操作。

==,Go 有構建工具嗎?可能是 Makefile 吧

和 Web 的無縫結合

是的,作爲一個追求跨平臺的開發人員,我特別看好 Rust 的兩個 Web 相關的方向。

  • 高性能 Web。Rust + WASM,
  • 更高性能地跨平臺應用。Rust + Electron + Node.js,結合 Neon Binding,可以編譯爲 Node.js 的模塊,並在 Electron 應用中調用,開發跨平臺桌面應用。

在一切都雲化之後,它的這一點特質將會越來越重要。

編程語言優點

從社區來說,它還有這麼一些優點:

Option & Result

缺點

從上手難道上來說,我覺得 Rust 是比 Go 更加複雜的。

學習成本 + 處理更多的細節

大抵這是一門系統集成編程語言,對於原先我們使用的那些編程語言來說,原先的這些事都是由 bug 和編譯器來體現。於是乎,我們要處理更多的細節。

Rust 的諸多語法,都有些不合直覺。除此,Rust 還有一個功能非常強大的宏(macro)系統。嗯,每多一個特性,就多一點點的複雜度。

複雜的所有權機制

Rust 引入了所有權的概念和工具,以在沒有垃圾回收機制的前提下保障內存安全。這是一個相當複雜的概念——主要是在其它語言中都沒有。

一個非常有意思的例子就是對於字符串的操作。

let mut owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";

owned_string.push_str(borrowed_string);

嗯,對,處理一個字符串,你都要小心翼翼的。所以,我還是用 format 來做這樣的事情:

format!("{}{}", owned_string, another_owned_string);

缺少支持完備的 IDE

Rust 並非沒有可用的 IDE,而是還沒有像 Intellij IDEA 那麼完備的 IDE。

我使用 Clion + Rust 插件來開發應用,但是它並非非常完美 —— 主要是,我依賴於 IDE 來進行重構,以及藉助於 IDE 的智能提醒。

其它

當前,我正在寫的兩個 Rust 應用:

phodal/exemd : 一個簡單的 Rust 應用,讀取 markdown 文件,解析其中的不同編程語言,並執行。

phodal/stadal : 參考(複製) Google 的 xi-editor 的 json RPC + 進程分離架構而設計的系統監視器。Stadal 使用 Rust 開發核心,使用 Electron 開發界面。

歡迎入坑討論學習。

相關文章