Scheme

Scheme（スキーム）はコンピュータ・プログラミング言語 LISPの方言のひとつで、静的スコープなどが特徴である。仕様（2017年現在、改7版まで存在する）を指すこともあれば、実装を指すこともある。Schemeにより、LISP方言に静的スコープが広められた。

概要
Schemeは、MIT AIラボにて、ジェラルド・ジェイ・サスマンとガイ・スティール・ジュニアによって1975年頃に基本的な設計がなされた。動機は、カール・ヒューイットの提案によるエレガントな並行計算モデル「アクター」と、同じくその言語のPLASMA（Planner-73）を理解するためであった。

静的スコープ（ALGOL由来とされる元々のALGOLには関数引数等が無いためFUNARG問題なども無く、静的スコープの歴史としてALGOLをあまり強調する意味は無い。）は、状態を持つデータであるアクタ（クロージャ）の実現以外にも、lambda 構文を用いたλ計算や末尾再帰の最適化に不可欠な機構であった。

また、プログラムの制御理論から当時出てきた継続及びアクタ理論におけるアクタへのメッセージ渡しの概念から触発された継続渡し形式、CPS継続渡し形式は一連のλ論文において導入された。ただし、体系として確立されてはいないものの、同様の手法は「」にもみられる。と呼ばれるプログラミング手法は以後の継続の研究に大きな影響を与えた。

歴史
MIT人工知能研究所においては以下のとおりLISPに始まるいくつかの言語が作られた。
年言語作者1960年マッカーシー、他1964年ボブロウ1969年ガズマン1969年ヒューイット1970年サスマン、ヒューイット、他1971年サスマン、他1972年サスマン、他1973年ヒューイット、他1975年サスマン、スティール
この中でカール・ヒューイットが設計した規則ベースの言語 Planner はあまりに複雑な機構を持っていたため当初設計された全機能の実装は困難であり後の完全な Planner の実装として、エジンバラ大学の Julian Davies が POP-2 で実装した Popler がある。、サスマン等はそれをサブセット言語の  として実現し、さらには、 Planner の流れを汲んだ独自言語として  を作成した。

同じくカール・ヒューイットが設計したアクタ言語  (-73) も複雑な機構を持っていたため、 による実装が存在したものの、その動作の仕組みを理解するのは困難であった。サスマン及びガイ・スティール・ジュニアは  を理解するために、不要な機能を省いた  構文を持つ小さな  を設計した。

上記の  からその小さな  の設計に至る過程は  から  及び  へ至る過程を彷彿とさせるものであったため、その言語は （計画する者）及び （策略を巡らす者）の次という意味で当初 （陰謀を企てる者）と名付けられた。しかし、当時のオペレーティングシステムのファイルシステムの制限からファイル名が6文字に切られたことから  という名前が使われるようになった。

機能
静的スコープ

マッカーシーが1979年に回顧で、1960年の最初のLISP（LISP I）に関して「In modern terminology, lexical scoping was wanted, and dynamic scoping was obtained.」と書いているように、本来意図していた挙動は、静的スコープであった。動的スコープは、意図していたものではなかったため、FUNARG機構を導入して対処されたが、これは言語のスコープルールを静的にするのではなく、クロージャーを意図したように機能させるための部分的な修正であった。なお、動的スコープ自体は有用性が認められたため後のLispにも機能として残ることとなったが、これらの対処について、1962年の LISP 1.5 も1960年代後半の Maclisp もスコープの変数束縛に関しては色々と不完全だったとする意見もある。

ガイ・スティールは、1962年の LISP 1.5 からの変更点として最初に静的スコープの採用と実装を挙げており、サスマンが静的スコープを実装したALGOL 60に関して持っていた興味からによるもので、ALGOLの直接の影響だと述べている。「Scheme 過去◇現在◇未来 前編」『bit』（共立出版）Vol. 28, No.4（1996年4月号） pp. 4～9
なお、Scheme開発のきっかけとなったPlasmaも挙動としてはレキシカルスコープといえるが、Plasmaからの影響についての記述はない。

funarg問題としてLISPの初期から既に認識され議論されていたことでもあり、ALGOLとの融合が試みられた1964年のLISP 2でも静的スコープが採用されていたりと、必ずしも1975年のSchemeから始まったとは言えないが、Scheme以後のLISP方言に静的スコープが広まったのはSchemeからの影響と言ってよく、殊にCommon Lispは特筆される。

