說明
Layered Machine Abstraction 是一種開發模式,核心結構為:
- Managed code
- C ABI
- Kernel code
本文將說明這種開發模式的 益處 與 限制。
程式語言的本質
程式語言的本質是 abstraction to machine。開發者不需要直接撰寫組合語言,而是透過更高階、更抽象的語法來思考與解決問題。
不同程式語言的差異,來自於它們所提供的 抽象層次。這引申出另一層洞見:程式語言本身不是「知識」,而是用來解決問題的 特性集。
選擇不同的程式語言,就等於選擇不同的特性集,進而決定解題的方式與邊界。
1970s 的軟體世界
當時的軟體模式是 shell scripts + C CLI。在這個架構下,shell scripts 只負責串接指令,而所有的指令實作都依靠 C。
由於 C 的抽象層次極少,許多操作細節必須自行處理,包括 記憶體管理、檔案 I/O、字串處理 等。寫過一些 C 程式就能體會:能寫出來是一種能力,但每次都要重複處理這些細節,則是一種勞務。
AWK
AWK 是一個古老的程式語言,主要用來處理文字流。如今很少開發者會撰寫完整的 AWK 程式,通常僅在命令列中使用一些簡單的 one‑liners。
然而,AWK 的當代意義在於:指令可以內嵌程式語言。這個洞見深刻影響了後來的程式語言設計,開啟了「工具與語言結合」的思路。
Perl
Perl 是一個完整的高階腳本語言。雖然語法不算優雅,但它已經具備了大部分現代語言的特性。如今,Perl 本身成為一種 niche,主要應用在系統管理、內部生產力腳本,以及既有企業專案中;但在新專案裡,Perl 已很少被選用。
Perl 的當代意義在於:它展示了 高階腳本語言的邊界。這套心智模型深刻影響了後來的 Python 與 Ruby。
Julia
Julia 是一個相對新穎的高階腳本語言,結合了 Python 的易用性 與 高效率的數值運算能力。
Julia 的突破性不在於語法,而在於 Runtime。Julia 程式碼會透過 JIT 編譯 轉換成 LLVM 中間碼,再生成機械碼,並能自動調用 BLAS、LAPACK 等高效能數值運算函式庫。
Layered Machine Abstraction
多年來,C 並沒有消失,而是其邊界逐漸改變。隨著歷史發展,C ABI 成為資訊界的共通語言,用來橋接 系統 API、社群函式庫、kernel code。
在這裡,kernel code 可能是以 C、C++、Fortran 等傳統 unmanaged code 撰寫。這些程式具備高效能,但也容易出錯,因此開發者通常將它們限縮在 效能瓶頸的步驟。
大部分的 codebase 則轉向使用 managed code,例如 Java、C#、OCaml 等。這樣能顯著減少程式錯誤,因為 managed runtime 會自動處理許多底層細節。
限制
採用 Layered Machine Abstraction 開發的專案,通常會比完全使用 unmanaged code 稍微慢一些。這是正常現象,因為安全抽象並不是免費午餐,多多少少都會帶來一定的 overhead。
然而,在大部分情境下,電腦效能往往是過剩的。以少量 overhead 換取更高的 安全性 與 開發效率,對整體 codebase 而言是值得的。
只有在 資源受限環境,才需要整個 codebase 都以 unmanaged code 開發。在這種情況下,程式錯誤很難完全消除,必須依賴 紀律、靜態程式碼檢查、測試程式 等方式來確保 codebase 的穩健性。