Goeteia: ブラウザ内で動作するWasm GC対応の自己ホスティングSchemeコンパイラ
Goeteiaは、ブラウザ内で自身をWebAssembly GCにコンパイルする自己ホスティングSchemeコンパイラです。サーバーは不要で、70 KB gzip圧縮のwasmブロブとリアクティブなWebスタックだけで動作します。
Goeteiaは、ブラウザ内で完全に動作するSchemeコンパイラです。このページは、SchemeソースからWebAssembly GCへライブコンパイルされており、サーバーサイドのコンパイルは一切不要です。コンパイラ全体は単一のgoeteia.wasmファイル(約70 KB gzip圧縮、初回ロード後にキャッシュ)で構成され、再コンパイルは約15ミリ秒で完了します。
完全な自己ホスティング
コンパイラは、自身がコンパイルするSchemeのサブセットで記述されています。自己ホスティングビルドは自身を再コンパイルし、出力はバイト単位で同一——すべての変更に対してCIでチェックされる不動点です。すべてのテストは両方のステージで実行され、正確性が保証されます。
ネイティブWasm GCオブジェクト
Fixnumはアンボックス化されたi31ref、ペアとレコードはGC構造体、eq?は単一のref.eqです。JavaScriptにシャドウヒープはなく、ホストは2つのバイトストリームインポートのみを提供します。
衛生的マクロと本物のクロージャ
Goeteiaはsyntax-rulesと、フェンダー、ネストされたエリプシス、datum->syntaxを備えた手続き型syntax-caseをサポートします。クロージャは型付き関数参照を使用し、引数ごとの高速エントリと可変長手続き用の汎用エントリを備えています。すべての末尾呼び出しはreturn_callであり、1億回の反復ループは約150ミリ秒で定数スタック上で実行されます。
call/ccとdynamic-wind
エスケープ継続はWasm例外処理提案を使用します。キャプチャはO(1)、通常パスは1つのtryブロックを消費し、ウィンダーは終了時に内側から外側へアンワインドされます。
リアクティブWebスタックと3D
(web sx)モジュールは、細粒度シグナル上のリアクティブテンプレート、HTMLレンダラー、JavaScript FFIを提供します。(web three)モジュールはリアクティブなThree.jsシーンを構築し、(web gl)はコマンドバッファを介して生のWebGLを駆動します(フレームあたり1回のブリッジ呼び出し)。シェーダーは(web glsl)内でS式として記述されます。
Scheme間RPC
バックエンドもScheme(Igropyr)の場合、リクエストと応答はS式です。(rpc "/rpc" '(add 1 2 1/2))は、正確な有理数で(ok 7/2)を返します。(web fetch)モジュールはダイレクトスタイルのWasm JSPIを使用し、(web ws)と(web sse)はデータストリームをプッシュし、(web json)はその他すべてを処理します。
クイックスタート
$ git clone https://github.com/guenchi/Goeteia
$ cd Goeteia
$ ./run-tests.sh
$ ./build-self.sh
$ echo '(define (fact n) (if (zero? n) 1 (* n (fact (- n 1)))))
(fact 20)' > fact.ss
$ node rt/compile.mjs goeteia.wasm fact.ss fact.wasm
$ node rt/run.mjs fact.wasm
2432902008176640000コンパイルされたモジュールは、Wasm GCと末尾呼び出しをサポートする任意のエンジン(Node 22+、最新のChrome/Firefox/Safari、wasmtime)で実行できます。ソースからのブートストラップにはChez Schemeが必要ですが、チェックイン済みのコンパイラwasmはそれなしでも動作します。
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。