將 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 貢獻)。

現有的專案如 CirkobanStrigoformShields TYVM,皆可作為將 Scheme 的靈活性與 WebAssembly 的可移植性相結合時所能實現的範例。

相容性與安裝

Hoot 0.9.0 維持廣泛的瀏覽器相容性,支援 Safari 26+、Firefox 121+ 以及 Chrome 119+。

使用者可以透過 GNU Guix 使用 guix install guile guile-hoot 安裝 Hoot。它也正進入 Debian 儲存庫,不過發布時程可能會有所不同。對於偏好手動設定的使用者,該專案可透過 Hoot 首頁上的發布版壓縮檔取得。

Sources