初學心得 | Rust學習筆記

做者:謝敬偉,江湖人稱「刀哥」,20年IT老兵,數據通訊網絡專家,電信網絡架構師,目前任Netwarps開發總監。刀哥在操做系統、網絡編程、高併發、高吞吐、高可用性等領域有多年的實踐經驗,並對網絡及編程等方面的新技術有濃厚的興趣。

近段時間在學習研究Rust。都說Rust學習曲線陡峭,感受果真如此。以前學習Go,基本上沒有專門去看語法,只是在須要的時候上網查一查,再花點時間看看大型的開源軟件項目,差很少就能夠寫生產級別的代碼了。而Rust則否則,至少本人花了差很少兩三週的時間專門學習語法,然而去看開源的項目依然以爲很吃力,又花了一些時間才搞明白了Rust的幾種編碼模式,特別是異步模式,又分爲poll循環的方式、combinator方式和.await協程的方式,各類坑比較多,填坑的過程仍是比較費勁的。

整個大約兩個多月學習過程當中,曾經碰到過不少的問題,在網上閱讀過不少的文章尋找答案,也和有經驗的開發者進行過微信交流,整體感受Rust仍是一個正在發展中的語言,不一樣版本之間有一些差別,特別是Rust並無提供一個很是完整runtime(也能夠理解成是開放的,提供了各類選項),異步編程模式還有tokio和async-std這樣的陣營分裂,網上相關的資料也是魚龍混雜,對於初學者而言,有可能迷失在一些錯誤的描述或者相互矛盾的各類資料中,走一段冤枉路。故而,在這裏用文字將本身的學習歷程和心得體會整理出來,但願可以對他人有所幫助。html

語法

相對而言,Rust的語法是挺特別的。由於有生存週期和借用檢查這類獨有的概念,因此語法上看上去比較複雜。做爲一種現代編程語言,大量使用了泛型,可是也帶來代碼可讀性較差的問題。相信全部的初學者都會對層層包裹的泛型參數及其限定感到頭痛,可能須要花費一段時間來適應一下。而枚舉類型Option<T>替代Null,錯誤處理Result<T,E>也是有特點的地方,然也致使相關的代碼略顯臃腫(我的體會,完成相同功能,Rust代碼篇幅老是較之Go代碼明顯更長)。總之,學習Rust,語法是第一道門檻,須要一點耐心和韌性。git

「安全」和「高性能」

全部權概念解決內存安全和GC的問題,是Rust語言的基石,也是整個系統的亮點。結合Type系統和Trait限定(Send, Sync),Rust用一種不那麼直觀但極爲優雅的方式規定了多線程編碼的基本要素。也就是說,除非寫Unsafe,不然程序員沒法制造出C/C++中常見的內存double free問題,也沒機會寫出線程不安全的代碼,這類問題在大型軟件項目後期基本都是災難。然而,Rust並不能解決代碼的邏輯錯誤。咱們同樣會碰到內存泄漏,多線程死鎖之類的問題。通常看來,多線程死鎖差很少也是災難級別的問題。此外,關於高性能,不少時候是Unsafe的同義詞,而使用Unsafe,Rust就退化爲C語言。所以,對於Rust「安全」和「高性能」,須要有一個辯證的認識。程序員

同步,異步

Rust提供開放的選項,怎麼寫代碼是程序員的選擇。同步的代碼比較直接,掌握了Rust語法就能夠看懂,容易上手。固然,若是僅僅是同步模式多線程的代碼,Rust差很少至關於一個加強版的C++。同步模式的代碼與異步模式代碼的觀感上差異很大。或者說,沒有專門學習過異步編程模式,極可能徹底看不懂異步的代碼。異步模式對於重視I/O吞吐的應用場景意義重大,主流編程語言紛紛加入了異步模式的支持,特別是Go原生支持且只支持異步模式。然而,Rust異步編程模式須要學習除語法以外的更多內容,多了很多新的概念,還有不一樣風格寫法,掌握起來有必定難度。類庫還有諸如 tokio 與 async-std 的不一樣陣營,無疑很大程度地又增長了學習的難度。而不管 tokio 或是 async-std,成熟度都有欠缺,遠遠不如Go簡單易用。可是對於使用異步編程模式的開發人員,仍是頗有必要了解異步模式的工做原理和技術實現,不然,面對一些相對複雜的問題可能就一籌莫展了。github

