CMU Common Lisp
| 作者 | カーネギーメロン大学 |
|---|---|
| 開発元 | Various |
| 初版 | 1980年代初頭 |
| 最新版 | 20d / 27 Oct 2012 |
| 最新評価版 | snapshot-2013-03-a / 7 Mar 2013 |
| 対応OS | POSIX 準拠の複数の OS |
| プラットフォーム | クロスプラットフォーム |
| 対応言語 | Common Lisp |
| 種別 | コンパイラ および インタープリタ |
| ライセンス | パブリック・ドメイン |
| 公式サイト | www.cons.org/cmucl |
CMU Common Lisp (CMUCL) はカーネギーメロン大学で実装が行われた Common Lisp 処理系のフリーソフトウェアである。
CMUCL は Linux や BSD などの多くの Unix 系のプラットフォームで実行することができる。Windows への試験的な移植版もある。CMUCL からは Steel Bank Common Lisp というソフトウェアが派生しており、また Scieneer Common Lisp という商用版も CMUCL から作られている。
目次 |
開発の経緯 [編集]
CMUCL は最初 Spice Lisp の一部として1980年ごろ、Common Lisp よりも早い時期に実装されたものであった。1985年に Rob MacLachlan が Python コンパイラを作る目的でコンパイラを書き直し、CMUCL として IBM PC RT、MIPS、SPARC などの Unix ワークステーションに移植した。インテルの x86 アーキテクチャはレジスタが少なかったため、CMUCL の初期のバージョンではサポートしていなかった。CMUCL ではタグの付いたデータ型とそうでない型の区別が厳格であり、ガベージコレクションは CPU レジスタの半分はタグ付けされたデータ型、もう半分はタグのないデータ型に割り当てられていることを前提に動作する。この方法はバックエンドのコンパイラ (Python という名前だが、プログラミング言語の Python とは関係ない) が使うレジスタが不足することがある。
CMU でこのプロジェクトが中止になってからは (CMUCL のコンパイラ・ベースを使った Dylan による実装が代わりに生き残った)、ボランティア・グループによりメンテナンスが行われている。1996年からこのグループで正規版のリリースが行われている。
同時期にインテル x86 アーキテクチャへの移植も行われ、まず FreeBSD と Linux で実行できるようになった。レジスタの不足は、保守的ガベージコレクタを新しく実装することで解決された。このガベージコレクタでは、レジスタにどんな型のどんな値が載っていてもよく、またガベージコレクションや値の移動を想定していないポインタであっても扱うことができる。
コンパイラと実行環境 [編集]
- CMUCL は対話的実行 (en:REPL) を主に想定したインタプリタだが、コンパイルの不要な Lisp プログラムのファイルを一括して読み込むこともできる。
- サイズの小さなバイトコードによるプログラム (コンパイラで生成できる) を実行するプログラムも用意されている。これは現在はほとんど使われないが、プログラムのサイズが非常に小さくでき、インターネットの整備が進んでいなかった当時はネットワーク上の転送に有利だったので、CMUCL の初期のリリースではよく使われていた。
- Python という名前のネイティブ・コードコンパイラが実装されている。これは、プログラミング言語の Python とは無関係である。適切なデータ型の宣言が行われていて、実行速度を考慮してプログラミングされた Common Lisp のソースコードであれば、Python の出力するコードは C++ などの言語から生成されたコードと大して変わらない速度で実行できる。関数の呼び出し方法や、ユーザー定義のデータ型に対するポインタを使わない配列がないことなどによる実行効率の悪さは、標準 Common Lisp に由来するものであり、改良が必要である (たとえばインライン化を強化したり、実際にはあらかじめ確保されている配列にアクセスしているだけだがユーザー定義のデータ型のように扱えるようにする文を生成するマクロなど)。Python コンパイラには強力な型推論機能もあり、実行速度の低下のないプログラムを書いたり、最適化箇所の提示などに有効である。
特徴 [編集]
- x86 アーキテクチャでの近代的なガベージコレクタとマルチプロセッサ対応
- C言語で書かれた別の関数やシステムコールの呼び出し (共有ライブラリ対応)
- プロセス間通信とリモート・プロシジャー・コールのサポート
- CLOS (Common Lisp Object System) の実装によるマルチメソッドと metaobject protocol (en)のサポート
- Motif による GUI を備えたソースレベル・デバッガとプロファイラ
- X11 上で使うための GUI、CLX およびウィジェット・ライブラリ Garnet
- 拡張可能な入出力ストリーム
- Common Lisp で実装されている Emacs 風のエディタ Hemlock