HN 日本語サマリー

← 一覧へ戻る
プログラミング

純粋なSchemeによるWebプログラミングツール

A pure scheme web programming tool (goeteia.dev)

93 pointsby guenchi22 コメント

要約

Goeteiaは、純粋なSchemeで記述されたWebプログラミングツールです。コンパイラ自体もSchemeで書かれており、WebAssemblyにコンパイルされてブラウザ上で動作します。自己ホスト型コンパイラ、ネイティブWasm GCオブジェクト、衛生的なマクロ、リアルなクロージャとテイルコール、call/cc、リアクティブなWebスタック、3D/WebGLサポートなどを特徴としています。

全文翻訳

純粋なSchemeで構築 これ以外のすべてはGoeteiaによってレンダリングされます。 以下のSchemeはWebAssemblyにコンパイルされ、ブラウザでマウントされライブ実行されます。 Run コンパイラを起動中… サーバーは何もコンパイルしません — このページがコンパイラ全体(Goeteia.wasm、約70KB gzip圧縮、初回ロード後にキャッシュ)を運び、各Runは上記のソースを約15ミリ秒で再コンパイルします。 内容 バイト単位の自己ホスト コンパイラは、それがコンパイルするSchemeのサブセットで書かれています。自己ホスト型ビルドはそれ自体を再コンパイルし、出力はバイト単位で同一です — 変更のたびにCI方式で固定点がチェックされ、すべてのテストは両方のステージで実行されます。 ネイティブWasm GCオブジェクト Fixnumsはアンボックスされたi31refs、ペアとレコードはGC構造体、eq?は1つのref.eqです。JavaScriptでのシャドウヒープはありません:ホストは2つのバイトストリームインポートを提供し、それ以外は何も提供しません。 衛生的なマクロ syntax-rulesと手続き的なsyntax-case(フェンダー、ネストされた楕円、datum->syntax付き)は、衛生によるリネーミングでコンパイル時インタプリタで実行されます。 リアルなクロージャ、リアルなテイルコール 型付けされた関数参照は、高速なパーアリティエントリとクロージャごとの汎用エントリを持ちます — 可変長プロシージャとapplyは安価であり、すべてのテイルコールはreturn_callです。1億回のイテレーションを持つループは、定数スタックで約150ミリ秒で実行されます。 call/cc & dynamic-wind エスケープ継続はWasm例外処理提案に乗ります:キャプチャはO(1)、通常のパスは1つのtryブロックを要し、ワインダーは終了時に内側から外側へアンワインドします。 リアクティブなWebスタック 細かい粒度の(web reactive)シグナル上の(web sx)テンプレート、(web html)レンダラー、そしてホストに直接到達する(web js)FFI — このページはこれで構築されています。 3DとWebGL (web three)は、sxがDOMを構築するのと同じ方法でリアクティブなThree.jsシーンを構築します;(web gl)はコマンドバッファを介して生のWebGLを駆動します — フレームごとに1つのブリッジコール — シェーダーは(web glsl)でs式として書かれています。上記のタイトルはまさにこれです:ドットマトリックスグリフ、頂点シェーダー、1つの描画コール。 SchemeからSchemeへ、コーデックなし バックエンドもScheme(Igropyr)の場合、リクエストと応答はs式です — (rpc "/rpc" '(add 1 2 1/2)) は (ok 7/2) として返され、正確な比率が維持されます。(web fetch)はWasm JSPIを介して直接スタイルにします;(web ws)/(web sse)はデータムストリームをプッシュします;(web json)は他のすべてを処理します。 ライブラリ R6RSスタイルの(library ...)ファイルで、(import (math utils)) の解決、依存関係が優先されます;未使用コードは anyway で削除されるため、エクスポートは任意です。 クイックスタート $ 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はそれなしで動作します。