介紹

注意:本書的(英文)版本與出版的 The Rust Programming Language 以及電子書版本的 No Starch Press 一致。

歡迎閱讀 Rust 程式設計語言,這是一本 Rust 的入門書籍。Rust 程式設計語言能幫助你寫出更快更可靠的軟體。在設計程式語言時,「上層的易讀易用性」與「底層的掌控性」經常難以取捨。Rust 直接挑戰這個矛盾。Rust 在強大的技術能力與良好的開發者體驗之間取得平衡,讓你能控制底層的實作細節(比如記憶體使用),但免於以往這樣的控制所帶來的相關麻煩。

Rust 適用於誰

Rust 的各種特長讓它適用於很多人,我們來討論一些最重要的客群。

開發團隊

Rust 被認定是一個有生產力的工具,讓能力不均的大型系統程式設計團隊能夠協同開發。底層程式碼容易產生難以察覺的錯誤,在多數其他語言中,只能靠大量的測試、以及經驗豐富的開發者小心翼翼地審核程式碼,才能找出它們。而在 Rust 中,編譯器扮演著守門員的角色阻擋這些難以捉摸的程式錯誤,包含並行(concurrency)的錯誤。透過與編譯器一同合作,開發團隊可以將他們的時間專注在程式邏輯,而不是成天追著錯誤跑。

Rust 也將一些現代化的開發工具帶入系統程式設計的世界中:

  • Cargo 是個管理依賴函式庫與建構的工具,讓新增、編譯與管理依賴函式庫變得十分輕鬆,並在 Rust 生態系統維持一致性。
  • Rustfmt 工具確保開發者遵循統一的程式碼風格。
  • Rust Language Server 為整合開發環境(IDE)提供了程式碼補全與行內錯誤訊息。

透過使用這些工具、以及其他 Rust 生態系統中的工具,開發者在寫系統層級的程式時更有生產力。

學生

Rust 適合學生以及那些對學習系統概念有興趣的人。許多人透過 Rust 學會相關主題,例如作業系統開發。社群的人都非常友善,且樂於解答學習者的問題。如同對本書的投入,Rust 團隊致力於讓系統概念深入人心,尤其是剛開始學習程式設計的人。

公司

已有大大小小數以百計的公司,在正式生產環境中使用 Rust 來處理各種任務,包含命令列工具、網路服務、DevOps 工具、嵌入式裝置、影音分析與轉碼、加密貨幣、生物資訊、搜尋引擎、物聯網應用、機器學習,甚至是 Firefox 瀏覽器的主要部分。

開源開發者

Rust 適用於想要建構 Rust 程式設計語言、社群、開發工具與函式庫的開發者。我們很樂於看到你願意對 Rust 語言貢獻。

重視速度與穩定性的開發者

Rust 適用於追求語言速度與穩定性的開發者。所謂的速度,我們指的是 Rust 程式碼的執行速度以及 Rust 讓你能開始撰寫程式碼的速度。Rust 編譯器的檢查能確保新增功能與重構時的穩定性。這與沒有這些檢查的語言形成對比,開發者通常不敢修改其脆弱的遺留程式碼。Rust 還力求無成本抽象化(zero-cost abstractions),高階的特性編譯成底層程式碼後,執行的速度能像手刻一樣快。Rust 致力於讓安全的程式碼同時也能是執行迅速的程式碼。

這裡提及的僅是一部分的最大受益者,Rust 語言期許能支援更多其他使用者。總體來說,Rust 最大的野心是消除數十年來開發者不得不作出的取捨,像是提供安全性生產力、具有速度易讀易用。歡迎嘗試 Rust,看看這門語言適不適合你。

本書寫給誰看

本書假設你已經使用其他程式語言寫過程式碼,無論哪種語言。我們會試著讓不同背景的開發者能理解內容,但我們不會花費很多篇幅談論什麼是程式設計或教你怎麼寫程式。如果你剛開始學習程式語言,一本專門介紹程式設計的書籍會更適合你。

如何閱讀本書

一般來說,本書預設你會從前往後依序閱讀。後面的章節建立在前面提到的概念上,並且前面的章節不會深入某特定主題,而於後面的章節再議。

