Rust 是我最喜歡的語言之一!5 個我大推 Rust 的原因

過去在學校與工作中,我接觸過許多程式語言,例如 C++, Kotlin, Python, TypeScript 等等,他們都有各自擅長的領域和優缺點。而 Rust 作為一門相對較新的語言,我也在近期開始學習,並實際投入到這個 Blog 網站後端的開發上。雖然入門門檻有點高,但它也確實給了我相當好的開發體驗,可以說是我目前最喜歡的程式語言之一。在這篇文章中,我想分享 5 個我大推 Rust 的原因,並跟其他語言的使用經驗做比較。

2026-01-31

Rust 是靜態且強型別的語言

變數操作就是記憶體存取,也是語言的核心概念之一,通常在看一門新語言時,我會先了解去了解變數的使用方式,包括函數的參數傳遞。對我來說,我特別偏愛靜態且強型別的語言,因為這樣可以在編譯階段就捕捉到許多潛在的錯誤,減少執行時的 Bug。

要找到一門同時具備靜態且強型別的語言並不容易:C/C++ 是靜態型別但不夠強型別,它會在一些情況下做隱性的型別轉換;Python 雖然是強型別,但它是動態型別的,在函數參數傳遞時,更因為有參數解包的機制,是許多人在 Python 中使用第三方函式庫的夢魘;至於 JavaScript 就不用提了,它是我最不能接受的動態弱型別語言,雖然 TypeScript 有改善這個問題,但也僅限在編譯階段,執行時仍然是 JavaScript 的行為。

型別比較圖

一個語言是靜態且強型別意味著,我在撰寫程式時,可以不需要擔心型別轉換的問題,只要編譯能通過,就代表型別是正確的。在做不同型別之間的運算時,所有型別轉換都是顯性的,雖然會增加一些撰寫程式的負擔,但也大幅降低了執行時出錯的機率,這對我來說是非常值得的。

所有權機制塑造強大的記憶體安全性

再來就要提到 Rust 最大的特色:所有權 (Ownership) 機制。

過去若我們想要寫出高效能、與系統資源直接互動的程式,通常會選擇 C/C++ 這類的語言,它們擁有指標 (Pointer) 的概念,讓我們能直接操作記憶體,對系統資源進行精細的控制。但也正是因為這樣的特性,讓記憶體的處理需要更加謹慎小心:首先開發者需要手動管理記憶體的分配與釋放,就容易發生空指標 (Null Pointer)、記憶體洩漏 (Memory Leak)、緩衝區溢位 (Buffer Overflow) 等問題,導致程式崩潰或是安全漏洞;在多執行緒的環境下,同時存取同一塊記憶體,則容易發生資料競爭 (Data Races) 問題,導致不可預期的行為。

而 Rust 的所有權機制,則是透過編譯器在編譯階段就檢查記憶體的使用情況,確保每一塊記憶體都有唯一的擁有者 (Owner),在離開作用域時,記憶體會自動釋放。這裡聽起來似乎很像垃圾回收 (Garbage Collection) 的概念,但實際上 Rust 並沒有垃圾回收機制,這些都是在編譯階段就完成的,執行時不會有額外的負擔。

由於必須保證只有一個 Owner,在呼叫函數時,變數的所有權會被移動到函數中,這樣就避免了多個指標同時指向同一塊記憶體的問題,從而防止了資料競爭的發生。同時,Rust 也提供了借用 (Borrowing) 的機制,允許我們在不取得所有權的情況下,擁有對變數的引用 (Reference),可以是可變 (Mutable) 或不可變 (Immutable) 的,而同一時間只能有一個可變引用,或多個不可變引用,這樣的設計進一步確保了記憶體的安全性。

對於第一次接觸 Rust 的人來說,所有權機制確實會帶來一些學習上的挑戰,當看到滿江紅的 IDE 錯誤時會開始懷疑人生,但這正是編譯器檢查到了潛在的記憶體問題,讓我們能在開發階段就修正它們,不會成為正式版本的 Bug。

無所不能的 Macros

