
2026/08/13 12:05
Amiga用コモンリッチ:クラマIGA
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
CL-Amiga は、AmigaOS、MorphOS、macOS、Linux で外部ランタイム依存(LLVM や libffi など)を必要としない自立型実装を提供することで、Common Lisp に大きな進歩をもたらします。その核には、タグ付き 32 ビット値を採用し、効率的なコンパacting ガーベージコレクタを搭載したポータブル C バイトコード仮想マシンがあり、68k から PowerPC アーキテクチャにかけて一貫した動作を保証します。システムは、パックされたバイトベクトル、バルク I/O、プリコンパイル済みのブートイメージによりメモリー効率を最適化するとともに、ネイティブバインディングを通じて Intuition、Graphics、GadTools などの特殊な Amiga GUI ライブラリ(ウィンドウ管理やビッターによる合成など)への直接アクセスを可能にします。開発者向けの利点としては、ASDF や Quicklisp とシームレスに統合でき、インスペクタ、再起動機能付きのデバッガー、バイトコードおよびネイティブ m68k アセンブリ用のディスアッセンブラー、コア部での完全な ANSI 準拠など、堅牢なツール群を備えています。パフォーマンス向上は、AmigaOS では JIT コンプアイラーによるもの(sum-to ループなどで 20 倍の高速化を実現)で、MorphOS では PPC VM によるものでありますが、構造上のコストのため純粋な C/アセンブリより低速です。将来的には PPC ジェットコンパイラーと拡張された API サポートが予定されていますが、現在のアーキテクチャ非依存アプローチは、レガシーおよび現代的な計算エコシステムを効果的に橋渡しし、完全なハードウェアアクセスを備えた準拠した Lisp コード用の堅牢な環境を提供します。
本文
Clamiga: アミガ用コモン・リッチ実装紹介
数ヶ月にわたり取り組んできた、「Clamiga (CL-Amiga)」というプロジェクトをご紹介します。これはアミガファミリ向けのコモン・リッチ(Common Lisp)実装です。
プロジェクト概要
- 対応プラットフォーム:
- 68k CPU: アマギア OS 3 (クラシックな AmigaOS)
- PPC CPU: MorphOS (ネイティブビルド)
- 将来計画: AROS や AmigaOS 4 の対応を目指しています。
- クロスプラットフォーム対応: macOS や Linux においても、開発・テスト環境として動作します。
- 名の由来: 「CL-Amiga」の略称です。"Amiga"はスペイン語やポルトガル語で「友人(女性)」を意味するため、「アミガ上で動くリッチ」かつ「あなた自身の友人であるリッチ」という二重の意味を持たせています。
プロジェクトへのリンク (※本文下部参照)
コモン・リッチとは
コモン・リッチは長く愛され続けるプログラミング言語です。
- 規格: ANSI 規格(1994 年制定)に基づくモダンな印象。古いプログラムも現代のコンパイラで動作します。
- 主要特徴:
- CLOS (Common Lisp Object System): オブジェクト指向システムを完備。
- 条件処理・マクロ: 複雑な制御フローや言語拡張が容易。
- インタラクティブ開発: イメージベースの開発スタイルにより、機能のライブ再定義が可能。
詳細な入門は「Common Lisp - Oldie but goldie」を参照してください。関数型プログラミングに興味ある方もご覧ください。
なぜ新たな実作なのか?(競合との違い)
SBCL, CCL などの優れた実装や商用製品も存在しますが、68k アミガ向けの実装はありません。
- 既存の高性能実装の課題:
- x86-64 や ARM 等の現代的アーキテクチャに最適化されており、68k バックエンドがありません。
- メモリ使用量が数十 MB を超える場合があります。
- Clamiga の特徴:
- 独立したバイトコード VM: C で実装されたポータブルコアを採用。外部ランタイム(libffi や LLVM)や追加のコンパイラ依存がありません。
- 性能: コモン・リッチとして完結しており、C やアセンブラとの競争でも遜色ありません。
- 機能: 数値塔(ビットベクトル、複素数など)、REPL、デバッガー、インスペクター、ソケット、スレッド、AmigaOS API など。
事前用語集
以下の技術用語を理解しておくと理解が深まります。
- ASDF (Another System Definition Facility):
- コモン・リッチの事実上の標準ビルドシステム(Gradle のようなもの)。依存関係やバージョン管理を自動化します。Clamiga でも採用されています。
- FASL (FASt Load):
- ソースコードがコンパイルされた高速なファイル形式。Clamiga では m68k と PPC で生成した FASL ファイルの互換性を保証しています。
- Quicklisp:
- コモン・リッチのライブラリマネージャー。Clamiga には互換シムを同梱しており、多くのライブラリが使えます(m68020 では計算資源不足による制限がある場合があります)。
動作原理とメモリ最適化
Clamiga はスタック型の VM で実行され、アミガの制約に対応した設計がなされています。
- 32 ビットタグ付き値: オブジェクトモデルをコンパクトに保ちます。
- コンパクト GC ヒープ: マーク・アンド・スイープ方式で、ヒープのスライドコンパクト化が可能。長時間動作してもメモリー不足になりません。
- アーキテクチャ独立: コンパイル済みのバイトコードは m68k と PPC で共通します。
4MB リスト環境での運用
アミガではメモリが制限されますが、Clamiga は以下で効率的に動作します。
| 用途 | ヒープ推奨サイズ | スタック (デフォルト) |
|---|---|---|
| シンプルなプログラム | | 64K |
| 小~中規模プログラム | 4M (デフォルト) | 64K |
| ASDF の読み込み | | 64K |
| Quicklisp + ライブラリ群 | | 128000 |
メモリを節約する技術:
- パックされたバイトベクタ: 8 マスのデータ(I/O、画像など)は GC を走査せず、サイズが 4 分の 1 になります。
- バッチシーク I/O:
等で OS キル単位で処理し、パフォーマンスを向上。read-sequence - プリコンパイル FASL: 起動時に標準ライブラリを事前コンパイルすることで冷間ブートを大幅に短縮(約 92 秒→約 9 秒)。
m68k JIT (Just-In-Time コンパイル)
アミガ OS (68020+) では、Clamiga はバイトコードをネイティブ m6k マシンコードへ変換して実行します。
- 透明なフォールバック: 対応していない処理は自動的にインタプリタに落ちます。
- ベンチマーク結果:
- 計算密集型コードで特に高いスピードアップを実現(例:sum-to で 20 倍)。
- リアルタイムグラフィックデモでも、JIT により約 615 FPS を達成しています。
- 設定:
オプションでバイトコード専用モードに切り替え可能です。--no-jit
速度比較データ (グラフ形式の表)
| ベンチマーク | 形状 | バイトコード | 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 |
※ 最大速度は ACE BASIC の ROM コール(約 1900 FPS)に届きません。これはタグ付き値の構造的コストによるものです。
MorphOS: NG アミガ
MorphOS ビルドは、完全なネイティブ PPC バイナリです。
- 動作: Amiga ライブラリコールを PPC コードから処理します。
- JIT 省略: m68k のための JIT は実装されていません(ポータブル VM を使用)。ただし G4/G5 等の高速な PPC では十分高速です。
- 互換性: FASL ファイルは、Clamiga の他のビルドと互換性があります。
Quicklisp の設定とライブラリ
Quicklisp は事実上のライブラリマネージャーとして動作します。インストールは一度きりです。
インストールコマンド
(require "asdf") (load "lib/quicklisp-install.lisp") (cl-amiga-ql:install)
以降のセッション
(load #P"~/quicklisp/setup.lisp") (load "lib/quicklisp-compat.lisp") (ql:quickload "alexandria")
確認済みおよび独自の実装を含む主要ライブラリ:
- alexandria: 標準ユーティリティ集合。
- fiveam: 単体テストフレームワーク。
- FSet: 関数的コレクション(Clamdia 用の特定実装が必要)。
- Drakma, Hunchentoot: HTTP クライアント/サーバー(SSL 対応は未実装のため注意)。
GUI バインディングの準備
;; ~/.clamigarc に設定して自動読み込み (require "amiga/intuition") (require "amiga/graphics")
Lisp からのネイティブアミガ GUI
require でオンデマンドロードされる、Intuition や Graphics のバインディングを使用します。以下はウィンドウを作成し、「Hello from Clamiga!」と描画する例です。
コード例: hello-window.lisp
hello-window.lisp;; REQUIREs は DEFPACKAGE の前にある必要があります。 (require "amiga/intuition") (require "amiga/graphics") (defpackage :hello-amiga (:use :cl) ;; パッケージを明示するためにニックスネームを使用 (:local-nicknames (:it :amiga.intuition) (:gfx :amiga.gfx))) (in-package :hello-amiga) (defun main () (it:with-window (win :title "Hello Amiga" :width 320 :height 200 :idcmp it:+idcmp-closewindow+) (let ((rp (it:window-rastport win))) (gfx:set-a-pen rp 1) (gfx:move-to rp 20 40) (gfx:gfx-text rp "Hello from Clamiga!") (it:event-loop win (it:+idcmp-closewindow+ (msg) (return)))))) (main)
- AmigaOS 内: Intuition ウィンドウが動作。
- MorphOS 内: 同じコードで動作(API 実装の違いに対応)。
バインディングが完全ではない部分でも、手書きの 68k アセンブリを介して生レジスタベースコールが可能のため、機能制限にはなりません。
インスペクターとデバッグ環境
インスペクター
ランタイム中の値を REPL で検査できます。以下の手順でハッシュテーブルの内容を確認可能です。
で変数を初期化。defvar- キー値ペアを設定。
で内部構造を表示。(inspect *ht*)
デバッガーとリスタート
エラーが発生した場合(無視されない限り)、デバッガーが開きます。
- コモン・リッチ特有の**条件システム (Condition System)**を利用。
やhandler-bind
を用いて、エラー発生時に自動的に処理を再開(リスタート)できます。restart-case
ディーザッセンブラ (disassemble
)
disassemble関数の内部構造を確認可能です。バイトコード VM の場合、バイトコードアセンブリが出力されます。
COMMON-LISP-USER> (disassemble 'f) Disassembly of F: 1 required, 0 optional, 0 key ... 0000: FLOAD 0 ; 1+ ...
ネイティブ m68k アセンブルの確認 (jitexpand
)
jitexpandJIT コンパイルされた関数も、マクロ
jitexpand を用いて m68k アセンブルを出力できます。
(jitexpand (defun add1 (x) (+ x 1)))
ホスト(macOS/Linux)での開発
- SLY/Emacs連携: REPL、補完、デバッグなど快適な環境が構築できます。
- ワークフロー: 高速なホストで開発・テストを行い、FASL ファイルをアミガで動作確認するサイクルが可能です。
ステータスとロードマップ
現在のステータス
- コア言語の安定化完了。
- テストスイート:スレッド、CLOS、条件処理、数値塔、FFI、JIT、GUI を網羅。
- ANSI 適合性目標あり(現在一部通過)。
今後のロードマップ
- AmigaOS API: より完全なインタフェースの実装。
- MorphOS 機能: 特定機能の追加。
- ARexx ポート: Emacs や SLIME/Sly との統合を容易化。
- ANSI 適合性: さらなる向上。
- インフラ強化: より高性能なインスペクター、デバッガー、PPC JIT の実装など。
結論
Clamiga は、アミガという古いハードウェアに現代的なライブラリ環境をもたらすプロジェクトです。
- 68k アマギア上: RAM を効率的に使ったネイティブ JIT と完全なコモン・リッチ。
- MorphOS 上: フル Quicklisp エコシステムが動作する高速 PPC ビルド。
- macOS/Linux 上: 開発に最適な Emacs ツールリングを備えた環境。
プロジェクトは GitHub で活動中であり、バグ報告や機能リクエストを歓迎します。