第三方類庫

Rust由於其高門檻,註定就是小衆的。目前來看,第三方類庫可以提供的輪子數量有限,質量堪憂,與一樣號稱系統編程語言的Go差距巨大,在勞動生產率上沒法相提並論。若是從頭開始一個大型項目,是否選用Rust,取捨值得三思。究竟須要「安全」和「高性能」,仍是快速開發,儘早交付?編程

開發工具

這一點須要用力吐槽。相較於使用Goland進行Go開發的輕鬆愉悅,使用Clion進行Rust開發可謂慘不忍睹。編輯器沒法很好地理解或展開Rust宏,所以語法提示等功能都會失效,有點盲人摸象的感受。調試器斷點不可靠,不少時候被迫祭出printf大法,調用棧很難提供有用的信息,被層層包裹的變量沒法查看,等等。若是說Goland能夠打9分,那麼Clion只能是不及格。另外,曾經嘗試過VSCode,感受還不如Clion。展望將來,隨着Rust被更多承認並獲得更多支持,開發工具的改善和提升是能夠預期的,特別是調試器,針對Rust作相關的優化後相信體驗會大幅改善。然而,由於Rust語法的複雜性以及大量依賴泛型的特性,冀望Rust開發工具的體驗效果達到Go開發工具的程度,估計不大現實。安全

網上各類資料

相較於普遍流行的Java,Go等語言,Rust的生態不可同日而語,相關資料、文獻不夠豐富。特別缺少高質量的中文原創內容。很多的翻譯文章,原文內容豐富,質量很高,但譯者可能並無徹底理解原文的精髓,不少地方直譯了事,沒能講到點子上。這時候,建議讀者找到原文對比閱讀。幾位Rust核心開發人員的博客,建議關注微信


Rust 相關的文章或教程推薦

入門教程:

Book:經典入門教程。我的以爲過於簡練,略過了不少內容。網絡

• 深刻淺出Rust:中文書籍,做爲語法學習很不錯。內容詳盡,個別地方稍顯陳舊。多線程

異步編程:

The Future With Futures:文章有點久遠,但仍是值得一讀架構

Asynchronous Programming in Rust:tokio 團隊關於異步編程的教程,系統性地講解了異步編程的前因後果

Async programming in Rust with async-std:async-std 團隊關於異步編程的教程。裏面有一個很是棒的設計實現聊天程序的教程案例。這不是一個簡單的示例,至少不是用unwrap來寫的簡單示例…

博客:

withoutboats’ Blog :著名的withoutboats,博客中有很是多內容,方方面面

stjepang’s Blog:crossbeam,smol 的做者。smol 如今是 async-std 的底層支撐。做者博客中詳盡地介紹了 executor 的實現細節

snoyman’s Blog: 講解了async fn 的原理,值得一讀。博客中有一系列關於Rust的精彩文章

中文:

最近學寫 async/await 被 Rust 毒打的經驗:這篇文章做者寫得很是生動具體,裏面提到的問題都是親身體會

Rust Async: 深度分析AtomicWaker:關於waker的深刻分析


深圳星鏈網科科技有限公司(Netwarps),專一於互聯網安全存儲領域技術的研發與應用,是先進的安全存儲基礎設施提供商,主要產品有去中心化文件系統(DFS)、區塊鏈基礎平臺(SNC)、區塊鏈操做系統(BOS)。 微信公衆號:Netwarps
相關文章
相關標籤/搜索