CHICKEN 6.0.0、R7RSとUnicodeをコアに統合

Felix Winkelmannの26年の歴史を持つScheme実装が、最新の文字列モデル、改訂されたCインターフェース、そして相当な移行コストを手に入れた。

By · Published

Primary source: CHICKEN Scheme

Why it matters

CHICKEN 6 modernizes a 26-year-old compiler without abandoning its compile-to-C design, but its Unicode and R7RS gains require real migration work across existing code and eggs.

Illustration of CHICKEN 6.0.0 core architecture diagram showing integration of R7RS features and a Unicode string model.

CHICKEN 6.0.0 は、Felix L. Winkelmann が2000年に始めたScheme実装のコアに、R7RS Small 標準と UTF-8 文字列の完全なサポートを移しつつ、CHICKEN 5 からの移植作業を必要とするほどの基礎的なAPIの変更を行いました。Felix L. Winkelmann の投稿はこちらです: https://groups.google.com/g/comp.lang.scheme/c/QOil0WmRtWg/m/rp_Yb6Et--0J?ref=runtimewire

リリースノートは最終版がいつ公開されたかを明確に示していません。より安全な読み方は、6.0.0 が今週の議論よりずっと前に始まった公開開発サイクルの集大成である、というものです。Peter Bex は最初の 6.0.0 プレリリースを2024年12月に公開しました。彼は開発者に対して、extension ライブラリ(eggs)をテストし移植作業を開始するよう呼びかけました。

Winkelmann にとって、このリリースは26年前に行った技術的な賭けを拡張するものです:Scheme は狭い機械セットや大きなランタイムに縛られるよりも、素直なCにコンパイルすることで移植性を獲得できる、という考えです。彼の2000年7月20日の発表では、小さく拡張が容易でスタンドアロン実行可能ファイルを生成できる実装を説明していました。CHICKEN の現在のマニュアルは依然としてそのモデルを中心に据えています。コンパイラは移植可能なCを出力し、インタプリタは対話的開発とスクリプティングをサポートします。

Winkelmann は2007年までCHICKENを開発し、2008年初めにメンテナンスをコミュニティに引き継ぐよう求めました。彼はその後も活動を続け、CHICKENのメンテナ名簿には今も彼を著者かつコアハッカーの一人として、Peter Bex、Evan Hanson、Kooda、megane と並んで記載しています。その他の寄稿者たちが、言語実装を元の著者が一人で維持するよりもずっと長く使える状態に保つためのパッケージ、テスト、ドキュメント、インフラサービスを運用しています。

Standards move into the core

6.0.0 における定義的な変更は、R7RS Small で指定されたすべてのモジュールを CHICKEN のコアシステムで利用可能にする決定です。これまではその標準互換層は外部の R7RS egg に頼っていました。

この統合は馴染みのある手続きがどこにあるかにも影響します。call/ccparameterizeopen-input-stringget-output-string といった関数は (chicken base) から (scheme base) に移動しました。case-lambda は現在 (scheme case-lambda) にあり、define-record-type(scheme base) に移動して R7RS の振る舞いに合わせた生成型レコードを生成します。

CHICKEN はまた、R7RS ですでにカバーされているいくつかの古い SRFI に対するモジュールエイリアスを削除しました。以前 -r5rs-syntax と呼ばれていたコンパイラとインタプリタのオプションは -r7rs-syntax になっています。古い R4RS および R5RS 互換モジュールは (scheme ...) という慣習の下で名前が変更されました。

これらの変更により、標準準拠のコードを時間をかけて CHICKEN に持ち込むことが容易になります。一方で、既存のアプリケーションは、今や標準モジュールに属する手続きについて CHICKEN 固有の位置に依存するのをやめる必要があります。

UTF-8 changes the runtime contract

もう一つの基礎的な変化は、CHICKEN の内部文字列表現を UTF-8 に変換したことです。文字列は現在 Unicode に対応し、ファイルの入力と出力は UTF-8 または Latin-1 エンコーディングを指定でき、文字列のロケータはバイトではなくコードポイントでインデックスされます。

