程式語言
內容:
摘要
問題
我哋需要為軟件揀選程式語言。我哋有兩大需求:一種適合網頁應用程式嘅前端程式語言,同一種適合伺服器應用程式嘅後端程式語言。
決策
前端我哋揀選 TypeScript。
後端我哋揀選 Rust。
狀態
已決定。如果有新嘅替代方案出現,我哋持開放態度。
詳情
假設
前端應用程式屬於典型類型:
典型用戶同互動
典型瀏覽器同系統
典型開發同部署
前端應用程式很可能快速演進:
我哋想確保開發、部署、迭代等快速簡單。
我哋重視可證明性(例如類型安全),而且我哋願意多做少少工作去達成。
我哋唔需要舊版兼容。
後端應用程式嘅要求高過典型:
對質素(尤其係可證明性、可靠性、保安等)有高過典型嘅目標。
對近乎即時有高過典型嘅目標,即係我哋唔想因為虛擬機垃圾回收而出現停頓。
對函數式編程有高過典型嘅目標,尤其係並行化、多核心處理同記憶體安全。
我哋接受較慢嘅編譯速度,以換取編譯時安全同運行時速度。
限制
我哋對可配合主要雲端供應商函數服務(例如 Amazon Lambda)使用嘅語言有強烈限制。
立場
我哋考慮過以下語言:
C
C++
Clojure
Elixir
Erlang
Elm
Flow
Go
Haskell
Java
JavaScript
Kotlin
Python
Ruby
Rust
TypeScript
論據
各語言摘要:
C:因為安全性低而被否決;Rust 幾乎所有方面都做得更好。
C++:因為一團糟而被否決;Rust 幾乎所有方面都做得更好。
Clojure:出色嘅建模;最接近嘅 Lisp;喺 JVM 上有極佳嘅運行時。
Elixir:出色嘅運行時,包括可部署性同並行;出色嘅開發者體驗;生態系統相對較細。
Erlang:出色嘅運行時,包括可部署性同並行;具挑戰性嘅開發者體驗;生態系統相對較細。
Elm:看來非常有前途;IBM 正發表取得良好成果嘅重要案例研究;生態系統較細。
Flow:比 JavaScript 有趣嘅改進;不過,開發人員正逐漸離棄佢。
Go:出色嘅開發者體驗;出色嘅並行;但有一連串削弱語言嘅壞決策記錄。
Haskell:最好嘅函數式語言;開發者社群較細;未有足夠已發表嘅生產成功案例。
Java:出色嘅運行時;出色嘅生態系統;開發者體驗欠佳。
JavaScript:史上最受歡迎嘅語言;最廣泛嘅生態系統。
Kotlin:修正咗 Java 好多問題;JetBrains 強力支持;有由 Java 移植到 Kotlin 嘅良好已發表案例。
Python:系統管理最受歡迎嘅語言;出色嘅分析工具;良好嘅網頁框架;但被 Google 放棄,轉用 Go。
Ruby:史上最佳開發者體驗;最佳網頁框架;最友善嘅社群;但非常慢;有啲難打包。
Rust:最佳新語言;強調零抽象;強調並行;不過生態系統相對較細;而且對某些編譯器加速設有刻意限制,例如直接存取記憶體需要明確標示為 unsafe。
TypeScript:為 JavaScript 加入類型;出色嘅轉譯器;開發人員越來越著重由 JavaScript 移植到 TypeScript;Microsoft 強力支持。
我哋決定,虛擬機有一組我哋目前唔需要嘅取捨,例如提供運行時能力而帶來嘅額外複雜度。
我哋相信,我哋嘅核心決策受兩個橫切關注點驅動:
如果要最快運行時速度同最緊密嘅系統存取,我哋會揀 JavaScript 同 C。
如果要接近最快運行時速度同接近最緊密嘅系統存取,我哋揀 TypeScript 同 Rust。
如果我哋想要虛擬機語言,以下虛擬機語言同網頁框架值得一提:
Clojure 同 Luminus
Java 同 Spring
Elixir 同 Phoenix
影響
前端開發人員需要學習 TypeScript。如果開發人員主要經驗係用 JavaScript,學習曲線很可能容易。
後端開發人員需要學習 Rust。如果開發人員主要經驗係用 C/C++,學習曲線很可能適中;如果主要經驗係用 Java、Python、Ruby 或者類似嘅記憶體管理語言,學習曲線就很可能困難。
TypeScript 同 Rust 都相對較新。意味住好多工具未有呢啲語言嘅文件。例如,devops 管線需要為呢啲語言設置,而到目前為止,我哋評估緊嘅 devops 工具都冇呢啲語言嘅預設例子。
TypeScript 同 Rust 嘅編譯時間相當慢。部分可能係由於語言較新。我哋可能想研究點樣紓緩緩慢嘅編譯時間,例如按需編譯、編譯並行等。
對呢啲語言嘅 IDE 支援仲未普及,亦未達一流水平。例如,JetBrains 出售 PyCharm IDE 為 Python 提供一流支援,但就冇出售為 Rust 提供一流支援嘅 IDE;反而,JetBrains 可以用 Rust 外掛,相對 Python 語言支援,提供大約 80% 嘅 Rust 語言支援。
相關
相關決策
我哋會朝住同呢啲語言配合嘅生態系統選擇進發。
例如,我哋想揀選對呢啲語言有良好能力嘅 IDE。
例如,對於前端網頁框架,我哋更可能決定採用傾向 TypeScript 嘅框架(例如 Vue),而唔係傾向純 JavaScript 嘅框架(例如 React)。
相關需求
我哋整條工具鏈都必須支援呢啲語言。
相關工件
我哋預期可能會將一些機密匯出到環境變數。
相關原則
量兩次,建一次。我哋將一定程度嘅安全優先於一定程度嘅速度。
運行時比編譯時更有價值。我哋將客戶使用優先於開發人員使用。
備註
呢度寫任何備註。