Ant: 從零開始構建的輕量級 JavaScript Runtime

JavaScript runtime 的領域通常由 Node.js、Bun 和 Deno 等巨頭主導,這些 runtime 都依賴於 V8 或 JavaScriptCore 等龐大的引擎。雖然這些引擎提供了強大的功能,但它們也帶來了二進位檔案大小和記憶體開銷的顯著成本。Ant 正是為了解決困擾現代 CLI 工具和容器化應用程式的「runtime 臃腫」問題而從零開始設計的 JavaScript runtime。

極簡主義 Runtime 設計哲學

大多數現代 runtime 都是現有瀏覽器引擎的封裝。雖然這種方法可以實現快速開發和高性能,但導致的二進位檔案大小通常在 50MB 到 100MB 之間。對於交付 CLI 工具或輕量級 Docker 容器的開發者來說,這種開銷是一個顯大的瓶頸。

Ant 採取了不同的方法,從底層開始實現自己的引擎,稱為「Ant Silver」。透過避免對 V8、JSC 或 SpiderMonkey 的依賴,作者成功地將二進位檔案大小保持在極小的規模:標準構建版本約為 9MB,在使用 -Os 優化編譯時甚至低至 6.5MB。

效能與冷啟動

較小 runtime 的主要優點之一是減少冷啟動延遲。這在 Serverless 環境或 CLI 應用程式中尤為關鍵,因為首次執行的時間是性能最顯著的指標。

根據在 M4 Pro 晶片上使用 Hono 冷啟動測試 (examples/npm/hono/bench-coldstart.js) 進行的基準測試,Ant 展示了令人印象深刻的速度:

  • 冷啟動時間: ~5ms
  • 比較: 比 Bun 快約 2.4 倍,比 Node.js 快 5.8 倍。

雖然作者指出 Ant 在特定形狀和場景下具有足以與 V8 競爭的效能,但必須認識到這是一個專業化工具。其重點在於效率和敏捷性,而非在所有可能的 JavaScript 工作負載中提供原始的通用型吞吐量。

技術架構與相容性

從零開始構建一個 runtime 需要對語言規範和 API 相容性採取嚴謹的方法。Ant 專注於以下技術里程碑:

引擎與 JIT

Ant Silver 是驅動 runtime 的核心引擎。為了確保未來的效能提升,該專案正在實現 Just-In-Time (JIT) 編譯器,目前使用 MIR (Mid-level Intermediate Representation) 的一個分支作為其後端。

標準合規性

為了確保在現實世界中的實用性,Ant 以 WinterCG Minimum Common API 為目標,旨在實現一套可在不同 runtime 之間通用的標準化 API 集。其目前的相容性狀態如下:

  • javascript-zoo compat-table: 100% 通過率。
  • test262: 約 64% 完成度。

Ant 的使用場景

Ant 並非旨在取代 Node.js 用於大型企業級後端,而是填補了特定架構需求的關鍵空白:

  1. 嵌入式 CLI 工具: 在不需要使用者安裝沉重的 runtime 環境的情況下,交付 JavaScript 驅動的 CLI。
  2. 微型容器 (Micro-Containers): 減少 Docker 鏡像的佔用空間,以加快雲端原生環境中的部署和擴展。
  3. 邊緣運算 (Edge Computing): 利用極速的冷啟動時間,用於對毫秒級延遲極其敏感的事件驅動函數。

透過優先考慮二進位檔案大小和啟動速度,Ant 為需要 JavaScript 的靈活性卻不想承受傳統引擎負擔的開發者提供了一個可行的替代方案。

Sources