CMU Common Lisp

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言語で書かれた別の関数やシステムコールの呼び出し (共有ライブラリ対応)
 プロセス間通信と遠隔手続き呼出し (RPC) のサポート
 Common Lisp Object System (CLOS) の実装によるマルチメソッドとmetaobject protocol (en) のサポート
 MotifによるGUIを備えたソースレベル・デバッガとプロファイラ
 X11上で使うためのGUI、CLXおよびウィジェット・ライブラリGarnet
 拡張可能な入出力ストリーム
 Common Lispで実装されているEmacs風のエディタHemlock

脚注

関連項目 

Scieneer Common Lisp
Steel Bank Common Lisp

外部リンク 
CMUCL Home Page

LISP
オープンソースソフトウェア