Scheme(スキーム)は、コンピュータ
プログラミング言語であるLispの方言の一つで、静的スコープを持つことが大きな特徴です。Schemeは、その仕様と実装の両方を指すことがあります。静的スコープをLispの方言に導入し、その後のLisp系言語に大きな影響を与えました。
概要
Schemeは、1975年頃にMIT人工知能研究所で、ジェラルド・ジェイ・サスマンとガイ・スティール・ジュニアによって基本的な設計がなされました。その動機は、カール・ヒューイットが提案した並行計算モデル「アクター」と、その言語PLASMA(Planner-73)を理解することでした。Schemeの設計には、静的スコープ(
ALGOL由来)が不可欠であり、アクタ(クロージャ)の実現、λ計算、末尾再帰の最適化に貢献しました。また、プログラムの制御理論から生まれた継続渡し形式というプログラミング手法は、その後の継続の研究に大きな影響を与えました。
歴史
MIT人工知能研究所では、Lispから派生して複数の言語が開発されました。その中で、カール・ヒューイットが設計した規則ベース言語Plannerは複雑すぎたため、サスマンらはサブセット言語のMicro-Plannerとして実現し、さらにPlannerの流れを汲む独自言語Conniverを作成しました。
同様に、ヒューイットが設計したアクタ言語Plasma(Planner-73)も複雑で、MacLispによる実装はあったものの、その動作原理の理解は困難でした。そこで、サスマンとスティールはPlasmaを理解するために、不要な機能を省いたLisp構文を持つ小さなPlasmaを設計しました。この過程が、PlannerからMicro-Planner、そしてConniverへの流れを彷彿とさせたため、この言語は当初「Schemer(陰謀を企てる者)」と名付けられました。しかし、ファイルシステムの制限によりファイル名が6文字に制限されたため、Schemeという名前が採用されました。
機能
静的スコープ
マッカーシーは、1960年の最初のLisp(LISP I)に関して、「現代の用語で言えば、レキシカルスコープが望まれていたが、動的スコープが得られた」と回顧しています。計算理論的には、静的スコープが「正当」であり、動的スコープは一種の安易なインタプリタの実装手法による「バグ」と見なされることもあります(ただし、有用な場合も多いです)。
ガイ・スティールは、1962年のLisp 1.5からの変更点として、静的スコープの採用と実装を最初に挙げています。これは、サスマンが静的スコープを実装した
ALGOL 60に関心を持っていたことによるもので、
ALGOLの影響であると述べています。
しかし、1962年のLisp 1.5や1960年代後半のMaclispでも、変数の束縛に関しては不完全な点がありました。FUNARG問題として、Lispの初期から議論されていましたが、Scheme以降のLisp方言に静的スコープが広まったのは、Schemeの影響であると言えます。特に
Common Lispは、その影響を強く受けています。
継続
Schemeは、`call-with-current-continuation`(略称:call/cc)という、ピーター・ランディンやジョン・レイノルズが提唱した脱出オペレータを提供します。
言語仕様
Schemeの言語仕様は、
IEEEによって公式に定められており、「Revisedn Report on the Algorithmic Language Scheme (RnRS)」と呼ばれています。2016年現在、広く実装されているのは改訂第五版のR5RS(1998年)です。
2007年9月には、「The Revised6 Report on the Algorithmic Language Scheme (R6RS)」が成立しました。これは4部構成で、R5RSの約3倍の文章量となりました。R5RSまでは小さな言語仕様にこだわっていましたが、R6RSではUnicodeサポートなどの実用的な要素が盛り込まれています。しかし、多くの機能が盛り込まれた反面、細部の練り込みが不十分であるという批判もあり、非公式にR5RSを拡張するERR5RS (Extended R5RS Scheme)という規格も検討されています。
2009年8月、Scheme言語運営委員会は、Schemeを大規模バージョンと、そのサブセットである小さな言語仕様の2つに分割することを推奨しました。そして2013年7月には、「The Revised7 Report on the Algorithmic Language Scheme (R7RS)」(small language)が成立しました。
実装
Schemeの仕様書R5RSは50ページにも満たないため、多くの実装が存在します。以下にいくつかの例を挙げます。
Bigloo - 高速な実行ファイルを作るコンパイラ。
BiwaScheme -
JavaScriptによる実装。ブラウザ上で動作。
Chez Scheme - 元は商用だったが、現在はオープンソースの高速な実装。
Chicken - 可搬性の高い実用的コンパイラ。
Gauche - インタプリタ。多言語対応、STklosを発展させたオブジェクトシステムを持つ。
Gambit - Schemeインタプリタ及びScheme→Cコンパイラ。
GNU Guile - GNUの公式な拡張用言語。Schemeを元にしている。
その他(HScheme, IronScheme, Jscheme, JAKLD, Kawa, Larceny, LispMe, MIT Scheme, Mosh, Ocs, PocketScheme, Racket, QScheme, rhizome/pi, Scheme48, SECDR-Scheme, SigScheme, SISC, TinyScheme, Vx-scheme, Ypsilon)
SRFI
Schemeは、必要最低限の機能に絞ることを目指した言語です。そのため、仕様書は簡素ですが、実用上は各種ライブラリが乱立し、移植性が問題になっていました。そこで、実装間の統一を図るため、「Scheme Requests for Implementation (SRFI)」というコミュニティ内で議論を集約したものが存在します。SRFIでは、ライブラリ仕様や言語拡張仕様などがインデックス化され、SRFIに準拠した実装系は、その旨を明示することで利用者の利便性を高めています。
Schemeでは、言語機能とライブラリ機能は分けて考えられており、SRFIとScheme言語仕様のコミュニティは原則として分離しています。
応用
Schemeは、他のアプリケーションの拡張用言語としてよく使われます。代表的なアプリケーションには以下のものがあります。
GIMPのScript-Fu
uim
LilyPond
より専門的な応用としては、映画ファイナルファンタジーの3DレンダリングエンジンにSchemeインタプリタを組み込んだ例や、リトルウイングのピンボールコンストラクションシステムの記述にSchemeを使った例があります。また、Android用のApp Inventorでは、SchemeコンパイラであるKawaを使ってJava仮想マシン用のバイトコードを生成しています。
出典
Schemeが発表された一連の論文は、ラムダ論文と呼ばれています。
参考文献
(参考文献リストは省略)
関連項目
アクターモデル
継続
末尾再帰
SRFI
計算機プログラムの構造と解釈
外部リンク
schemers.org
R6RS.org
Scheme Requests for Implementation
プログラミング言語 Scheme
R5RS
R5RS日本語版
SchemePunks
独習 Scheme 三週間
Practical Scheme
もうひとつの Scheme 入門