Clysm — Common Lisp を WebAssembly にコンパイルするコンパイラ
概要
Clysm は Common Lisp のコードを WebAssembly に変換してブラウザや Wasm 実行環境で動作させることを目的としたコンパイラです。特徴は Wasm の GC 提案(WasmGC)を利用して Lisp のヒープオブジェクトを Wasm 側のガベージコレクタで管理できる点にあり、これにより cons や構造体、クロージャのような動的オブジェクト表現を比較的自然にマップできます。インストールは ASDF/Quicklisp 経由で行い、簡単な API で式からモジュールを生成して .wasm ファイルへ保存できます。実験的なプロジェクトであり、アーキテクチャやデモ、サンプルコードがリポジトリに含まれます。
リポジトリの統計情報
- スター数: 4
- フォーク数: 0
- ウォッチャー数: 4
- コミット数: 30
- ファイル数: 18
- メインの言語: Common Lisp
主な特徴
- WasmGC(WebAssembly GC 拡張)を利用して Lisp のガベージコレクションを実現する試み。
- Common Lisp の式を受け取り WebAssembly モジュールを生成、.wasm ファイルへ保存する API。
- ASDF と Quicklisp による簡単な導入手順をサポート。
- サンプル(例:階乗)やアーキテクチャ文書で設計思想を参照可能。
技術的なポイント
Clysm の技術的核は「動的言語である Common Lisp のオブジェクトモデルを Wasm の静的/型付き世界にどう落とし込むか」です。Wasm の GC 拡張を使うことで、Lisp のヒープオブジェクト(cons、配列、構造体、クロージャなど)を Wasm のガベージコレクタ管理下に置けるため、従来の手動ヒープ管理や独自の GC を持ち込む必要性が減ります。実装面では Lisp の値を boxed(ポインタ)/unboxed(即値)で扱い、タグ付けや型判定をランタイムレベルでサポートする設計が想定されています。
コード生成部分は、Common Lisp の式(S式)を中間表現に変換し、それを Wasm の命令列にマッピングする段階を踏みます。関数やクロージャは環境(キャプチャされた変数)をヒープ上のオブジェクトとして表現し、Wasm の関数ポインタやテーブルを利用して呼び出しを行う方式が一般的です。さらに、外部との相互運用(JavaScript とブラウザ API)を想定して、エクスポート/インポートの取り扱いやシリアライズの方針も必要になります。
設計文書(ARCHITECTURE.md)が同梱されており、GC の相互作用、型システムの簡易化、ランタイムライブラリ(特に I/O、コンソール出力、簡易的なリフレクション)の扱いについての考察が見られます。また CLAUDE.md といったメモ的ドキュメントからは実験的な設計決定や運用上の留意点が読み取れます。現状はプロトタイプ段階であり、最適化や完全な Common Lisp 互換性は今後の課題です。
プロジェクトの構成
主要なファイルとディレクトリ:
- .envrc: file
- .gitignore: file
- .gitmodules: file
- ARCHITECTURE.md: file
- CLAUDE.md: file
…他 13 ファイル
まとめ
WasmGC を活用した Common Lisp → WebAssembly の実験的コンパイラで、設計思想とプロトタイプ実装が揃っている興味深いプロジェクト。
リポジトリ情報:
- 名前: clysm
- 説明: Common Lisp to WebAssembly compiler using WasmGC
- スター数: 4
- 言語: Common Lisp
- URL: https://github.com/cxxxr/clysm
- オーナー: cxxxr
- アバター: https://avatars.githubusercontent.com/u/13656378?v=4
READMEの抜粋:
Clysm
Common Lisp to WebAssembly compiler using WasmGC.
Clysm compiles Common Lisp code to WebAssembly, leveraging WasmGC for garbage collection and targeting browser execution.
Installation
(push #p"/path/to/clysm/" asdf:*central-registry*)
(ql:quickload :clysm)
Usage
;; Compile an expression to WASM module
(let ((module (clysm/compiler:compile-module '((+ 1 2)))))
(clysm/wasm:save-module module "output.wasm"))
Example: Factorial
;; Define a...