継続
call-with-current-continuation
 は（略称：call/cc）と呼ばれる当初は CATCH という名称であった。ピーター・ランディンやジョン・レイノルズに始まる脱出オペレータの命令を提供する。

言語仕様
 の言語仕様はIEEEによって公式に定められ、その仕様は「」と呼ばれている。2016年現在広く実装されているものは改訂第五版に当たるR5RS（1998年）である。

なお、2007年9月に「」が成立した。4部構成となり、R5RSに比べおよそ3倍の文章量となった。R5RSまでは小さな言語仕様に対してのこだわりが見られたが、 サポート等の実用的な言語として必要な要素が盛り込まれている点が特徴的である。しかし、多くの機能が盛り込まれたにもかかわらず細部の練りこみが不十分であるといった批判もあり、非公式にR5RSを拡張する形でERR5RS () という規格を検討する党派も現れている。

2009年8月、 言語運営委員会は、 を大規模バージョンと、大規模バージョンのサブセットとなる小さな言語仕様のふたつの言語に分割することを推奨する意向を発表した。

2013年7月、「」 () が成立した。

仕様の決定

実装
 の仕様書はR5RSだと50ページにも満たないため、かなりの数の実装が存在する。

 - 高速な実行ファイルを作るコンパイラ。
 -  による実装。ブラウザ上で動作する。
 - もと商用だったが、現在はオープンソースの高速な実装。
 - 可搬性の高い実用的コンパイラ。
 - インタプリタ。多言語への対応、 を発展させた（メタ）オブジェクトシステムを持つ。
（英語版） - Schemeインタプリタ及びScheme→Cコンパイラ。
 -  の公式な拡張用言語。 を元にしている。

 -  アプリケーション組み込み用のドライバ
 - プロジェクトのひとつ。 プログラムを  仮想機械用にコンパイル可能。
 - IA-32、 の機械語を出力。IEEE/ANSI、R5RS、ERR5RS, R6RS準拠。
 -  用の実装。無料。
 - x86アーキテクチャ用の  実装。無料。
Mosh  - R6RS準拠の高速なインタプリタFFI、ソケットなどの拡張も。

 -  用の実装。
 - 旧称 。教育用の豪華な開発環境、柔軟なシステムで広く使われる。

 -  拡張による（並列）。
 - アプリケーション組み込みを目的としたR5RS準拠の実装。uimで使用されている。
 - 。 仮想機械上で動作するR5RS準拠の実装。 オブジェクトを  上から利用することが可能。
 - 非常に小さい実装。などでも走る。正規表現やソケット通信もサポート。
 -  用の実装。
 - R6RSに準拠するリアルタイムアプリケーション向けの実装。

SRFI（サーフィ）
 は言語機能を必要十分の最低限まで単純化することを目指した言語である。そのため仕様書が簡素な反面、実用に際して各種のライブラリが乱立し、移植性が問題になっていた。そこで実装間の統一をとるため、コミュニティ内の議論を集約しているのが「」である。 ではライブラリ仕様、言語拡張仕様などがインデックス化されており、 準拠の実装系は「◯◯に準拠」といった形で利用者の便宜を図ることができる。

なお、 では言語機能とライブラリ機能は分けて考えられているため、 と  言語仕様のコミュニティは原則分離している。

応用
 はしばしば他のアプリケーションの拡張用言語として使われる。代表的なアプリケーションには以下のようなものがある。
 の 
uim

より専門的な応用としては、映画ファイナルファンタジーのために3Dレンダリングエンジンに  インタプリタを組み込んだ例や、リトルウイングのピンボールコンストラクションシステムの記述に  を使った例がある。

 用の  では、 コンパイラである  を使って仮想マシン用のバイトコードを生成している。

出典
ラムダ論文一覧
 が発表された一連の論文は、ラムダ論文と呼ばれている。

年題名1975年1976年1976年1977年1978年1978年1979年1980年1980年

参考文献
















  和訳

脚注
注釈

出典

関連項目
アクターモデル
継続
末尾再帰

計算機プログラムの構造と解釈 -  を用いた計算機科学分野の古典的な教科書。

外部リンク

schemers.org
R6RS.org

プログラミング言語 
R5RS
R5RS日本語版

独習  三週間

もうひとつの Scheme 入門

*
SCHEME
Category:プログラミング言語
Category:関数型プログラミング言語