將 Scheme 帶入 Web:Hoot 0.9.0 概覽
隨著 Hoot 0.9.0 的發布,函數式編程與 Web 技術的交集持續演進。Hoot 作為 Guile Scheme 的專用 WebAssembly (Wasm) 編譯器後端,有效地讓開發者能夠直接在瀏覽器中執行 Scheme。透過橋接高階 Lisp 方言與 Wasm 的效率,Hoot 為 Web 開發開啟了新的可能性,從互動式應用程式到基於瀏覽器的遊戲。
此最新版本專注於工具鏈的成熟化、透過更好的除錯支援來提升開發者體驗,以及擴展運行時的靈活性以支援標準 JavaScript 驅動的瀏覽器以外的環境。
增強工具鏈與除錯
Hoot 0.9.0 最顯著的變化之一是其除錯與元數據處理的現代化。編譯器已從舊有的函數名稱與原始碼元數據,轉向使用 DWARF custom section。
關鍵變化包括:
- 預設除錯: 預設除錯層級現在設定為 1,這會自動發出 DWARF 數據。對於生產環境,開發者可以使用
-g0或新的hoot strip命令來移除這些數據並減小二進位檔案大小。 - 標準化異常: Hoot 已從舊有的異常機制轉向標準 Wasm 異常(於 2025 年 7 月正式採用)。這確保了與不斷演進的 Wasm 規範更佳的對齊,並提升了在現代瀏覽器中的穩定性。
- CLI 精煉: 命令列介面已進行精簡。
guild compile-wasm命令現在已被棄用,改為使用hoot compile。此外,功能旗標(使用-f)已與除錯選項(使用-g)解耦,提供了程式行為與診斷輸出之間更清晰的區別。
運行時演進與非 JS 支援
雖然 Hoot 主要與瀏覽器相關聯,但 0.9.0 版本致力於支援非 JavaScript 運行時,特別提到了 Wastrel。
為了實現這一點,實施了幾項架構變更:
- 主機提供之類型: 引入了主機提供之類型 (host-provided types),促進了與 Wastrel 更好的整合。
- 基於 Scheme 的轉換: 浮點數到字串的轉換現在直接在 Scheme 中實作,而非依賴外部導入。雖然這會稍微增加二進位檔案大小,但它消除了對 JavaScript 運行時的關鍵依賴。
- Monomorphized Bignums: Bignum 導入已被單態化 (monomorphized),以減輕非 JS 運行時的負擔。
- 標準化進入點: Scheme 二進位檔案現在匯出一個
main函數來調用內部$load函數,允許 Wastrel 在不需要 Scheme 反射介面 (reflection interface) 的情況下啟動 Hoot 程式。
語言與編譯器改進
除了基礎設施之外,Hoot 0.9.0 還對 Scheme 實作與編譯器後端引入了幾項改進:
- Guile 相容性: 後端已更新以支援 Guile 3.0.11 中引入的新原始位元組向量謂詞 (primitive bytevector predicates),且
hash-set!(以及相關函數)現在會回傳傳入的值以符合標準 Guile 行為。 - Typed Arrays: 在
(hoot typed-arrays)模組中新增了新的uint8array->bytevector程序,簡化了 Wasm 與 JavaScript 之間的數據處理。 - Record Types: Scheme 解釋器現在支援具有最多 8 個欄位的
define-record-type紀錄類型,並計劃在未來的版本中進一步擴展。 - 優化:
fsqrt導入已被原生f64.sqrt指令取代,提升了效能。
實際應用:Lisp Game Jam
為了展示 Hoot 的實際效用,Spritely Institute 發布了 Hoot game jam template。此模板是為 Lisp Game Jam 設計的,並為 HTML5 遊戲開發提供了一個全面的起點,包括:
- 用於關鍵 Web API 與 HTML5 canvas 的綁定。
- 一個用於編譯與部署到 itch.io 等平台的 Makefile。
- Gamepad 輸入支援(由 Gonzalo Delgado 貢獻)。
現有的專案如 Cirkoban、Strigoform 與 Shields TYVM,皆可作為將 Scheme 的靈活性與 WebAssembly 的可移植性相結合時所能實現的範例。
相容性與安裝
Hoot 0.9.0 維持廣泛的瀏覽器相容性,支援 Safari 26+、Firefox 121+ 以及 Chrome 119+。
使用者可以透過 GNU Guix 使用 guix install guile guile-hoot 安裝 Hoot。它也正進入 Debian 儲存庫,不過發布時程可能會有所不同。對於偏好手動設定的使用者,該專案可透過 Hoot 首頁上的發布版壓縮檔取得。