解決方案
科學計算早已形成一套雙語言工作流程:研究人員用 Python、MATLAB 或 R 這類動態語言做原型開發與分析,接著再把效能瓶頸的部分改寫成 C 或 Fortran。2020 年 Ars Technica 的一篇專題報導及其在 Hacker News 上的討論,把這道接縫的代價攤在眾人眼前:腳本層無法表達高效能,而快速層則既難寫又難維護。
Julia 的賭注是徹底消除這道接縫。它的編譯器運用型別推斷,以及建構於 LLVM 之上的 JIT,針對每個函式實際被呼叫時所用的具體引數型別進行編譯,因此一個動態、類數學的語言也能跑出接近精心手寫 C 的速度。多重派送(multiple dispatch)——依所有引數型別而非單一接收者來選擇方法——讓各個套件得以擴充彼此的泛型函式,獨立函式庫因此能相互組合,而不是各自包裝自己的 C 核心。
到了 2020 年,這套設計已展現出生產環境的成果,而不只是基準測試。RelationalAI 表示其雲端知識圖譜資料庫百分之百以 Julia 撰寫;Pumas 建模平台當時正出貨給製藥公司,並用於 FDA 送審資料;留言者也指出,從微分方程到數學最佳化等整個生態系中,Julia 函式庫已成為同類最佳。當時最新版本為 1.5,核心開發者主張自 1.0 以來並沒有真正的破壞性變更。
批評者也有話說:首次繪圖緩慢與啟動延遲、工具鏈不成熟,以及經過實戰考驗的函式庫比 Python 少。支持者回應,搭配 Revise.jl 的迭代式開發,加上能用單一新增方法修補單一熱點,意味著同一份程式碼既能用於探索也能用於生產——而這正是這套設計的重點所在。
達成了什麼
讓動態語言本身就能編譯到原生速度
為何奏效
型別推斷加上 JIT 特化,讓泛用且富表達力的程式碼變快,程式設計師不必為熱路徑切換語言方言。
多重派送讓套件能為其他套件的函式新增方法,因此 ODE 求解器與最佳化等生態系得以相互組合,而不是重複彼此已有的 C 核心。
科學家得以保留自己對問題的心智模型,而不必先把它重塑成符合某種效能範式,這消除了一整類改寫錯誤。
單一程式碼庫同時服務探索與生產,因此原型不會與實際運行的系統脫節。
可借鑑之處
若要消除改寫步驟,不要打造兩種語言之間更好的橋樑;要打造一種語言,讓它的表達層同時也是它的生產層。
後續發展
Ars Technica 的專題報導於 2020 年 10 月刊出,其 Hacker News 討論串獲得 284 分、212 則留言,Julia 自家的開發者也加入了論戰。這套設計理念早已由其作者在 2018 年的論文〈Julia: Dynamism and Performance Reconciled by Design〉中闡述,而 2020 年的討論串則顯示,部署案例出現在 RelationalAI 與製藥建模領域,而不只是研究原型。討論串點名的取捨——啟動延遲、工具鏈成熟度與函式庫涵蓋範圍——仍是該生態系持續面對的課題。
追溯依據
參考來源
- The unreasonable effectiveness of the Julia programming language Ars Technica · arstechnica.com
- The unreasonable effectiveness of the Julia programming language (Hacker News discussion) Hacker News · news.ycombinator.com ·