Scheme

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

1. 概要
-----

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

静的スコープは、状態を持つデータであるアクタの実現以外にも、lambda 構文を用いたλ計算や末尾再帰の最適化に不可欠な機構であった。

また、プログラムの制御理論から当時出てきた継続及びアクタ理論におけるアクタへのメッセージ渡しの概念から触発された継続渡し形式と呼ばれるプログラミング手法は以後の継続の研究に大きな影響を与えた。

2. 歴史
-----

MIT人工知能研究所においては以下のとおりLISPに始まるいくつかの言語が作られた。

この中でカール・ヒューイットが設計した規則ベースの言語 Planner はあまりに複雑な機構を持っていたため当初設計された全機能の実装は困難であり、サスマン等はそれをサブセット言語の en として実現し、さらには、 Planner の流れを汲んだ独自言語として en を作成した。

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

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

3. 機能
-----

3.1. 静的スコープ
-----------

マッカーシーが後に回顧で、初期のLISPに関して「In modern terminology, lexical scoping was wanted, and dynamic scoping was obtained.」と書いているように、計算理論的にも静的スコープが本来は「正当」であり、動的スコープは、言ってしまえばある種の安易なインタプリタの実装手法が招く「バグ」である。

ガイ・スティールは、LISP 1.5 からの変更点として最初に静的スコープの採用と実装を挙げており、サスマンがAlgolに関して持っていた興味からによるもので、Algolの直接の影響だと述べている。

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

3.2. 継続
-------

3.2.1. call-with-current-continuation
-------------------------------------

en はcall-with-current-continuationと呼ばれるピーター・ランディンやジョン・レイノルズに始まる脱出オペレータの命令を提供する。

4. 言語仕様
-------

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

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

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

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

4.1. 仕様の決定
----------

5. 実装
-----

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

[1] - 高速な実行ファイルを作るコンパイラ。
[2] - en による実装。ブラウザ上で動作する。
[3] - もと商用だったが、現在はオープンソースの高速な実装。
en - 可搬性の高い実用的コンパイラ。
en - インタプリタ。多言語への対応、en を発展させたオブジェクトシステムを持つ。
en - Schemeインタプリタ及びScheme→Cコンパイラ。
en - en の公式な拡張用言語。en を元にしている。
[4]
[5]
[6]
[7] - en アプリケーション組み込み用のenドライバ
[8] - enプロジェクトのひとつ。en プログラムを en 仮想機械用にコンパイル可能。
[9] - IA-32、en の機械語を出力。IEEE/ANSI、R5RS、ERR5RS, R6RS準拠。
[10] - en 用の実装。無料。
[11] - x86アーキテクチャ用の en 実装。無料。
[12] - R6RS準拠の高速なインタプリタFFI、ソケットなどの拡張も。
[13]
[14] - en 用の実装。
en - 旧称 en。教育用の豪華な開発環境、柔軟なシステムで広く使われる。
[15]
[16]
[17]
[18] - en 拡張によるen。
[19] - アプリケーション組み込みを目的としたR5RS準拠の実装。uimで使用されている。
[20] - en。en 仮想機械上で動作するR5RS準拠の実装。en オブジェクトを en 上から利用することが可能。
[21] - 非常に小さい実装。enなどでも走る。正規表現やソケット通信もサポート。
[22] - en 用の実装。
[23] - R6RSに準拠するリアルタイムアプリケーション向けの実装。

5.1. SRFI
---------

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

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

6. 応用
-----

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

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

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

7. 出典
-----

7.1. ラムダ論文一覧
------------

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



7.2. 参考文献
---------

author=ジョエル・モーゼス [24]

8. 脚注
-----

8.1. 注釈
-------

8.2. 出典
-------

9. 関連項目
-------

アクターモデル
継続
末尾再帰
計算機プログラムの構造と解釈 - en を用いた計算機科学分野の古典的な教科書。

10. 外部リンク
---------

[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
[34]