作者 | Felix Winkelmann |
---|---|
開発元 | The Chicken Team |
初版 | 2000年7月20日[1] |
最新版 |
5.1.0
/ 2019年6月18日 |
プログラミング 言語 | Scheme, C |
対応OS | Cross-platform |
規格 | R5RS (mostly) |
サポート状況 | Active |
種別 | Programming language |
ライセンス | BSD License |
公式サイト | call-cc.org |
Chickenは、R5RSにほぼ準拠したSchemeのコンパイラおよびインタプリタである。標準を越える多くの拡張を持っている。BSDライセンスで利用可能な、フリーな処理系である。
Chicken の目標はシンプルであり、「実用的でポータブルなScheme処理系」を目指している。
Gaucheと同じように、Chickenは「現実世界のソフトウェア」を書くために、実用性を重視している。Schemeはコンピュータサイエンスのカリキュラムやプログラミング言語の実験台として有名ではあるが、ビジネスや産業用途ではあまり見かけられないものであった。[2] Chickenのコミュニティはeggsレポジトリ(後述)に、幅広いジャンルのタスクをこなすためのライブラリを作った。Chicken wiki では、Chicken を使ったソフトウェアのリストが掲載されている。[3]
Chicken のもう一つの目標であるポータビリティ(可搬性)については、GambitやBiglooのように、SchemeのコードをポータブルなC言語のソースに翻訳することで、多くの一般的なプラットフォームに対応している。例えば、LinuxやMac OS XといったUnix系オペレーティングシステム (OS) だけでなく、WindowsやHaikuといったOSにも対応している。[4]さらに、クロスコンパイルのビルトインで対応しているため、組み込み機器への対応も可能である。[5]
多くのSchemeコンパイラと同様に、ChickenはC言語を中間言語として利用する。SchemeプログラムはまずC言語にコンパイルされ、その後ターゲットシステムのCコンパイラにより、実行可能形式(機械語)に変換される。C言語はほとんどのOS、CPUアーキテクチャでサポートされているので、ポータビリティを確保する観点から、必要な選択である。
Chickenの設計は、1994のHenry Bakerの論文[6]で紹介されている、SchemeからC言語に変換する新しい手法に触発されている。SchemeのプログラムはC言語の関数にコンパイルされる。このCの関数は決してreturnすることがなく、代わりに返り値を継続の引数として渡し、その継続を呼び出すことで、関数から脱出する。呼び出される継続はCの関数が呼ばれるときの引数として与えられる。このような継続渡しスタイルへの変換は、C言語へのコンパイラによって自動的になされる。
このような変換は継続渡しスタイルとして以前からあったものだが、Bakerの新しいアイディアは、CのコールスタックをSchemeのヒープとして活用するという点にあった。この方式では、Cのスタック操作(自動変数のためのスタック領域割り当てや、変数のサイズに基づく固定長配列のアロケーションなど)を使用することができる。スタックを使い切ってしまったら、ガーベッジコレクションを開始することができる。このガーベッジコレクションはC. J. Cheneyのコピー方式ガーベッジコレクション[7] と同じものである。ただし、Chickenでは、Cコンパイラの実装に依存するCのスタックフレームをコピーせず、Schemeオブジェクトのみをコピーする。
Schemeで使うヒープをすべて挙げると、新しく作成されたオブジェクトが置かれるCのコールスタックと、ガーベッジコレクタが必要なオブジェクトをコピーする先の2つのヒープからなり、この3つの領域で世代別ガーベッジコレクタを形成する。この方式によってメモリ確保を必要とする多くの操作において、高速なCのスタックを利用できる。また、第一級の継続の呼び出しも、単純なC言語の関数(関数ポインタ)の呼び出しと同じ手順でできる。
Schemeの仕様で末尾再帰呼び出しの最適化が要求されていることについて、前述の論文では「We thus achieve the spirit, if not the letter, of ANSI Scheme's tail-recursion law.」とまとめている。
Chicken SchemeはほぼR5RSに準拠している。現在のところ、関数呼び出しの引数は最大で120までで、他の処理系で一般的な2048の引数と比べて少ない。
Chickenは追加のライブラリをeggsというソフトウェアレポジトリで提供している(eggsの一覧)。このeggsシステムはRubyGemsとよく似ており、OSのパッケージングシステムと独立している。SWIG も Chicken をサポートしている。