摘要:Rust語言學習曲線過於陡峭?初學者看懂這張思維導圖,快速入門。
Rust語言這兩年的熱度大家有目共睹,作為一個有着突破性變革意義的語言,其光鮮背后也有諸多質疑,對於想要在系統編程語言上更上一層樓的開發者來說,學習Rust語言既是一次新的嘗試,也是一次編程思維上的挑戰。
最近,技術暢銷書《Rust編程之道》的作者張漢東總結了一份“Rust初學者學習路徑”思維導圖,作為Rust語言的頭號布道者,張漢東參與了國內Rust社區的管理和運營,長期在各大知識平台輸出高質量的學習教程,可以說是入門Rust語言的首選啟蒙導師。
基於張老師這份思維導圖,我們將其中的一些分支內容做了詳細拆解,或許可以為Rust語言的初學者們解惑,稍微降低學習曲線的陡峭度。
首先,不管什么樣的初學者都需要了解的是Rust語言的一些外圍常識,包括:
1、Rust語言是什么樣的
2、Rust語言應用領域范圍
3、Rust語言社區
再針對不同特點的開發者,提出針對性的學習建議:
1、有C語言基礎
2、有C++基礎
3、有Java/Python/Ruby基礎
4、有Go基礎
5、有Haskell基礎
Rust語言是什么樣的
Rust最早是Mozilla員工Graydon Hoare的私人計划,說的通俗點,是Hoare的個人業務愛好,誰知道無心插柳柳成蔭,最后卻做成了一個廣受歡迎的編程開發語言。
Mozilla了解到這個項目后就開始贊助這個計划,並且在2010年首次揭露了Rust的存在。同一年,其編譯器源代碼由原本的OCaml語言轉移到Rust語言,進行bootstrapping工作,稱做Rustc,並於2011年完成。這個可自我編譯的編譯器在架構上采用了LLVM做為它的后端。
Rust最為外界稱道的是它的穩定和安全,而這種超強的穩定性來源於其獨特的內存安全管理。
在C/C++中,很多開發者都會遇到內存方面的問題,Rust嚴格的編譯器和良好的設計使它規避了這些問題,讓它不會出現內存安全方面的故障。Java和C#的流行是因為它們消除了與內存安全性有關的錯誤,但這兩種語言(如Java虛擬機和.Net)在運行時使用了垃圾回收從而導致運行開銷,進而影響應用程序的性能。
Rust是無垃圾回收機制和Runtime的靜態編程語言,它通過新加入的生命周期 (lifetime)和所有權 (Ownership) 特性,實現內存的自動回收,並且無需運行時,避免出現類似內存泄漏或者懸停指針之類的問題。
Rust的特性決定了它適用於追求編程語言的速度與穩定性的開發者。在官方指導文檔中,如此形容Rust的使命:它最重要的目標是消除數十年來程序員不得不做的權衡:安全與生產力,速度與人機交互的順暢度(ergonomics)。
簡而言之,Rust是C和C ++的直接競爭對手,並且在較小程度上與Java和C#競爭。 至於Rust能不能將前浪拍在沙灘上,恐怕得拉長戰線評估長期應用效果。
Rust適合哪些應用領域
和C語言一樣,Rust也算是一種系統級語言。而且介於Rust不需要在運行時進行垃圾回收,因此它可以提供類似於C和C ++語言的運行時性能。
微軟MSRC(微軟安全響應中心)首席雲開發布道師Ryan Levick曾公開表示:Rust適合系統性編程,微軟大約70%的安全問題是內存安全問題。如果這些軟件用Rust寫,那么這 70%的安全問題很可能就不存在。
業內有不少預測顯示Rust可能會成為下一代操作系統的開發語言,之前火狐就用它編寫了一個名為Redox的類UNIX操作系統,微軟也有逐漸從C/C++轉移到Rust構建其基礎結構軟件的計划。
當前的雲計算領域,Rust也可以如魚得水。
在雲計算中,需要構建高性能以降低關鍵開銷的基礎架構組件。例如,我們擁有虛擬機管理程序,其作用類似於虛擬機管理器,允許在多個租戶之間共享單個雲資源物理實例。Rust專注於安全性,而不會影響速度和性能。
創業公司也好,互聯網大公司也罷,都可以用Rust編寫各種任務,比如命令行工具、web項目、DevOps工具、嵌入式設備、生物信息學(bioinformatics)、搜索引擎、物聯網程序乃至當前大火的機器學習項目。
比如Linkerd服務網格代理是在Rust中構建的。
用Rust編寫的Qovery Engine是一個開放源代碼抽象層庫,可在短短幾分鍾內於雲提供商上輕松部署應用程序。
Dropbox使用Rust重寫了其一些核心系統,而Mozilla使用Rust構建了Firefox瀏覽器引擎。
除此之外,還有一些開發者基於Rust開發區塊鏈系統,更多在項目中使用Rust的案例可以參考該頁面https://prev.Rust-lang.org/zh-CN/friends.html。
Rust語言社區
一門語言、框架或者庫出現后,人們應用它們,不只是因為自身的強大,更是因為其背后的生態圈。
社區是培育語言生態的關鍵載體,它的繁榮也是語言流行的另一個側面。
如果想快速入門一門編程語言,相對應的開源主頁和社區是最好的老師,有完整的代碼、官方的指導文檔,豐富的配套資源。任何疑難雜症,Rust語言社區也會有同仁及時解答,大家互相促進,在一個良好的氛圍中交流學習Rust。
擺正學習態度
在了解了Rust語言基礎外圍知識之后,其次是要有一個戒驕戒躁的端正學習態度,坐得住冷板凳才能有所成。
首先,Rust的學習曲線還是比較陡峭的,入門門檻相對較高,所以學習時不要急於求成。
其次,先了解Rust語言概念,再動手實踐。磨刀不誤砍柴工,吃透基礎概念,打好地基,才能搭好房子。
最后,記住編譯器是你的老師。Rust難上手很關鍵的一點就是其嚴格的編譯器,編譯器會做盡可能多的檢查,爭取在編譯期就發現問題,消除安全隱患。所以編譯器像一個好老師,及早扼殺你的bug,強制性要求你寫出可以正常運行的正確代碼。
不同類型初學者學Rust要突破的難點
在此基礎之上,我們再看學習Rust要突破的難點。此處,將初學者分為五大類來討論。
完全零基礎的開發者:掌握計算機基礎體系知識結構,理解Rust語言和硬件/OS層的抽象,理解Rust語言核心概念、以及它的抽象模式,選擇Rust語言的某個適用領域進行實操訓練,通過實踐來提升Rust語言的熟練度和理解深度,同時掌握領域知識。
有C語言基礎:由於C語言開發者對高級語言的抽象不是很理解,所以着重了解掌握Rust所有權機制,包括所有權的語義,生命周期和借用檢查。了解Rust語言的抽象模式,主要是類型和trait;以及Rust本身的的OOP和函數式語言特性。
有C++基礎:C++開發者對於Rust語言的所有權有很好的理解能力,主要精力放在Rust的抽象模式和函數式語言特性上。
有Java/Python/Ruby基礎:着重理解攻克Rust所有權機制、抽象模式、函數式編程語言特性。
有Go基礎:Go語言開發者比較容易理解Rust的類型和trait抽象模式,但Go也是GC語言,所以所有權機制和函數式語言特性是他們的學習重點。
有Haskell基礎:Haskell系的開發者對Rust語言函數式特性能很好的理解,主要攻克所有權機制和OOP語言特性。
所以,對於有一定基礎的開發者來說,學習Rust語言要掌握的幾個關鍵概念有:
1、Rust所有權機制,包括所有權的語義,生命周期和借用檢查
所有權機制是Rust語言最核心的特性,它保證了在沒有垃圾回收機制下的內存安全,所以對於習慣了GC的開發者,理解Rust的所有權是最關鍵的一環,切記這三點:
- Rust中的每一個值都有一個被稱為其所有者 (owner)的變量。
- 值有且只有一個所有者。
- 當所有者(變量)離開作用域,這個值將被丟棄。
這其中又涉及到生命周期和借用檢查等概念,是相對比較難啃的一塊硬骨頭。
2、Rust語言的抽象模式,主要是類型和trait
trait借鑒了Haskell中的Typeclass,它是對類型行為的抽象,可以通俗地類比為其他編程語言里的接口,它告訴編譯器一個類型必須提供哪些功能語言特性。使用時要遵循一致性,不能定義相互沖突的實現。
3、OOP語言特性
熟悉面向對象編程(OOP)的常見的四個特性:對象、封裝、繼承和多態,可以更好地理解Rust的一些特性,比如impl、pub、trait等等。
4、函數式語言特性
Rust語言的設計深受函數式編程的影響,看到函數式特性,數學不好的人可能會望而卻步,因為函數式編程語言的最大特點是把運算過程盡量寫成一系列嵌套的函數調用,在Rust中,掌握閉包和迭代器是編寫函數式語言風格的高性能Rust代碼的重要一環。
具體含義和代碼說明不再贅述,大家可以參考《Rust成語設計語言》以及《Rust編程之道》。為了讓大家能更通俗易懂地理解Rust語言相關概念,特此附上華為雲專家從自身業務經驗出發學習總結的Rust資料,點擊下載。
最后,感謝張漢東老師提供的思維導圖學習框架,讓初學者能系統的了解Rust,走近這顆冉冉升起的新星。
書籍下載: Rust語言學習總結.pdf 1.96MB