チキンスキームのロゴ | |
macOS で動作する Chicken 5.0.0 インタープリター | |
| パラダイム | マルチパラダイム:機能的、命令的、メタ |
|---|---|
| 家族 | リスプ |
| デザイン: | フェリックス・ウィンケルマン |
| 開発者 | チキンチーム |
| 初登場 | 2000年7月20日[1] |
| 安定リリース | 5.4.0 / 2024年7月16日 |
| タイピングの規律 | ダイナミック、潜在的、強力 |
| 範囲 | 語彙 |
| 実装言語 | スキーム、C |
| プラットフォーム | IA-32、x86-64、ARM、MIPS、SPARC 64、PowerPC |
| OS | クロスプラットフォーム: Windows、Linux、macOS、FreeBSD、NetBSD、OpenBSD、Solaris、AIX、Haiku、Android、iOS |
| ライセンス | BSDA の |
| ファイル名拡張子 | .scm |
| Webサイト | コールcc |
| 影響を受けた | |
| Lisp、Scheme | |
Chicken(表記:CHICKEN)はプログラミング言語であり、具体的にはプログラミング言語Schemeの方言を実装し、Schemeのソースコードを標準Cにコンパイルするコンパイラとインタープリタである。大部分はR5RSに準拠しており、標準に対する多くの拡張機能を提供している。新しいR7RS標準は、拡張ライブラリを通じてサポートされる。[2] ChickenはBSDライセンスの下で利用できる無料のオープンソースソフトウェアである。大部分はSchemeで実装されているが、パフォーマンスやCプログラムへの埋め込みを容易にするために一部がCで実装されている。
集中
Chicken の焦点は、そのスローガン「実用的でポータブルな Scheme システム」からすぐに明らかになります。
Chicken の主な焦点は、現実世界のソフトウェアを書くための Scheme の実用的応用です。Scheme はコンピュータ サイエンスのカリキュラムやプログラミング言語の実験でよく使用されていますが、ビジネスや業界ではあまり使用されていません。[3] Chicken のコミュニティは、さまざまなタスクを実行するための大規模なライブラリ セットを作成しました。Chicken wiki (これを実行するソフトウェアも Chicken プログラムです) には、Chicken で書かれたソフトウェアのリストも含まれています。[4]
Chickenのもう一つの目標は移植性です。中間表現、この場合は移植可能なC(GambitやBiglooと同様に)にコンパイルすることで、Chickenで書かれたプログラムはLinux、macOS、その他のUnix系システム、Windows、Haiku、モバイルプラットフォームiOSやAndroidなどの一般的なオペレーティングシステム用にコンパイルできます。[5]また、クロスコンパイルプログラムと拡張機能のサポートも組み込まれており[6]、さまざまな組み込みシステムプラットフォームで使用できます。
デザイン
多くの Scheme コンパイラと同様に、Chicken は標準 C を中間表現として使用します。Scheme プログラムは Chicken コンパイラによって C に変換され、次に C コンパイラが C プログラムをターゲットコンピュータ アーキテクチャのマシン コードに変換して、実行可能プログラムを生成します。C は普遍的に利用できるため、この目的に役立ちます。
Chickenの設計は、SchemeをCにコンパイルする革新的な戦略を概説したHenry Bakerによる1994年の論文[7]に触発されました。SchemeプログラムはC関数にコンパイルされます。これらのC関数はreturn文に到達することはありません。代わりに、完了時に新しい継続を呼び出します。これらの継続はC関数であり、他のC関数に追加の引数として渡されます。それらはコンパイラによって計算されます。
ここまでが継続渡しスタイルの本質です。Baker の斬新なアイデアは、C の呼び出しスタックをScheme ヒープに使うというものです。そのため、自動変数作成、可変サイズ配列割り当てなどの通常の C スタック操作が使えます。スタックがいっぱいになると (つまり、スタック ポインタがスタックの先頭に達すると)、ガベージ コレクションを開始できます。ここで使用される設計は、 CJ Cheney が考案したコピー ガベージ コレクターで、すべてのライブ継続とその他のライブ オブジェクトをヒープにコピーします。[8] それにもかかわらず、C コードは C スタック フレームをコピーせず、Scheme オブジェクトだけをコピーするため、C の実装に関する知識は必要ありません。
全体として、Scheme ヒープは、世代別ガベージ コレクターに必要な 2 つのヒープとともに、ナーサリとしての C スタックから構成されます。このアプローチにより、多くの操作で C スタックの速度が得られ、継続を C 関数への単純な呼び出しとして使用できるようになります。さらに、Baker のソリューションは、Scheme 言語標準で要求されている漸近的な末尾再帰動作を保証します。Chicken Scheme コンパイラーでの実装は、スペースに対しても漸近的に安全です。
標準からの制限と逸脱
Chicken Schemeは、いくつかの注目すべき制限と逸脱を除けば、ほぼR5RSに準拠しています。[9] R7RS互換性は拡張ライブラリとして提供されています。[2]
コアシステムはUTF-8文字の基本的なサポートを備えていますが、文字列のインデックス作成と操作手順はUTF-8に対応していません。完全なUTF-8対応のサポートを追加する拡張ライブラリが存在します。[10]
アドオンソフトウェア
Chickenには、eggsと呼ばれる追加されたライブラリとプログラムの大規模なソフトウェアリポジトリがあります。[11]このシステムはRubyGemsと非常によく似ています。[12]
当初、これらの egg は 1 つの中央 SVN リポジトリで開発され、[13]タグを作成すると、拡張機能の新しいバージョンが自動的にダウンロード可能になりました。現在、egg はどこでも、どのバージョン管理システムでも開発できますが、ほとんどの一般的なコード ホスティング サイトを使用する場合でも、半自動リリース管理は維持されています。 [14]このリリース方法は、ユーザーがこれらの VCS をインストールする必要がないという意味で、VCS に依存しません。開発者は好きな場所で自由にホストでき、公開バージョン管理を避けてプレーンな tarball のみを配布することもできます。
リリースされたすべてのエッグは、継続的インテグレーションプロセスの一環として最新バージョンが自動的にテストされます。標準テストサーバー[15]が存在し、そこではコアシステムとすべてのエッグが最新の開発バージョン(退行バグを捕捉するため)と最新の安定バージョン(安定システムのユーザーにとってすべてが機能することを保証するため)に対して毎日テストされます。また、誰でも、ハードウェア、オペレーティングシステム、コアリリースなど、さまざまなテスト能力をさらに提供するためにボランティアすることができます。
特徴
Chicken は R5RS 標準Schemeのほとんどをサポートしていますが、すべての Scheme 実装で使用できるわけではない非標準機能もいくつか追加しています。
外部関数インターフェース
Chicken を C にコンパイルすると、コンパイルされた結果にカスタム C コードを挿入できるようになり、C ライブラリとの統合が容易になります。外部関数インターフェイスは、ほとんどの組み込み C 型と対応する Scheme オブジェクト間の変換をサポートします。
また、Java Native Interface (JNI) [18]またはブリッジ [ 19] を介してPython [16]、Lua [ 17 ] 、Javaとインターフェースするための拡張ライブラリも存在します。
クロスコンパイル
Scheme コードを別のプラットフォーム (たとえば、デバイスへの組み込み用) に クロスコンパイルするのは比較的簡単です。
Scheme コードのクロスコンパイルを可能にするために、Chicken は個別コンパイルのモデルを課しています。コンパイルされたモジュールは 2 つの共有ライブラリで構成されます。1 つのライブラリには実行時に使用される実際のコード (ターゲット プラットフォーム用にコンパイルされたもの) が含まれ、もう 1 つはインポート モジュールで、手続き型マクロ コードなど、コンパイル時に実行されるコード (ホスト プラットフォーム上) をロードするために使用されます。
Chicken コンパイラは簡単にクロスコンパイルできます。C への変換が完了したら、別のプラットフォーム用にビルドするように設定された C コンパイラを使用するだけです。
モジュールとマクロ
バージョン4以降、Chickenにはモジュールシステムが組み込まれており、明示的な名前変更マクロ[20]を通じて低レベルの衛生的なマクロをサポートしています(バージョン4より前は、アドオンライブラリを通じて利用可能でした)。標準の構文ルールマクロもサポートされており、基本的に明示的な名前変更の逆バージョンである暗黙的な名前変更マクロ[21]もサポートされています。
このメカニズムは、利便性と引き換えにパフォーマンスを犠牲にします。不衛生として明示的に挿入されていない各識別子は、名前のキャプチャを回避するために自動的に名前が変更されます。暗黙的な名前変更では、マクロ展開者が式をさらに 2 回再走査する必要があるため、パフォーマンス コストが発生します。このコストは展開時に発生するため、マクロ作成者は、コンパイル時間が長くなっても許容できるかどうかを検討する必要があります。
リモートデバッガー
バージョン4.11以降、ChickenにはFeathersというデバッガーが同梱されています。[22] Schemeコードが必要なデバッグオプション付きでコンパイルされると、コード内の特定のポイントにデバッグイベントが挿入されます。これらはC関数の呼び出しとして実装されており、実際にコードをデバッグしていない場合はオーバーヘッドが比較的低くなります。デバッグ時には、おそらく別のマシン上のFeathersサーバープロセスへのTCP接続を試みます。プロセスは停止し、ユーザーはブレークポイントを設定してプログラムを開始できます。次に、ブレークポイントに到達すると、クライアント(デバッグ中のプロセス)はコマンドループに入り、クライアントの照会、変数の読み取り、または変更が可能になります。
限定的な静的型解析
Chicken はローカル フロー分析をサポートしています。これにより、コンパイラはコンパイル時に変数の型エラーをキャッチし、型の特殊化を実行できます。この特殊化により、コンパイル時に型を推測できる場合、実行時の型検出のいくつかの安全性チェックを削除できます。これにより、実行時のパフォーマンスが向上します。
この精査ツールではモジュール間のフロー分析は許可されないため、1 つのコンパイル単位 (またはモジュール) の一部であるコードを最適化する場合にのみ使用できます。
歴史
CHICKEN Scheme は元々、 Cygwin /gcc上で Felix Winkelmann によって開発され、後にWindows 98上のVisual C++ 5.0 上で開発されました。[1]彼は、机の上にFeathers McGrawのプラスチックのおもちゃがあったことを思い浮かべて、「その日最初に思いついたもの」として、勝手に「CHICKEN」という名前を思いつきました。プロジェクトが成熟するにつれ、彼は迷信から名前を変えないことに決めました。[23]
参照
- 末尾再帰
- チェイニーのアルゴリズム
- 「MTA(歌)」、ベイカーの1994年の論文に出てくる歌の引用
- Gambit (Scheme 実装)
- スターリン(スキームの実装)
参考文献
- ^ ab Winkelmann, Felix. 「Chicken Scheme-to-C コンパイラの発表」。Googleグループ (comp.lang.scheme)。
- ^ ab evhan (2018-11-09). 「r7rs (Chicken manual)」. Chicken Scheme . 2019年2月28日閲覧。
- ^ 「スキームFAQ」。、セクション「Scheme は何のために使用されますか?」
- ^ ベックス、ピーター (sjamaan) (2018-08-16). 「チキンスキームで書かれたソフトウェア」。チキンスキーム。2019年2月26日に取得。
- ^ 「移植性」。Chicken Scheme Wiki。
- ^ ベックス、ピーター (sjamaan) (2016-05-28). 「クロス開発」。チキンスキーム(マニュアル)。2019年2月26日に取得。
- ^ Baker, Henry (1994)。「CONS は議論を CONS すべきではない、第 2 部: MTA に関するチェイニー」2006 年 3 月 3 日時点のオリジナルよりアーカイブ。
- ^ Cheney, CJ「非再帰リスト圧縮アルゴリズム」。CACM 13,11 (1970 年 11 月)、677-678 ページ。
- ^ ピーター・ベックス (シャマーン);ヴィンケルマン、フェリックス (2016-05-28)。 「確定偏差(チキンマニュアル)」。チキンスキーム。2019年2月28日に取得。
- ^ ピーター・ベックス (シャマーン);クーダ。マリオ。 svnwiki;わさまさ。コン。マリオ (2018-08-11)。 「utf8(チキンマニュアル)」。チキンスキーム。2019年2月28日に取得。
- ^ 「鶏の卵」。チキンスキーム。
- ^ “RubyGems”. RubyGems.org . 2019年2月26日閲覧。
- ^ Bex, Peter (sjamaan)。「VCS に依存しない言語拡張の配布」。、ブログ投稿「More magic」
- ^ 「一般的なコードホスティング方法と VCS の説明」Chicken wiki。
- ^ 「Chicken 自動テスト」。Chicken Scheme。2019年 2 月 28 日閲覧。
- ^ iraikov (2016-06-11). 「pyffi」. Chicken Scheme Wiki . 2019年3月3日閲覧。
- ^ ピーター・ベックス (シャマーン);イライコフ (2012-03-11)。 「ルア」。チキンスキームWiki 。2019年3月3日に取得。
- ^ mario; svnwiki (2013-06-04). 「JNI」. Chicken Scheme Wiki . 2019-03-03閲覧。
- ^ ヴィンケルマン、フェリックス;マリオ (2013-06-04)。 「ジャバハック」。チキンスキームWiki 。2019年3月3日に取得。
- ^ ピーター・ベックス (シャマーン);ヴィンケルマン、フェリックス。マリオ (2018-09-23)。 「モジュール(チキン構文)」。チキンスキーム。2019年2月28日に取得。
- ^ ピーター・ベックス (シャマーン);ヴィンケルマン、フェリックス。マリオ (2018-09-23)。 「モジュール(チキン構文)」。チキンスキーム。2019年2月28日に取得。
- ^ ベックス、ピーター (sjamaan) (2018-11-25). 「デバッグ」。チキンスキーム。
- ^ Croisant, John (2013-06-19). 「CHICKEN SchemeとSPOCKの舞台裏(パート2)」. Atomic Spin . 2023年2月17日閲覧。
外部リンク
- 公式サイト