この作業は単なるテキスト表示の範囲を超えます。CHICKEN は (chicken blob)(chicken bytevector) に置き換え、R7RS 互換の bytevector 操作を提供します。bytevector は現在 SRFI-4 の u8vector 値と同等であり、古い blob リーダー構文は #u8(...)#u8"..." 形式に置き換えられています。

file-readfile-writerandom-bytes を含む手続きは文字列を受け入れる代わりに bytevector を要求するようになりました。CHICKEN はバイナリ入出力用のポートコンストラクタと bytevector の読み書き手続きを追加しました。その結果、エンコードされたテキストと生のバイトの区別が明確になり、以前は曖昧にされがちだった点が整理されました。

しかしその明確化には移行コストが伴います。文字列をバイトコンテナとして扱っていたコードは変更が必要であり、1バイトが1文字と仮定して文字列をインデックスしていたコードは見直しが必要です。CHICKEN の移植ガイドは、Unicode、blobs、bytevectors、ポートエンコーディング、移動した手続き、削除された API を CHICKEN 5 ユーザー向けの中心的な課題としてまとめています。

A broader systems update

バージョン 6.0.0 は CHICKEN のオペレーティングシステムおよび C インターフェイスも改訂しています。process-forkprocess-runprocess といったプロセス関数は、これまでの単なるプロセス識別子に代わってプロセスオブジェクトを返すようになりました。呼び出し側はレコードアクセサを通じてステータス情報やポートを取得でき、待機やシグナル送出の関数は引き続きオブジェクトまたは PID のいずれかを受け入れます。

(chicken file posix) におけるファイルロックは現在 flock(2) を使用し、ファイル全体に対して動作し、リリースノートではスレッドセーフであると説明されています。FFI は複素数、C の構造体および共用体を引数や戻り値として直接渡せるようになりました。外部コードに送られる文字列やシンボルはもうコピーされないため、C コードによる変更は Scheme 側からも見えるようになります。

ビルドプロセスも変更されました。configure スクリプトが make の前にソースを準備するようになり、CHICKEN は従来型の Unix ビルド慣行に近づきました。最小限の Windows ビルドは廃止され、代わりに POSIX シェルベースのツールチェインが採用され、ビルドは zig cc を代替の C コンパイラ兼リンカとして利用できます。コンパイラの最適化レベルは、割り当てを減らすためにクロージャの再利用と共有を有効にできるようになりました。

Winkelmann が Scheme を C に近いまま保つことへの関心は CHICKEN 6 の作業と並行して続いています。2024年には、CHICKEN 上で動作し移植可能な C99 を出力する静的型付け R7RS サブセットのコンパイラである CRUNCH を紹介しました。彼はそれを、ゲーム、仮想マシン、組み込みシステム、オペレーティングシステムの構成要素、性能重視のライブラリ向けのコンパクトなプログラムへの道と説明しました。

CHICKEN 6 は、その作業に標準志向の基盤を与えつつも元のアーキテクチャを保持します。このリリースはプロジェクトの「C にコンパイルする」アイデンティティを新しいランタイムやプラットフォームターゲットに置き換えるものではありません。テキスト、モジュール、レコード、プロセス、外部データに関する前提を更新することで、同じアーキテクチャがより新しい Scheme 標準に対して書かれたコードを扱えるようにしています。

現時点での直接的な作業はアプリケーションと egg のメンテナに委ねられます。CHICKEN 6 は非推奨の手続きを削除し、コアバインディングを移動し、ファイル処理や外部呼び出しの下にあるデータ表現を変更しました。利点は、移植可能な R7RS コードと CHICKEN コードの間のギャップが小さくなることです。代償は、開発者が通常のコンパイラアップグレードではなくポートとして扱わなければならない大きなメジャーバージョンの移行です。

Reader comments

Conversation for this story loads after sign-in.