Clozure CL


Tags: 処理系, CCL

Clozure CL(CCL)は、ANSI Common Lisp準拠のネイティブコードコンパイラです。2007年以前はOpenMCLを名乗っていたため、古い情報ではOpenMCLと呼ばれていることが多いです。元々Macの商用処理系から派生し、開発者も引き継いだため、充実したMac OSへのサポートが強みです。また、Clozure Associates社の技術者を中心に開発しているため、同社の有料サポートがあります。



関連ページ


特徴


機能


動作環境


歴史


インストール

UNIX

Getting Clozure CLから自分の環境に合ったものをダウンロードします。

% cd /tmp
% wget ftp://ftp.clozure.com/pub/release/1.7/ccl-1.7-linuxx86.tar.gz

好きな所に展開します。

% cd ~/opt
% tar xf /tmp/ccl-1.7-linuxx86.tar.gz
% ln -s ccl-1.7 ccl

環境変数を設定します。CCL_DEFAULT_DIRECTORYを上で展開したClozure CLのディレクトリに設定します。

% echo "export CCL_DEFAULT_DIRECTORY=$HOME/opt/ccl" | cat >> ~/.zshenv  # zshの場合

起動スクリプトをパスの通った所に置きます。Clozure CLのディレクトリの中のscriptsディレクトリにあるcclとccl64です。32ビット環境ならccl、64ビット環境ならccl64を使ってください。

% cd ~/opt/bin                  # ~/opt/binにパスが通っていることとする
% ln -s ../ccl/scripts/ccl64    # 32ビット環境ならccl64の代わりにccl

起動スクリプトが実行できるようになっているか確認します。実行フラグが立っていなければ、パーミッションを変更します。

% chmod +x ~/opt/ccl/scripts/ccl64

終わりです。起動するか確認してください。

% ccl64
Welcome to Clozure Common Lisp Version 1.7-r14925M  (LinuxX8664)!
? 

Windows

まず、Getting Clozure CLからWindows向けのZIPファイルをダウンロードし、好きな場所に展開します。

次に、環境変数を設定します。CCL_DEFAULT_DIRECTORYを展開したClozure CLのディレクトリに設定し、PATHにも同じディレクトリを追加します。

完了です。起動するときにはwx86clを実行してください。

> wx86cl
Welcome to Clozure Common Lisp Version 1.7-r14925M  (WindowsX8632)!
?

もし上の説明で分からなければ、Lispboxを使ってください。インストーラで全部自動的に設定してくれます。


1.8

プラットフォームごとのメモ

Mac OS X

CocoaベースのIDEはMac OS X 10.6以降を必要とします。コマンドラインのLispはMac OS X 10.5でもまだ動作します。

Mac OS X 10.7では、スタンドアローンのClozure CL.appがクラッシュしたとき、AltConsoleアプリケーションが自動的に起動しないかもしれません。AltConsoleのDockアイコンをクリックすれば、起動して正常に動作するでしょう。

FreeBSD

バイナリはFreeBSD 8.1でビルドされています。6.xや7.xを使っているなら、Lispカーネルを自分のシステムで再コンパイルすれば、問題なく処理系を動かせるはずです。

$ cd ccl/lisp-kernel/freebsdx8632   # あるいはfreebsdx8664。必要に応じて
$ make

Linux x86

Linux/x86バイナリはDebian 5.0でビルドされています。十分に枯れていますので、Lispカーネルバイナリの実行にあたって、ほとんどの人は問題が起こることはないでしょう。しかしながら、存在しないバージョンのglibcに対してリンクしているというエラーによって、提供されているバイナリが実行できない場合、Lispカーネルを自分のシステムでコンパイルすれば、問題なくLispを動作させることができるでしょう。

$ cd ccl/lisp-kernel/linux8632  # あるいはlinux8664
$ make

Lispカーネルをビルドするためにはm4プログラムがインストールされている必要があることに注意してください。

Linux ARM

ARMv7プロセッサが必要です。これは、残念なことにいくつかの興味深い小さなARMベースのシステムを排除してしまいます。そのひとつがRaspberry Piで、ARMv6アーキテクチャチップ(ARM1176JZFSコア)を使っていますが、CCLは動作しないでしょう。

