技術雜談:Rust 或 Go (Golang) 何者較適合做為後端語言

PUBLISHED ON SEP 8, 2018
FacebookTwitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    網路論壇上有許多討論這個議題的討論串,像是這個。Rust 和 Golang 分別問世將近十年,這段時間已經足以了解其趨勢,從相關流行度統計來看,Golang 是很明顯的優勝者。部分程式設計者可能會感到疑惑,明明 Rust 具有許多 Golang 沒有的優勢,為什麼 Golang 反而比較流行呢?

    理論上 Rust 和 Golang 不應該放在同一個基準點上來比較。Rust 基本上是強化過安全性的 C++;和 C++ 類似,Rust 的語言特性也相當豐富。相對來說,Golang 設計理念向 C 靠攏,但其實是和 Java 類似的應用程式語言,而非 C (或 C++) 般的系統程式語言。但是,就像 C++ 也是可以拿來當做另一個 (困難版的) Java,用來寫應用程式,Rust 和 Go 其實也是有部分重疊的目標族群,自然就成了一時瑜亮,就像本文討論 Rust 和 Golang 在後端語言上的應用。

    Rust 比起 Golang,有以下優勢:

    • 更豐富的語法特性
    • 在相同的演算法下,編譯出來的執行檔更快
    • 安全性更高

    然而,這些優勢並沒有讓 Rust 在後端語言上比 Golang 更流行,這是為什麼呢?

    除非我們的目標是打造新的程式語言,語法特性是撰寫應用程式的手段,而非目的。在儘量保持良好的工程性下,最重要的還是最終的產品 (即應用程式),而程式語言僅僅是將想法轉為可運行的電腦程式的中間媒介。雖然 Go 在語法特性上比較短板,我們仍然可以用較直白的方式來寫程式,說穿了只是換了個手法。網頁程式是語言中立的,我們可以用不同的後端語言撰寫具有相同行為的網頁程式,所以語言特性並不是決定性的因素。

    不可否認地,Go 編譯出來的執行檔,其執行速度的確比 Rust 所編譯出來的慢,但是,對於網頁程式來說,這樣的速度通常也夠快了。網頁程式的效率瓶頸,往往不是來自程式語言本身,而是來自其他的地方,像是演算法、資料庫、網路連線、系統架構等,最好還是要先找出真正的瓶頸來源加以改善,而不是一味迷信語言所帶來的速度。

    Rust 在安全性上相當地著名,其代價就是相當吹毛求疵的編譯器。程式設計者往往要花上許多時間來適應 Rust 編譯器,這個過程造成生產力相對低下;但這樣的安全性是否帶來實質的益處呢?Golang 不像 C 語言那麼不安全,也不像 Rust 那麼安全,但對於網頁程式來說,其實這樣子已經足夠了。相對來說,Golang 相當簡單,有經驗的程式人可在很短的時間內上手,開始將 Go 用在實質的專案中。

    Go 語言有以下的優勢,對於後端語言來說相當適合:

    • 如同 Python 等動態語言般易用
    • 靜態型別,更容易在編譯期抓出錯誤
    • 快速編譯,使得開發迭代更密集
    • 內建共時性 (concurrency) 相關語法
    • 對於後端程式來說,有豐富的標準和社群函式庫
    • 不需條件編譯就可以達成跨平台的程式碼
    • 良好的工具鍵
    • 簡單的專案架構,也不需額外的設定檔

    雖然 Go 在語法特性上不算特別優秀,但整體來說,仍然是一個好的後端語言。