以Rust為例,看如何學習一門新語言?

2021-08-19 12:28:53 字數 3560 閱讀 7687

我是一名ruby程式設計師,rubyist,眾所周知ruby是一門物件導向語言,所以我就一直和物件導向打交道了好多年,雖然ruby語言也吸收了函式式語言的特性,但並不純粹,總的來說,ruby還是一門物件導向語言,它的抽象程度很高。我個人也不是乙個對程式語言有特別偏好的那種人,我認為每種語言都有其適用場景,語言背後的思想才是最重要的。一直搞ruby,現在感覺是時候從乙個ruby程式設計師成長為程式設計師了。

我聽說rust語言,是在去年差不多這個時候,rust語言1.0版正式發布。 當時還有很多新的語言:golang、elixir、crystal等,但是在我眼裡,最具鮮明特點的語言就是rust, 當然elixir也是非常不錯的語言,我也在同時學習elixir,但主要的精力還是側重在rust的學習之上。

rust的鮮明特點主要有:

其實當時在選擇rust學習之前,我正在尋找一門新的語言去學習,主要是為了滿足我以下學習需求:

因為一直專注於ruby語言,ruby語言的抽象度高,所以我想找一門系統程式設計領域的語言去深入學習,用於擴充套件自己的知識體系。考慮過c++,但是傳說中沒有人能精通c++,以這點來看,我還不敢踏入其中,怕是個無底洞。c語言,自己也了解,但是說實話,我對使用c暫時還提不起興趣。

也想找一門函式式程式設計正規化的語言深入學習一下,比如haskell,單從語法層面,感覺不是很好,不如rust吸引我。rust的縮寫關鍵字,以及很多語法結構,我看著都比較親切。

就在我選擇的時候,正好趕上了rust發布了1.0,就想去好好了解了一下,感覺學習rust,正好可以同時滿足自己的學習需求,更重要的是,rust語言的設計,深深的吸引了我,比如無gc,但可以實現記憶體安全,這就強烈的引起了我的好奇心,想去了解它;再比如無vm的特性,直接編譯為llvm ir,個人認為llvm也是值得花時間學習的,畢竟是個趨勢;再比如rust的型別系統,值得好好花時間去學習一下型別系統對於一門語言來說是多麼的重要,我用ruby完全沒有這種感覺。綜合這些原因然後就選擇了rust。

至於rust未來的發展如何,能找到多少錢工資的工作,我完全沒有關心過,我學習rust的唯一目的,就是擴充套件自己的知識體系。

所以,現在知道了,我學習rust之前的背景是:無系統程式語言基礎。

對於了解過rust的人都知道,rust的概念相當多:

所有權、租借、生命週期、copy/clone

記憶體布局、scope

函式trait

智慧型指標

safe和unsafe

巨集還有兩種: 普通巨集(macro_rules!定義的)與 可以定義編譯器外掛程式的procedural macro

包系統安全的多執行緒併發程式設計

option/result 錯誤處理

上面的很多概念,對我來說,熟悉而又陌生。但是陌生的還是佔絕大多數,有c++或haskell基礎的人,學rust也許可以快速上手,但是對於我來說就不行了。面對這些概念,我告訴自己,一定要冷靜!內心降到絕度零度!

冷靜以後,我規劃了下列的學習路線:

首先,我要分別理清楚這些概念分別是什麼

其次,遵循rust的設計原則,理清這些概念背後的脈絡

實戰中深入學習。

理清概念的過程比較曲折。

第一遍,先是從 rust官方出的rust book看起,但是此書組織的很不科學,不適合我這樣的初學者,書本並非循序漸進的,所以後來rust官方也重寫了這本書,進度比較慢,還未發布。

硬著頭皮看了一遍,概念依然不夠清晰,但是概念看的多了,最少讓我消除了對rust的陌生感。

第二遍,跟著rust by example邊練習邊學習, 但是練到第八章內容就感覺很困難了,還是卡在了概念上。再加上工作也比較忙,於是我就暫停學習了。

一晃就大半年過去了。。

第三遍開始,是緣於rust社群mike組織了rustprimer一書,記得是去年春節前組織的,沒幾個月就寫完了,讓我感受到了社群的激情。rustprimer看完一遍,再加上線上對大神們的請教,對於一些關鍵概念,比如所有權,大概清楚是怎麼回事了。

雖然有些概念清楚了,但感覺自己對rust的認識還是零零碎碎的,這些概念並沒有形成自己的知識體系。學習一門新語言,我的做法是先從它的設計哲學開始,把該語言的所有概念串起來,這些概念不可能是零散的,尤其是對一門高度一致性的語言來說。如果這些概念沒有形成體系,我就無法開始對這門語言的程式設計實踐,因為心裡沒底。