你會發現本書有兩種類型的章節:概念章節與專案章節。在概念章節中,你會學到 Rust 的某些概念。在專案章節中,我們會一起應用當前所學來做小專案。第二、十二和二十章是專案章節,其餘是概念章節。

第一章會解釋如何安裝 Rust、如何寫支「Hello, world!」程式以及如何使用 Cargo--Rust 的套件管理與建構工具。第二章透過實作一款猜數字遊戲的程式來介紹 Rust。我們在此提及大概的觀念,並在之後的章節提供更詳細的介紹。如果你想馬上動手實作看看的話,第二章會很適合你。第三章會涵蓋 Rust 與其他程式設計語言類似的功能。第四章則會學習 Rust 的所有權系統。如果你是嚴謹派的讀者、傾向先學習所有細節再進入實作,你可能會想跳過第二章直接前往第三章。當你想要應用學到的細節時,再回到第二章練習。

第五章討論結構體與方法,而第六章涵蓋列舉、match 表達式與 if let 控制流程的語法。你會在 Rust 中用結構體與列舉來自訂型別。

在第七章中,你會學到 Rust 的模組系統與隱私規則,讓你可以組織程式碼以及其公開應用程式介面(Application Programming Interface, API)。第八章會討論標準函式庫提供的一些常見集合資料結構,像是向量、字串與雜湊映射。第九章會探討 Rust 的錯誤處理哲學與技巧。

第十章將深入探討泛型、特徵(traits)與生命週期,讓你能定義出能套用多種型別的程式碼。第十一章都在討論測試,就算有 Rust 的安全性保障,還是必須透過測試來確保你的程式邏輯正確。在第十二章中,我們會動手實作 grep 命令列工具的部分功能,可以搜尋檔案中的文字。我們將會應用前幾章討論過的許多概念。

第十三章會探索閉包與疊代器,這是 Rust 借鑒函式程式設計語言的功能。在第十四章中,我們要更深入研究 Cargo 並討論分享函式庫給其他人的最佳方式。第十五章會討論標準函式庫提供的智慧指標以及能啟用它們功能的特徵(traits)。

在第十六章中,我們會介紹各種不同的並行程式設計模型,並談論 Rust 如何幫助你無懼地開發多執行緒的程式。第十七章會拿 Rust 的慣用風格與你可能較熟悉的物件導向程式設計原則作比較。

第十八章涉及模式與模式配對,它們的強大力量讓你能用 Rust 表達更多概念。第十九章是進階主題的大雜燴,其中包含:不安全(unsafe)的 Rust、巨集、以及更多關於生命週期、特徵、型別、函式與閉包的介紹。

在第二十章中,我們會完整實作一個底層跑多執行緒的網頁伺服器!

最後,以參照的方式收錄本語言的一些實用資訊。附錄 A 涵蓋 Rust 的關鍵字、附錄 B 涵蓋 Rust 的運算子與符號、附錄 C 涵蓋標準函式庫提供的可推導的特徵(derivable traits)、附錄 D 涵蓋一些實用開發工具,然後附錄 E 會解釋 Rust 的版號。在附錄 F 中你可以找到本書籍的各種翻譯版本,然後在附錄 G 我們會講解 Rust 的開發流程以及什麼是每夜版(Nightly)Rust。

本書沒有錯誤的閱讀方式--如果你想要跳過一些章節,儘管跳過吧!後面也許會遇到不懂的地方而需要回頭去看。總之用最適合自己的方式閱讀。

學習 Rust 的過程中有個重要的部分--學習如何閱讀編譯器顯示的錯誤訊息,讓訊息引導你寫出正確的程式碼。因此,我們特意提供很多無法編譯的範例,以及編譯器對應顯示的錯誤訊息。如果你隨意挑一則範例執行的話,它可能無法編譯喔!請務必看看範例旁的文字來瞭解該範例是不是故意出錯。可愛的吉祥物 Ferris 也能幫助你分辨哪些程式碼本來就無法運作:

Ferris意思
Ferris 有疑問此程式碼無法編譯!
Ferris 兩鉗一攤此程式碼會恐慌!
Ferris 舉鉗聳肩此程式碼不會產生預期的行為。

在大多數的情況下,我們會引導你將無法編譯的程式碼寫成正確的版本。

原始碼

產生本書的原始檔案可以在 GitHub 上找到。