様々なARMプロセッサの識別に使われる命名法は極めてややこしく、http://en.wikipedia.org/wiki/List_of_ARM_microprocessor_cores(訳注:日本語ではARMアーキテクチャの項にリストがあります)が助けになるかもしれません。

修正されたチケット

ticket:757, ticket:846, ticket:3, ticket:882, ticket:886, ticket:884, ticket:887, ticket:889, ticket:891, ticket:894, ticket:441, ticket:896, ticket:892, ticket:893, ticket:862, ticket:899, ticket:905, ticket:865(それとできる限り他のものも)

メモ

一般的な変更

シンボル:ccl-1.8が*features*に入りました。

付属のASDFのバージョンが2.20になりました。

標準のtimeマクロによる出力の書式が、数値をより良く整形するように変更されました。

関数directoryへの:directories引数がデフォルトではtになりました。出力がデフォルトではファイルとディレクトリの両方を含むということを意味します。また、:follow-linksがtのとき(デフォルトでのように)、directoryはディレクトリへのシンボリックリンクを処理するようになりました。

read-line関数がWindowsでも行をより速く読むようになりました。

UNIXベースのシステムで、user-homedir-pathnameを初期化するために、HOME環境変数がデフォルトで使われるようになりました。無効にするためにはccl:*trust-paths-from-user-environment*をnilに設定します。

コードカバレッジの結果がどのように提示されるかについて、いくつかの改善が加えられました。

コンパイラ

ARM版に対して多数のバグフィクスと性能の改善が行われました。

x86バックエンドは不要なスタックへの転送を減らすように努めます。

x86とARMにおいて、少数の固定された引数を伴う自身への末尾呼び出し(訳注:末尾再帰)がいくらか速くなりました。

特定のケースで、特定の型とキーの範囲に対して、caseと関連する構文は、定数時間で実行できるジャンプテーブルにコンパイルされるでしょう。

GCとランタイム

デッドロックを避けるため、GCはすべてのガベージコレクションが可能なポインタの後始末をスレッドが再開するまで延期します。これによる小さな副作用は、特定の到達不能な他のオブジェクトを、次回のガベージコレクションまでGCが覚えておかなければならないことで、いくらかの外部のリソースが、不要になるまでよりも少し長い間拘束されるかもしれません。

Mac OS Xで、デフォルトのヒープイメージが見付からない場合、アプリケーションバンドルの中にいると仮定して、".../Resources/ccl"を探します。

互換性のない小さな変更:Lispカーネルは、イメージの名前としての単独のコマンドライン引数を取り扱わなくなりました。これによって、いくつかのケースで、単純な「スタンドアローンバイナリ」のためにユーザがシェルスクリプトのラッパーを書かなくても良くなります。

逆アセンブル

逆アセンブラの出力の書式が、インストラクションの後ろにあるコメントの中で、インストラクションのアドレスを表示するように変更されました。

逆アセンブラは、caseのジャンプテーブルを認識し、表示します。この例を見るためには、以下のつまらない関数を逆アセンブルしてください。

(defun jumper (x)
  (case x
    (1 'one)
    (2 'two)
    (3 'three)
    (4 'four)
    (5 'five)
    (6 'six)
    (7 'seven)
    (8 'eight)
    (9 'nine)
    (10 'ten)))

CocoaベースのIDE

変数ccl:@はインスペクタによってインスペクトされるオブジェクトを設定されますが、これをリスナーの中で利用できます。

"ccl-application"のような名前が"CCLApplication"に変換されるように、"CCL"が特別なObjective-Cの単語になりました。このプリフィクスはCCLが私的に使うために予約されています。

関数execute-in-guiは、別のスレッドの同期のメソッドを使うために書き直されました。

新しくエクスポートされたシンボル

以下の新しいシンボルがCCLパッケージからエクスポートされるようになりました。


参考文献


Last modified : 2012/03/30 00:32:40 JST
CC0 1.0
Powerd by WiLiKi 0.6.1 on Gauche 0.9