我已經學習 Rust 有挺長的一段時間了,一直想用 Rust 來寫點東西,可是缺少好的想法; 有些想法自我感受良好,可是又沒有能力實現 (好比,寫一個操做系統?), 因此最後我決 定仍是拿個人博客來作實驗品吧。我原來的博客 是 基於 Github Page 和 Org mode 實現的靜態博客,略顯簡單。因此我就以爲用 Rust 來寫 個新的博客。程序員
先後花了一個月的空餘時間來寫這個博客,寫完這個博客以後,我以爲我應該算是有點 Rust 的編程經驗了 ;-). 在學習 Rust 和使用 Rust 的時候,我老是將 Rust 和我平時使 用的語言進行對比。一段時間下來,我對使用 Rust 的感悟愈來愈多,因此我談談我眼中的 Rust算法
談及 Rust, 首先想到的必定是內存安全,正如官網對 Rust 的定義:sql
Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.數據庫
這個也是 Rust 對比其餘的語言最大的亮點之一. 衆所周知,在 Rust 以前的其餘編程語言 管理內存的方式無非是以使用垃圾回收算法管理內存(表明就是 Java 和 Python), 或者是 C/C++ 手工管理內存。 手工管理內存很是容易出現問題,即便是很是有經驗的工程師也不能 寫出徹底沒內存問題的代碼,畢竟人老是免不了出錯。 可是使用垃圾回收算法就必定會有運 行時和垃圾回收時的停頓,這就不適合系統編程了。 而 Rust 經過新加入的 生命週期 (lifetime)和全部權 (Ownership) 特性,就能夠實現內存的自動回收,而且無需運行時, 能夠大大地避免出現相似內存泄漏或者時懸停指針之類的問題編程
聽說,在 Rust 的編譯器設計理念裏,編譯器能夠檢查的,就無需程序員操心。 而且由於 Rust 所倡導的安全的概念,因此它的編譯器會作儘量多的檢查,爭取在編譯期就發現問 題。此外 Rust 的編譯信息還很是友好和詳細。安全
error[E0308]: mismatched types --> src/main.rs:72:32 | 11 | let url = match Url::parse(matches.value_of("URL")) { | ^^^^^^^^^^^^^^^^^^^^^^^ expected &str, found enum `std::option::Option` | = note: expected type `&str` found type `std::option::Option<&str>` = help: here are some functions which might fulfill your needs: - .unwrap() - .unwrap_or_default() error: aborting due to previous error error: Could not compile `blog`. To learn more, run the command again with --verbose.
Rust 編譯器就像導師同樣耳提面命,爲你指出代碼中的問題(可是有時候,我以爲 Rust 的編譯器也像導 師同樣,太囉嗦了 !-_-)併發
Rust 不一樣於衍生自 C 的 Java, Go, Python 等語言,Rust 更多地吸收了 Ocaml, Haskell, Scheme 等函數式語言的特性。對於習慣了 C 系語言的同窗而言,Rust 算是打開 了一個新的大門。框架
enum Coin { Penny, Nickel, Dime, Quarter, } fn value_in_cents(coin: Coin) -> u32 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, } }
這個是 The Rust Programming Book 的例子,做用是列舉全部的枚舉值,可是彷佛也沒有比 switch 神奇到哪裏去。可是 match像其餘的函數式語言那樣,能夠提供模式匹配的能力,爲複雜的類型系統提供一個簡單輕鬆的解構能力。例如對 struct 進行解構:編程語言
struct Point { x: i64, y: i64, } let point = Point { x: 0, y: 0 }; match point { Point { x, y } => println!("({},{})", x, y), }
這樣,對 使用 match 就能夠獲得 Point的內部值編輯器
macro_rules! create_function { // This macro takes an argument of designator `ident` and // creates a function named `$func_name`. // The `ident` designator is used for variable/function names. ($func_name:ident) => ( fn $func_name() { // The `stringify!` macro converts an `ident` into a string. println!("You called {:?}()", stringify!($func_name)) } ) } // Create functions named `foo` and `bar` with the above macro. create_function!(foo); create_function!(bar);
使用上面的定義的宏,我就建立了一個 foo() 和 bar() 函數,而後就能夠直接調用:
fn main() { foo(); bar(); }
Rust 的宏系統極具表現力 完整例子參見 rust by example
不得不說,Rust 的工具鏈真的讓程序員很是舒心
Cargo Cargo 是 Rust 的構造系統和包管理器,開發者能夠用 Cargo 下 載相應的依賴和構造代碼。Cargo 很是容易上手,可是功能確是很是強大,Cargo 還能夠幫 開發者設置相應的單元測試和基準測試,因此使用 Cargo 進行單元測試和基準測試是很是 省心。Cargo 是多合一的一站式工具,也是同類工具中,我使用過的最強大的
Rustup rustup 是 Rust 的一個安裝器,使用 rustup 來更新 Rust 的編譯器,它跟 Python 的 virtualenv 有點像,能夠維護不一樣版本的 Rust 編譯器,例如 stable, nightly,beta 等
rust-clippy rust-clippy 是 Rust 的一個靜 態代碼分析工具,雖然說 Rust 的編譯器在分析 Rust 代碼上已經作了很是多的工做了,可是 rust-clippy 能夠幫你更進一步,編寫出更好的代碼。總會有一些代碼能夠進行簡化以提升 代碼的可讀性,或者是更符合最佳實踐,而 rust-clippy 就是會給你相應的提示,以協助 你編寫出更好的代碼。
Rust 強勁的性能也是它很是大的亮點之一,記得我學習 Rust 的其中一個緣由就是它的性 能,由於我熟悉的 Python 雖然優勢很是多,可是性能一直被人垢病. 而 Rust 其中的一個 設計理念就是實現高併發,充分利用好現代電腦的多核特性. Rust 的目標是性能方面超越 C 語言,可能這個目標在不少人看來都很好笑. 可是不少基準測試都代表 Rust 的性能和 C 已經相差不大,考慮到 Rust 自己就是爲了現代多核電腦設計的編程語言,而 C 仍是上世 紀 70 年代的產物,即便是天才般的發明,如今也難免追不上莫爾定律的腳步,何況 Rust 仍是處在嬰兒期,而 C 已經很是成熟,例如 GCC 這樣的編譯器也對 C 語言作了很是多的 優化,C 語言性能方面的增加已經頗有限了。 因此若是 Rust 真的能利用好多核的性能,未 來真的可期
這個應該不算是 Rust 的一個優勢,可是 Rust 社區讓我在編寫 Rust 過程深深受益。 我編 寫的博客使用的 Web 框架是 Rocket, 數據庫層的 ORM 是 Diesel, 由於框架和編程語言都很是新,雖然說他們的文檔都很是完 整,可是不免會有覆蓋不到的地方,因此總會有一些遇到的問題我不知道怎麼解決。 因此我 常常向社區求助,在 Reddit 上發貼,或者是在 Gitter 上找人求助,又或者是在 Github 上面求助,在社區的朋友的幫助下,我最後都能解決問題。社區的朋友都很是友好和樂於幫 忙,即便我問的問題很菜鳥,可是他們都一一耐心作答。 Rust 社區給個人感受和 Emacs 社 區給個人感受很類似,社區人數少,可是素質很是高,很是友好。
如今我來講說 Rust 的不足或者說是劣勢
前面提到 Rust 爲了實現內存無運行時的自動管理,引入了首創的生命週期 (lifetime)和 全部權 (ownership), 對於學習 Rust 的同窗來講,這是必須跨過去的坎,接着還有相似引 用 (Reference),租借 (Borrow) 這些特性,真的使人望而生畏。 而 Rust 的不少新的特性 都是沒辦法從已有的編程語言那裏找到相似的特性的,因此必須以 Rust 的思惟去學習 Rust, 而不能抱着 Java 或者 C++ 的思惟的學,由於這樣必定會撞得頭破血流,久攻 不下,就很容易放棄
沒錯,Rust 的不足,編譯器也有一份子。前面提到 Rust 是會盡量地檢查你的代碼,把 BUG 扼殺在編譯期,因此就會致使兩個問題. 問題一: 不少東西編譯器都要管,因此你的代 碼就必須寫得符合編譯器的要求,否則編譯器就不會讓你經過,因此每次編譯都想撞牆,怎 麼這個編譯不經過,那個編譯也不經過;若是你的代碼編譯經過了,它運行就比較少會出現 問題; 問題二: 由於要作儘可能多的檢查,因此致使編譯的時間很是長,常常是改動了一小點 代碼,從新編譯就要 10s 以上, 而個人機器都已是 E5 的 CPU 加 32G 的內存了。
雖然說 Rust 如今發展迅速,可是 Rust 的生態尚未起來,不少優質的類庫仍是欠缺,不少 現有的類庫還不成熟,例如我如今使用的 Rocket 框架還只是 0.3, Diesel 還只是 0.16.0 ,不少我須要的功能都沒有,好比 Diesel 這個 ORM 還沒沒法進行 Rust 的 enum 和 Postgres 的 enum 的映射,一些複雜的查詢還不支持,只能使用 sql 進行操做。其餘類庫的版本如圖:
如今 Rust 沒有比較成熟的 IDE, 如今我使用 Emacs 編寫 Rust, 配合 Racer 這個 Rust 代碼補全工具,可是 Racer 只是能補全標準類庫的代碼,對於下載下來的依賴類庫,就無 能爲力,因此我寫代碼都只能對着 API 文檔編寫,而後編譯,出了問題再修改。 雖然說 Rust 團隊如今基於 LSP 在開發 RLS, 可是我寫 Rust 的感受就好像我使用編輯器寫 Java 的感 覺同樣,實在是效率過低,代碼補全,語法提示功能太弱了。
雖然說這個與 Rust 自己無關,不過我只是想吐嘈一下,Rust 的中文社區幾乎沒有,個人所 有 Rust 問題都是在 Reddit, Github, Gitter, IRC 上面解決的. 我只是但願 Rust 中文社 區也能夠強大起來。 人數應該不是什麼大的緣由,像 Emacs 的用戶那麼少,Emacs 的 中 文社區 同樣很繁榮,這個算是個人一個希冀吧
其實學習 Rust 仍是頗有收穫的, 不是說,若是這種語言沒有改變你對編程的見解,那它就 不值得你學。 這麼看來,Rust 仍是值得我學習的,Rust 如今給個人感受跟 Emacs/Vim 很 類似,它很強大,可是因爲學習曲線等諸多緣由,遊離於主流以外,可是它的強大和它的美 只有你親身學習,親身經歷才能體會到的。這就是如魚飲水,冷暖自知吧。
轉自:v2ex