SchemeをWebへ:Hoot 0.9.0の概要

関数型プログラミングとWeb技術の交差点は、Hoot 0.9.0のリリースにより進化を続けています。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をサポートするために、集中的な取り組みが行われています。

これを実現するために、いくつかのアーキテクチャ上の変更が実装されました:

  • ホスト提供の型: ホスト提供の型を導入することで、Wastrelとのより良い統合を促進します。
  • Schemeベースの変換: 浮動小数点数から文字列への変換が、外部のインポートに頼るのではなく、Scheme内で直接実装されるようになりました。これにより、バイナリサイズはわずかに増加しますが、JavaScriptランタイムへの重要な依存関係が解消されます。
  • モノモルファイズされたBignum: 非JSランタイムの負担を軽減するため、Bignumのインポートがモノモルファイズされました。
  • 標準化されたエントリポイント: Schemeバイナリは、現在内部の$load関数を呼び出すmain関数をエクスポートします。これにより、WastrelはSchemeのリフレクションインターフェースを必要とせずにHootプログラムを起動できます。

言語およびコンパイラの改善

インフラストラクチャ以外にも、Hoot 0.9.0はSchemeの実装とコンパイラバックエンドにいくつかの洗練を加えます:

  • Guileとの互換性: バックエンドは、Guile 3.0.11で導入された新しいプリミティブなbytevector述語をサポートするように更新されました。また、hash-set!(および関連する関数)は、標準的なGuileの動作に合わせて、渡された値を返すように変更されました。
  • Typed Arrays: 新しいuint8array->bytevectorプロシージャが(hoot typed-arrays)モジュールに追加され、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。
  • ゲームパッド入力のサポート(Gonzalo Delgadoによる貢献)。

CirkobanStrigoformShields TYVMといった既存のプロジェクトは、Schemeの柔軟性とWebAssemblyの移植性を組み合わせることで何が達成できるかの概念実証(PoC)の例として機能しています。

互換性とインストール

Hoot 0.9.0は、幅広いブラウザ互換性を維持しており、Safari 26+、Firefox 121+、およびChrome 119+をサポートしています。

ユーザーは、GNU Guixを使用してguix install guile guile-hootを実行することで、Hootをインストールできます。また、Debianリポジトリにも追加される予定ですが、リリース時期は前後することがあります。手動セットアップを好む場合は、プロジェクトはHootのホームページを通じてリリース用のtarballで入手可能です。

Sources