我們來看一下rust官網的介紹:rust 是一門高效能、記憶體安全,並保證執行緒安全的系統程式語言。

一門語言的語言特性,是為它的設計目標服務的。

那麼第乙個目標:高效能,是如何實現的呢?基於llvm,無gc,低執行時開銷,零成本抽象,rust有個強大的編譯器。

後二個目標: 記憶體安全。在我學習的過程中,一度以為用rust寫**,就肯定是安全**了,也一度以為,rust只有所有權機制是為這個目標服務的。到後來才發現自己的認識是錯誤的。首先記憶體安全這個概念很大,我現在認為它包含了四點:

記憶體安全。基於所有權機制,但也並非只有所有權,還有copy/clone等行為;以及記憶體布局預設在棧上分配記憶體,而把堆分配做為可選;生命週期避免了懸空指標;raii機制來保證分配的內存在出了作用域就得到自動釋放;這些相關語言特性都是來保證記憶體安全。

沒有絕對的安全。rust為你提供安全機制,也為你提供不安全的分界線。所有權機制是有界限的,也就是說安全是有界限的,rust允許你把安全和不安全的**分開,這樣更容易保證安全。比如當你呼叫ffi、解構裸指標等。

型別安全。強大的trait,可以靜態分發,也可動態分發;以及基於trait的泛型機制,adt/模式匹配的支援,option/result型別安全的錯誤模式;嚴格的編譯器型別檢查。

併發安全。基於所有權機制,rust只保證併發中的記憶體安全,而不保證避免資料競爭的條件之類的併發問題。而rust裡保證執行緒安全的兩個記號trait,sender和sync都是基於unsafe trait實現的。

我們也知道rust是一門多正規化語言。剛開始學的時候,我有個疑問:多正規化語言,那麼平時程式設計的時候側重哪種正規化呢?後來發現我的問題是多餘的。多正規化語言只是一些語言特性,它的目標還是為記憶體安全目標服務。

基於struct和impl,加上方法呼叫語法,可以寫出物件導向正規化的**。比如可以寫出像ruby的鏈式呼叫**。而基於trait的唯一介面方式,簡化了所謂的多型,也為型別系統提供了方便。

rust也支援了函式式語言特性,包含高階函式、閉包、強大的模式匹配等機制。

rust的元程式設計能力也是非常棒的,最常用的是普通巨集 macro_rule!, 這其實是乙個特殊的函式,依賴強大的模式匹配,幫助你進行語法擴充套件。你所要做的,就是寫出你要實現的巨集的分詞規則。另外一種就是procedural macro,可以用來實現編譯器外掛程式,它是直接操作ast,但是這個巨集感覺不如lisp系語言那種直接暴露ast操作起來爽。據說未來版本還會增強procedural macro的能力。

再乙個就是智慧型指標系列,說實話,我對這部分內容還是不太理解,只知道它是rust所有權機制的補充,為了滿足更多的程式設計需求。

rust的另乙個特點就是工程化工具很棒,cargo,可以快速幫你構建乙個工程。不過至今我還沒有寫過乙個完整的工程,這是我的下一步學習計畫。

最終,我的腦中就串起了圖中這些的概念結構,我認為現在rust對我來說一點都不神秘了。我終於可以心裡有底的踏出下一步了。

高畫質版:

如何學習一門新的知識

想要學習一門新的知識,我認為需要從以下幾點入手。有了獲取知識的材料後,還要有能夠讓你動手實踐的環境。以學習python為例,我們可以使用簡單的文字編輯器來編寫 也可以使用python自帶的idle,還可以使用第三方的ide,例如我在 最好的python ide eclipse pydev 說的ecl...

如何學習一門新的技術

作為乙個從事軟體開發工作多年的程式設計師,技術是在不斷變化,我們在做乙個專案的過程中,會遇到很多新的技術,我們可以看到那些多年前的技術大牛,現在依然是技術大牛,那麼原因是什麼呢?原因很簡單,因為他們從來沒有間斷過學習,遇到新的技術,他們會按照自己的方法,及時去學習,實戰。那麼問題來了,對於我們這些技...

如何學習一門技術

第一步 what 1 這個技術是什麼,本質是什麼?2 這個技術的核心模組有哪些,核心架構是什麼?3 整體流程,細節流程,核心模組的細節分析 核心原理,核心類,流程圖 第二步 why 1 為什麼要使用,解決什麼問題,是否替代方案?2 版本有哪些,每個版本的新增特性,解決問題?3 優缺點是什麼,與同類技...