programming  

Dec 2, 2016 • Michael Chen

在早期,電腦硬體效能不足,腳本語言僅用來做簡單的工作,而大部分的應用程式還是用 C/C++ 這類編譯語言開發。後來,硬體效能逐漸進步,雖然腳本語言先天不快,相對來說,速度也足夠了。而腳本語言易於使用、開發速度快,而越來越受到歡迎。不過,在某些需要效能的時候,腳本語言就顯出其不足,這時候,用 C/C++ (或 Java) 改寫效能瓶頸的部分,再包裝成套件或模組,就是一種典型的開發模式。隨著運算速度及環境部署的需求,這類開發模式逐漸令人無法滿意,而直接回歸 C/C++ 又過於低階。著眼這一方面的需要,出現了 D、Go、Rust 等新興的編譯語言。

這類語言的共通點,在於提供了一套跨平台的語言環境,除了部分和 C/C++ 連接的部分可能會些微地受到平台的影響外,以這些語言為基礎的專案,基本上都已經是跨平台程式了。雖然,跨平台程式並不是什麼新聞,像是 Java 平台早就已經跨平台多年,而許多近代的腳本語言,像是 Python 和 Node.js (JavaScript) 等,也都是跨平台語言。但是,除了 C/C++ 以外,大部分的跨平台語言都是建置在一層執行環境上,而 D、Go、Rust 這類程式的賣點之一,在於程式碼會轉換為原生的機械碼,不需透過一層額外的執行環境,而有更佳的速度 (在有夠好的演算法的前提之下)。由一些 benchmark 可看出,和傳統的 C/C++/Java 相比,Rust 所產生的等效的機械碼大抵上有著接近 C++ 的速度,而 Go 語言的速度則和 Java 相仿。

除了程式執行速度外,開發的時程也是要考慮的。使用 D、Go、Rust 等語言,通常會有類高階語言的特性,像是字串處理、型別判斷等,使得開發時間相對縮短。不過,由於各個語言的設計方向不同,並不能一概而論地說使用這些語言就會比較簡單。像是 Go 語言使用較少的關鍵字,以及相對簡單的程式結構,使用者在一段時間的學習後,很快就能上手。而 Rust 將程式設計常犯的錯誤,提前在編譯期就引發相關的訊息,在語言的設計上也和傳統的 C-like 語言有所不同,反而較難上手。除了在語言本身的設計以外,這類新興的編譯語言,通常都會附帶相關的開發工具,像是套件管理等,使得專案的開發更容易。

除了語言本身和編譯環境外,標準函式庫和第三方函式庫的支援度,反而更顯得重要。畢竟,我們不會想要在開發專案時,還得從頭撰寫每個部分。不過,比起傳統的 C/C++/Java,這類新興語言的支援度通常相對較弱。在開始一個新的專案前,還是要自行尋找及評估相關的元件,是否有足夠的支援,或者需另行開發。隨著專案的需求不同,所需的元件也有所不同,無法一概而論,還請讀者自行嘗試搜尋及比較。

那麼,D、Go、Rust 何者較值得投注時間呢?Quora 上這篇 (及其中譯) 中有提到這三者的優缺點,可供參考。而筆者在實際學習這三者,並將其應用在實作 Exercises for Programmers 部分的習題後,在這裡提示個人的觀點:

在使用 D 語言的過程中,可以感受到 D 語言並不是很盛行,有時會難以找到相關問題的答案,一些討論區,包括 Stackoverflow 等,上面的討論串也相當老舊。如果觀察 DUB (D 語言的套件庫),可以發現 D 語言的套件其實不是很豐富。如果只是要用 D 語言實作某些演算法,應該還是可以使用 D 語言本身的特性和標準函式庫的支援來完成,但是社群的活躍度及第三方支援,是一個主要的隱憂。

在某些方面,Go 語言表現得相當亮眼,像是在伺服端軟體等,這也反映出 Google 本身實際的需求。但是,在其他的方面,Go 不一定表現得比較好。例如,到目前為止,Go 語言還是沒有官方的 GUI 函式庫,而僅靠社群各自努力。Go 語言的設計,是用一套簡單的語法來完成各種任務,很快就可以上手,但是,寫起來卻不會比較簡潔,甚至覺得有點累贅,像是 Go 語言的排序的語法就顯得有點瑣碎。這樣設計是否比較好,就看各自的解讀。最近 (2016 年 12 月) Go 語言在 TIOBE 上的排名大幅上升,值得注意。

Rust 在這三種語言中,是最難上手的,不僅是在於語法上,還有其編譯器的行為,剛開始學習 Rust 時,時常得和編譯器的錯誤訊息奮戰一番,才能順利通過編譯。而且,由於 Rust 有經過一些變革,使得網路上的一些解法反而變成錯訊的資訊,使得 Rust 的學習相對困難。目前 Rust 的能見度相對低,學習資源也相對缺乏,若想要在專案中使用 Rust,相關的評估仍不可少。不過,Rust 產生的機械碼,其執行速度,已經相當接近等效的 C++ 的機械碼的水準,真是典型的 “No pain, no gain”。

在三者之中,目前 Go 是最熱門的:

綜合上述意見,給予以下短評:

  • D 語言:相關資源相對薄弱,宜審慎考慮
  • Go 語言:若專案屬性適合,可考慮使用
  • Rust:可觀察其後續發展,目前仍需評估

[Update on 2017/02/24] 其實 Go 或 Rust 對於一些命令列小工具來說,是相當適合的語言。比起 C/C++,這類語言的編譯通常更簡單,若沒有使用到 C/C++ 的第三方函式庫,同一份程式碼即可直接在不同平台上編譯。對於字串處理或其他細節,Go 或 Rust 會比 C/C++ 來得簡單得多。編譯出來的執行檔可直接拿到其他機器上執行,會比使用腳本語言 (script language) 來得方便。

Disclaimer: 本篇內容僅代表筆者個人意見,仍需讀者自行評估適合的方案。