Clamiga: あなたのAmigaで動くCommon Lisp実装
Clamigaは、クラシックなAmigaOS 3とMorphOS向けに作られた新しいCommon Lisp実装で、ポータブルなバイトコードVM、コンパクティングGC、m68k JITを備えています。0.5 MBのヒープで起動し、68kハードウェアにモダンなLisp開発をもたらします。
Common Lispは古いが生きているという評判があります。ANSI標準は1994年に遡りますが、CLOS、条件、マクロを備えたこの言語は今でも時代を先取りしている感があります。しかし、Amiga愛好家にとっては運が悪いことに、主要な実装はどれも68kでは動作しません。Manfred BergmannはClamigaでそれを修正することにしました。ClamigaはAmigaファミリー向けに作られたCommon Lisp実装です。
ClamigaはポータブルなCで書かれた自己完結型のバイトコードVMです。クラシックなAmigaOS 3(m68k)、MorphOS(ネイティブPPC)、そして開発用にmacOSとLinuxでも動作します。名前はCL(Common Lisp)とAmigaの合成語で、スペイン語/ポルトガル語で「amiga」は女性の友人を意味します—つまり、あなたの友達であるLispなのです。
なぜ別の実装なのか?
既存のCommon Lisp実装は、モダンなアーキテクチャに縛られているか(SBCL、CCL)、メンテナンスされていないか(CLISP)です。どれもAmigaをターゲットにしていません。Clamigaは68kハードウェアの制約を尊重した設計でそのギャップを埋めます:32ビットのタグ付き値、コンパクティングGC、アーキテクチャに依存しないバイトコードです。
バイトコードアプローチにより、同じコンパイル済みLispが68kとPPCの両方で動作し、FASLファイルはAmigaOS 3とMorphOS間でバイト互換です。ポータブルなCコアは、同じシステムがmacOSとLinuxでもビルド・動作することを意味し、開発を実用的にします。
4 MBで生きる
メモリはクラシックなAmigaでは常に懸念事項です。Clamigaのフルコア—CLOS、条件、数値タワー、format、loop—は約0.5 MBのヒープで起動します。単純なプログラムは1 MBのヒープで動作します。ASDFは11 MB、Quicklispとライブラリは24 MBが必要です。パックされたバイトベクタは、4バイトのタグ付き値の代わりに1要素あたり1バイトを格納するため、I/Oバッファとグラフィックデータが4倍小さくなります。バルクシーケンスI/OはOS呼び出しごとにチャンク全体を移動し、プリコンパイル済みブートFASLは68020でのコールドブートを約92秒から約9秒に短縮します。
m68k JIT
AmigaOS 68020+では、Clamigaは定義時にバイトコード関数をネイティブなm68kコードに変換します。JITは整数演算、分岐、リスト操作、構造体アクセス、関数呼び出し、クロージャなどをカバーします。サポートされていない命令は透過的にインタプリタにフォールバックします。
エミュレートされたA4000/68040でのベンチマークは、計算集中型コードで大幅な高速化を示しています:fixnumループは20倍速く、構造体スロット読み取りは13倍、連鎖演算は7.5倍です。関数呼び出しが多いコードはわずか1.4倍です。実際のグラフィックデモは、バイトコードの500 FPSに対してJITで615 FPSに達します—ACE BASICの1900 FPSにはまだ及びませんが、そのギャップは動的でガベージコレクトされタグ付き値の言語の構造的なコストです。
MorphOSとQuicklisp
MorphOSビルドはエミュレーションではなくネイティブのPPCバイナリです。JIT(m68k専用)は省略されていますが、G4/G5ではポータブルVMが十分に高速で、Quicklispを実用的にします。Clamigaは互換レイヤーとメンテナンスされたライブラリフォークを#+cl-amigaフィーチャーブランチ付きで提供し、APIギャップが埋まったらアップストリーム化を目指しています。
ClamigaはレトロなプラットフォームにモダンなLispをもたらす真剣な取り組みです。高速なゲームを書くためのものではありませんが、インタラクティブな開発と学習には魅力的な選択肢です。
残るギャップは、コード生成ではなく、動的でガベージコレクトされタグ付き値の言語の構造的なコストです。
| ベンチマーク | バイトコード | JIT | 高速化 |
|---|---|---|---|
| sum-to | 400 ms | 20 ms | 20.0x |
| struct-loop | 260 ms | 20 ms | 13.0x |
| arith-chain | 300 ms | 40 ms | 7.5x |
| call-loop | 340 ms | 240 ms | 1.4x |
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。