Common Lisp 処理系

ここではメジャーどころで良く話題にのぼるCommon Lisp処理系を集めてみました。

Common Lispはマイナー言語だ、と言うイメージがありますが、実際のところ、処理系の存在数としてはC言語なんかより多いかもしれません。また、C言語のように、Microsoftの独断場で、単一の処理系にユーザーが集中している、って事もありません。
世界中で様々なCommon Lispの実装が生まれては使われているのです。
ここでは、原則、Lisbboxに搭載されているCommon Lisp処理系を中心にして、フリーでマルチプラットフォームの処理系を集めたつもりですが、一部、特定のプラットフォームでしか動作しない処理系も存在します。
使用しているプラットフォームを鑑みてお好みの処理系をお選びください。そして「選択の自由がある」と言うのがCommon Lispの良いところ、なのです。言語も自由ですし、選択も自由です。

参考資料としてここで紹介している各処理系のベンチマークを取ってみます。あくまで「参考」ですが、竹内関数を利用して各実装の計算速度を計ってみたいと思います。

なお、竹内関数とは通称たらいまわし関数等とも呼ばれるベンチテスト用の関数で、Lisperの竹内郁雄先生が再帰を用いて定義した、見た目はシンプルなクセに無茶苦茶ハードな処理をする関数です。
コードは次のようになっています。
(defun tak (x y z)
(if (<= x y)
y
(tak (tak (1- x) y z)
(tak (1- y) z x)
(tak (1- z) x y))))

これをCommon Lisptime関数を用いて次のようにして計測します。
(time (tak 12 6 0))
 なお、使用プロセッサはIntel Core2Duo T7500 2.2GHz、OSはLinuxでの計測です。

竹内関数でのCommon Lisp処理系ベンチマーク


SBCLインタプリタ時よりコンパイル時の方が実行時間がかかる、と言うわけの分からなさ、です(実際はインタプリタのように見えて勝手にコンパイルしてる?)。しかしながら、この中のフリーの処理系ではさすがに最速です。CLISPGCLの3倍以上の実行速度です。
CLISPはバイトコンパイルの為、「遅い」と言う印象なんですが、意外と実行速度は速いです。CコードへとコンパイルするGCLとほぼ変わりません。若干遅い、って程度なんで実用的には問題が無いでしょう。
CLISP/GCLは共にインタプリタ時とコンパイル時ですと、速度が9倍前後程違います。この二つは積極的にコンパイラを使った方が良いでしょう。
極端なのはAllegro CLです。フリーエディションのせいなのか、竹内関数はインタプリタ時は評価が終わりませんでした。インタプリタとしてはCLISPより劣る、と言う感じです。
ただし、ソースをコンパイルしたらさすが商用処理系、って感じで、SBCLの2倍の実行速度を叩き出しています。Allregroはどにかく「コンパイラの最適化」だけに焦点を絞ってる印象です。
LispWorksもこれまた極端です。Allegroみたいに「止まっちゃう」と言う事はないんですが、インタプリタ状態で何とお題のコードを実行するのに33.238秒、もかかっています。30秒以上とはこれまた・・・。CLISPの方が3倍も速いのです。
一方コンパイルすると実行時間が急に短縮されて0.18秒。180倍も速くなる、ってのが極端過ぎます。その実行時間はやはりSBCLの2倍程度でAllegroとタイを張っています。さすが商用処理系、と言う事で。
この辺、商用処理系ですと、やっぱり「コンパイル時の実行速度」をユーザーが求めてる、と言うのが端的に表れているんでしょうか。いずれにせよ、これらが「プロ向き」の処理系の性質で、学習用途に使おう、ってのとまたニーズが違うのかもしれません。