網路論壇上有許多討論這個議題的討論串,像是這個。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 在語法特性上比較短板,我們仍然可以用較直白的 (verbose) 方式來寫程式,說穿了只是換了個較樸實的手法。網頁程式是語言中立的,我們可以用不同的後端語言撰寫具有相同行為的網頁程式,所以語言特性並不是決定性的因素。
不可否認地,在相同的演算法下,Go 編譯出來的執行檔,其執行速度的確比 Rust 所編譯出來的慢;但是,對於網頁程式來說,這樣的速度通常也夠快了。網頁程式的效率瓶頸,往往不是來自網頁程式本身,而是來自其他的地方,像是資料庫、網路連線、系統架構等。如果網頁程式的效能出了問題,最好還是要先找出整個程式中真正的瓶頸加以改善,而不是一味迷信程式語言所帶來的速度差異。
Rust 在安全性上相當地著名,其代價就是相當吹毛求疵的編譯器。程式設計者往往要花上許多時間來適應 Rust 編譯器,這個過程造成生產力相對低下;但這樣的安全性是否帶來實質的益處呢?Golang 不像 C 語言那麼不安全,也不像 Rust 那麼安全,但對於網頁程式來說,其實這樣子已經足夠了。相對來說,Golang 相當簡單,有經驗的程式人可在很短的時間內上手,開始將 Go 用在實質的專案中。
Go 語言有以下的優勢,對於後端語言來說相當適合:
- 如同 Python 等動態語言般易用
- 靜態型別,更容易在編譯期抓出錯誤
- 快速編譯,使得開發迭代更密集
- 內建共時性 (concurrency) 相關語法
- 對於後端程式來說,有豐富的標準和社群函式庫
- 不需條件編譯就可以達成跨平台的程式碼
- 良好的工具鍵
- 簡單的專案架構,也不需額外的設定檔
雖然 Go 在語法特性上不算特別優秀,但整體來說,仍然是一個好的後端語言。