処理系:選び方の目安

処理系:選び方の目安

Tags: 処理系, ABCL, CCL, CLISP, CMUCL, ECL, SBCL, Lispbox, Lisp Cabinet

処理系の選び方の目安です。これが全面的に正しいとは思わないで、ひとつの意見として読んでください。



初心者の方へ

最初に使う処理系に悩んだら、ユーザーが多くて情報を集めやすいSteel Bank Common LispCLISPをお薦めします。開発に必要なソフトウェア一式を揃えた、LispboxLisp Cabinetなどのお手軽セットを使うのも良いでしょう。そのうち、用途によって不都合が出て来たり、他の処理系に興味が湧いてくるかもしれませんので、そうしたら他の処理系も試してみるといいでしょう。

規格に沿ったコードを書いている限り、Common Lispは処理系を移行しやすい言語です。気楽に選んで気軽に移行しましょう。

速度が重要な場合

まず、プロファイラを備えているかどうかが重要です。これがないと、手探りで性能上の弱点を見つけなければいけなくなり、格段に高速化が難しくなります。判断材料としては欠かせません。

原理上ではネイティブコードコンパイラが有利です。そのまま計算機が実行できる機械語をオブジェクトコードとして生成するためです。商用処理系のAllegro Common LispLispWorksCMU Common LispやCMU Common Lispから派生したSteel Bank Common Lispが生成するオブジェクトコードの速さには定評があります。また、Clozure CLも一定の品質のコードを生成するようです。

バイトコードコンパイラはネイティブコードコンパイラに比べると速度面では不利です。生成されたバイトコードは仮想マシンで解釈することになりますが、そのまま実行できる機械語に比べてどうしても遅くなります。これは移植性などと性能を天秤にかけて選んだ結果のことなので、仕方がありません。

Cへのトランスレータは、最終的にCコンパイラでネイティブコードを生成するため、原理的にはバイトコードコンパイラよりも速くなりますが、Cへの変換を経由することで、生成されるオブジェクトコードにもCの仕様の影響が出ます。これが性能面で足を引っ張る可能性はあります。ただし、大抵、Common LispよりCのコンパイラのほうが高度な最適化をするので、それがプラスに働く場合もあるでしょう。

JavaバイトコードコンパイラはJava仮想マシンの速度次第です。Java仮想マシンが高速化されると、バイトコードの処理も自動的に高速化されますが、逆に言えば、Java仮想マシンの性能の上限が処理速度の上限になります。外部のソフトウェアに性能を依存するのはCへのトランスレータと似ています。

一番大事なのは、自分の環境で実際に処理系を試してみることです。ベンチマークを参考にしても良いでしょう。32ビットの環境では速く計算できても64ビットの環境では遅かったり、IA-32アーキテクチャでは速くてもARMアーキテクチャでは遅かったりするかもしれません。計測することは重要です。

少ないメモリで動かしたい場合

Embeddable Common LispCLISPのように、カーネルと同じ言語でランタイムライブラリを書いている処理系が有利です。

逆に、Steel Bank Common LispClozure CLのように、カーネルだけCで書き、ランタイムライブラリはCommon Lispで書いているような処理系はメモリ使用量が多くなりがちです。この場合、異なる言語で書いた似たような処理をいくつもメモリ上に置いておかなければならないためです。

色々な環境で使いたい場合

自分で処理系を移植するのでなければ、どの環境で動作するか処理系のサイトに必ず書いてありますので、まずそれを見てください。

移植性の面からコンパイラについて考えたとき、大変なのはアーキテクチャごとに異なる機械語を扱わないといけないことです。CLISPなどのバイトコードコンパイラは直接機械語を扱う必要がないため、移植性に優れています。また、Embeddable Common LispのようなCへのトランスレータも、Cのコンパイラに機械語の扱いを任せてしまえるので有利です。

ネイティブコードコンパイラは、その仕組み上、色々なアーキテクチャの機械語の生成に真っ向から取り組まないといけないので、移植性は低いです。

Javaバイトコードコンパイラについては、性能と一緒でJava仮想マシンの動作環境に依存します。Javaにとっての主要な環境では手厚いサポートがありますが、それ以外の環境では不利でしょう。

Windowsで使う場合

WindowsはAPIがUnixとは大幅に異なるので、スレッドやプロセス間通信、ネットワークなどの、OSによって違いが大きい機能については、最初からWindowsをターゲットにしている処理系以外では、サポートしていないことも多いです。Cygwinを利用することで、上手く使うことができる場合もありますが、性能が落ちたり、Cygwin特有の問題に悩まされる場合もあります。

Windowsを動かしているマシンの性能に余裕があれば、Linuxなど別のOSをインストールした仮想マシンを利用してもいいでしょう。多少設定に手間がかかるかもしれませんが、環境の差によるトラブルは確実に減らすことができます。

他の言語と連携させたい場合

Cと連携させたい場合

ほとんどの処理系がFFI(Foreign Function Interface)を備えているので、共有ライブラリに含まれる関数を呼ぶことはできます。しかし、多くの処理系では、Cコンパイラなどが作ったオブジェクトファイルと直接リンクしたりすることはできません。また、共有ライブラリを直接作ることができる処理系もあまりありません。そういう用途では、CへのトランスレータのEmbeddable Common Lispを使うと良いでしょう。

Cのプログラムに組み込みたい場合

Embeddable Common Lispの本領発揮です。

Javaと連携させたい場合

Armed Bear Common Lisp?などの、Javaバイトコードコンパイラが有利です。Javaの機能をそのまま流用できます。


Last modified : 2013/03/30 15:27:37 JST
CC0 1.0
Powerd by WiLiKi 0.6.1 on Gauche 0.9