說到 macros,又要拿 C/C++ 來比較了。C/C++ 的 Macro 似乎什麼都能做,但實際上也只是文字替換而已,沒有任何型別檢查,在 debug 時也很難追蹤 macro 展開後的內容。相較之下,Rust 的 macro 可以說是變態等級的強大,它是基於語法樹 (AST) 的操作,有自己一套匹配的機制,撰寫 macro 就像是在設計一個小型的程式語言一樣,可以進行複雜的邏輯處理,並且在編譯階段就進行型別檢查,確保生成的程式碼是正確的。

當然對於我們一般開發者來說,不一定會需要撰寫 macro,但許多 library 都會利用 macro 來提供更方便的 API。例如我在開發這個 Blog 網站的後端時,使用 sqlx 這個 ORM library,我可以直接在程式碼中撰寫 SQL 語句,並且在編譯階段就檢查 SQL 語句的正確性,而且能夠與資料庫 schema 做比對,確保欄位名稱和型別都是正確的,第一次使用時真的讓我驚艷不已。

sqlx 的 macro 使用展示

擁有許多現代語言的優點

不知道大家有沒有使用過一些年輕的程式語言,他們誕生的目的可能是為了一個開發框架,或是為了解決舊語言的一些問題,像是 Kotlin 之於 Java,Swift 之於 Objective-C。他們因為少了歷史包袱,可以直接捨棄那些過時的設計,並加入更符合現代開發需求的特性,甚至在發展的過程中,還能參考其他語言的優點,讓語言本身更加完善。

Rust 作為一門相對新的語言,也具備了許多現代語言的優點。例如擁有模式匹配 (Pattern Matching) 的功能,讓我們可以更方便地處理複雜的資料結構;擺脫 try-catch 容易忽略錯誤處理的問題,改用 Result 和 Option 類型,強迫開發者必須有意識地處理錯誤和空值;tuple 和 struct 的解構賦值,讓我們可以更簡潔地操作資料......。

// 回傳 Ok() 或 Err() 表示是否錯誤發生
fn foo() -> Result<i32, String> {}

fn main() {
    // 透過 pattern matching 比對結果
    match foo() {
        // 使用 println macro 輸出
        Ok(val) => println!("Success: {}", val),
        Err(reason) => println!("Error: {:}", reason),
    };
}

Rust 也非常重視函數式程式設計 (Functional Programming) 的概念,提供了許多高階函數的操作。在此同時,Rust 也有 struct, trait 等物件導向程式設計 (Object-Oriented Programming) 的特性,讓我們可以根據需求選擇適合的設計模式。

不過 Rust 最厲害的地方,在於它提供的這些特性,都是基於零成本抽象 (Zero-Cost Abstractions) 的理念設計,這表示我們在使用這些高階特性時,不會帶來額外的執行時開銷,編譯器會將它們優化成與手寫程式碼相同的效能,這對於追求高效能的系統程式設計來說,是非常重要的。

優秀的工具鏈與生態系統

除了語言特性外,工具鏈的使用體驗也是影響開發效率的重要因素。Rust 擁有一個非常優秀的工具鏈,最著名的就是 Cargo,它同時是 Rust 的套件管理工具,也是建置系統。透過 Cargo 我們可以輕鬆地管理專案的相依性、安裝第三方 library、執行測試、build 專案等等,這些操作都能透過簡單的指令完成。

Rust 的生態系統也非常豐富,涵蓋了各式各樣的領域,包括網頁開發、系統程式設計、嵌入式系統、資料科學等等。無論是想要開發 Web 伺服器、CLI 工具,還是進行低階的系統開發,都能找到適合的 library 和框架。並且它們大多也都有完善的文件和範例,讓我們能夠快速上手。


如果上面提到的這些特性,能夠解決你在其他語言中遇到的問題,那麼我非常推薦你可以嘗試看看 Rust。雖然學習曲線可能有點陡峭,但一旦掌握了它的核心概念,你會發現 Rust 帶來的開發體驗是非常爽快的!

這是我的「BlogBlog 同樂會 - 2026 年 1 月」的投稿文章。本月主題是「推坑」,由 Wiwi 主持。如果你有自己的部落格,歡迎一起來參加!