位元詩人 Layered Machine Abstraction

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

說明

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 的當代意義在於:它展示了 高階腳本語言的邊界。這套心智模型深刻影響了後來的 PythonRuby

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 的穩健性。

關於作者

位元詩人 (ByteBard) 是資訊領域碩士,專注於從探索到產品的開發過程,並以工具驅動的方式改善專案。喜歡以開源專案作為成果,回饋社群。

主要方向包括:自用工具的打磨 (dogfooding)、編譯器技術在工具開發中的應用,以及將研究轉化為可維護的開源成果。

除了技術之外,也喜歡日本料理和黑咖啡,偶爾自助旅行,將生活中的靈感融入技術隨筆。