Scheme
| Scheme | |
|---|---|
| パラダイム | マルチパラダイム |
| 登場時期 | 1975年[1] |
| 設計者 | ガイ・L・スティール、ジェラルド・ジェイ・サスマン |
| 型付け | 強い、動的型付け |
| 主な処理系 | Gauche、Racket、MIT/GNU Scheme、Scheme 48、Guile、Chez Scheme、 |
| 影響を受けた言語 | Plasma, Conniver、Planner, ALGOL 60, Lisp |
Scheme(スキーム)は構文スコープを持つLispの方言の一つである[2]。
Lisp系統の言語としては Common Lisp と並んで現在でもよく使われている。
言語仕様の小ささとその出自からプログラミングの教育分野でもよく使われている。
目次 |
概要[編集]
Scheme(スキーム)は、MITの人工知能研究所においてカール・ヒューイット (Carl E. Hewitt) の設計したアクタ言語Plasma (Planner-73) の動作を理解するために、アロンゾ・チャーチ (Alonzo Church) のλ計算を基盤に持つLisp方言として、カール・ヒューイットの学生であったジェラルド・ジェイ・サスマン (Gerald Jay Sussman) と ガイ・スティール (Guy Lewis Steele, Jr.) によって1975年頃に設計された。
アクタ (actor) を言語に導入するにあたって採用された ALGOL 60 由来の構文スコープは、状態を持つデータであるアクタ(クロージャ;closure)の実現以外にも、lambda 構文を用いたλ計算 (lambda calculus) や末尾再帰 (tail-recursion) の最適化に不可欠な機構であった。
また、プログラムの制御理論から当時出てきた継続 (continuation) 及びアクタ理論におけるアクタへのメッセージ渡し (message passing) の概念から触発された継続渡し形式 (continuation passing style, CPS)[3]と呼ばれるプログラミング手法は以後の継続 (continuation) の研究に大きな影響を与えた。
歴史[編集]
MIT人工知能研究所においては以下のとおりLispに始まるいくつかの言語が作られた。
- Lisp (McCarthy et al., 1958)
- Meteor Bobrow, 1964)
- Convert (Guzman, 1969)
- Planner (Hewitt, 1969)
- Muddle (Sussman, Hewitt, et al., 1970)
- Micro-Planner (Sussman et al., 1971)
- Conniver (Sussman et al., 1972)
- Plasma (Hewitt et al., 1973)
- Schemer (Sussman and Steele, 1975)
この中でカール・ヒューイットが設計した規則ベースの言語 Planner はあまりに複雑な機構を持っていたため実装されなかった。サスマン等はそれを使いやすい言語 Micro-Planner、Conniver として実現した。
同じくカール・ヒューイットが設計したアクタ言語 Plasma (Planner-73) も複雑な機構を持っていたため、MacLisp による実装が存在したものの、その動作の仕組みを理解するのは困難であった。サスマン及びガイ・スティールは Plasma を理解するために、不要な機能を省いた Lisp 構文を持つ小さな Plasma を設計した。
上記の Plasma からその小さな Plasma の設計に至る過程は Planner から Micro-Planner 及び Conniver へ至る過程を彷彿とさせるものであったため、その言語は Planner(プランをするなにか)及び Conniver(スニーキーなプランをするなにか)の次という意味で当初 Schemer(Conniverよりもスニーキーなプランをするなにか)と名付けられた。しかし、当時のOSのファイルシステムの制限からファイル名が6文字に切られたことから Scheme という名前が使われるようになった。
機能[編集]
構文スコープ (lexical scope)[編集]
Scheme 以前の Lisp 方言では変数束縛が実行履歴を元に決定される動的スコープ (dynamic scope) が採用されていたが、Schemeでは変数の意味が構文的に定まるという構文スコープ(lexical scope;静的スコープ)を Lisp 方言として当時初めて採用した。構文スコープは環境 (environment) の機構により実現される。
Algol 60からの直接の影響はこの構文スコープである[4]。構文スコープは後に Scheme からの影響を受けた形で Common Lisp にも採用されたと言われる。
継続 (continuation)[編集]
call/cc[編集]
Schemeはcall-with-current-continuation(略称:call/cc)と呼ばれる[5] Landin や Reynolds に始まる脱出オペレータ (escape operator) の命令を提供する。
言語仕様[編集]
Schemeの言語仕様はIEEEによって公式に定められ[6]、その仕様は「Revisedn Report on the Algorithmic Language Scheme」(RnRS) と呼ばれている。現在広く実装されているものは改訂第五版に当たるR5RS(1998年)である。
LISP系言語は Scheme と Common Lisp を二大潮流とするが、提案された機能を原則全て導入する Common Lisp に対して、成員の全員一致を原則とする Scheme という特徴を持っている。
なお、2007年9月に新仕様「The Revised6 Report on the Algorithmic Language Scheme」 (R6RS)[7] が成立した。4部構成となり、R5RSに比べおよそ3倍の文章量となった。R5RSまでは小さな言語仕様に対してのこだわりが見られたが、UNICODEサポート等の実用的な言語として必要な要素が盛り込まれている点が特徴的である。しかし、多くの機能が盛り込まれたにもかかわらず細部の練りこみが不十分であるといった批判もあり、非公式にR5RSを拡張する形でERR5RS (Extended R5RS Scheme) という規格を検討する党派も現れている。
仕様の決定[編集]
実装[編集]
Schemeの仕様書はR5RSだと50ページにも満たないため、かなりの数の実装が存在する。
- Bigloo - 高速な実行ファイルを作るコンパイラ。
- BiwaScheme - JavaScriptによる実装。ブラウザ上で動作する。
- Chez Scheme - 商用の高速な実装。
- Chicken - 可搬性の高い実用的コンパイラ。
- Gauche - インタプリタ。多言語への対応、STklosを発展させた(メタ)オブジェクトシステムを持つ。
- GNU Guile - GNUの公式な拡張用言語。Schemeを元にしている。
- HScheme
- IronScheme
- Jscheme
- jakld - Javaアプリケーション組み込み用のLISPドライバ
- Kawa - GNUプロジェクトのひとつ。SchemeプログラムをJava仮想機械用にコンパイル可能。
- Larceny
- LispMe - Palm OS 用の実装。無料。
- MIT Scheme - x86アーキテクチャ用のScheme実装。無料。
- Mosh - R6RS準拠の高速なインタプリタFFI、ソケットなどの拡張も。
- Ocs
- PocketScheme - WindowsCE 用の実装。
- Racket - 旧称 PLT Scheme。教育用の豪華な開発環境、柔軟なシステムで広く使われる。
- QScheme
- rhizome/pi
- Scheme48
- SigScheme - アプリケーション組み込みを目的としたR5RS準拠の実装。uimで使用されている。
- SISC - Second Interpreter of Scheme Code。Java仮想機械上で動作するR5RS準拠の実装。JavaオブジェクトをScheme上から利用することが可能。
- TinyScheme - 非常に小さい実装。Zaurusなどでも走る。正規表現やソケット通信もサポート。
- Vx-scheme - VxWorks用の実装。
- Ypsilon - R6RSに準拠するリアルタイムアプリケーション向けの実装。
SRFI[編集]
Schemeは言語機能を必要十分の最低限まで単純化することを目指した言語である。そのため仕様書が簡素な反面、実用に際して各種のライブラリが乱立し、移植性が問題になっていた。そこで実装間の統一をとるため、コミュニティ内の議論を集約しているのが「Scheme Requests for Implementation (SRFI)」である。SRFIではライブラリ仕様、言語拡張仕様などがインデックス化されており、SRFI準拠の実装系は「Xに準拠」といった形で利用者の便宜を図ることができる。
なお、Schemeでは言語機能とライブラリ機能は分けて考えられているため、SRFIとScheme言語仕様のコミュニティは原則分離している。
出典[編集]
ラムダ論文一覧[編集]
Schemeが発表された一連の論文は、ラムダ論文と呼ばれている[8]。
- 1975年: Scheme: An Interpreter for Extended Lambda Calculus
- 1976年: Lambda: The Ultimate Imperative
- 1976年: Lambda: The Ultimate Declarative
- 1977年: Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO
- 1978年: The Art of the Interpreter or, the Modularity Complex (Parts Zero, One, and Two)
- 1978年: RABBIT: A Compiler for SCHEME
- 1979年: Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode
- 1980年: Compiler Optimization Based on Viewing LAMBDA as RENAME + GOTO
- 1980年: Design of a Lisp-based Processor
参考文献[編集]
- ガイ・スティール・ジュニア (1996), Scheme 過去◇現在◇未来 前編・後編
- Guy Lewis Steele, Jr. (2006), The History of Scheme
- Gerald Jay Sussman and Guy Lewis Steele, Jr. (1975), Scheme: An Interpreter for Extended Lambda Calculus
- Guy Lewis Steele, Jr. and Gerald Jay Sussman (1976), Lambda: The Ultimate Imperative
- Guy Lewis Steele, Jr. (1976), Lambda: The Ultimate Declarative
- Guy Lewis Steele, Jr. (1977), Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO
- Guy Lewis Steele, Jr. and Gerald Jay Sussman (1978), The Art of the Interpreter or, the Modularity Complex (Parts Zero, One, and Two)
- Guy Lewis Steele, Jr. (1978), Rabbit: A Compiler for Scheme
- Guy Lewis Steele, Jr. and Gerald Jay Sussman (1979), Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode
- Carl Hewitt (1967), PLANNER A Language for Proving Theorem
- Gerald Jay Sussman and Terry Winograd (1970), Micro-Planner Reference Manual
- V. McDermott and Gerald Jay Sussman (1972), The CONNIVER Reference Manual
- Irene Greif, Carl Hewitt (1974), Actor Semantics of PLANNER-73
- Peter J. Landin (1965), A Generalization of Jumps and Labels
- Hayo Thielecke (1998), An Introduction to Landin’s “A Generalization of Jumps and Labels”
- John C. Reynolds (1972), Denitional Interpreters for Higher-Order Programming Languages
- Joel Moses (1970), The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem 和訳
脚注[編集]
- ^ Gerald J. Sussman、Guy L. Steele Jr. (December 1975). “Scheme: An interpreter for extended lambda calculus”. MIT AI Memo 349 (Massachusetts Institute of Technology).
- ^ Schemeは構文スコープを持つ初めてのLisp方言である。
- ^ 継続渡し形式は一連のλ論文において導入された。ただし、体系として確立されてはいないものの、同様の手法は John C. Reynolds (1972), Denitional Interpreters for Higher-Order Programming Languages にもみられる。
- ^ 「Scheme 過去◇現在◇未来 前編」より
- ^ 当初は
CATCHという名称であった。 - ^ 1178-1990 (Reaff 2008) IEEE Standard for the Scheme Programming Language. IEEE part number STDPD14209, unanimously reaffirmed at a meeting of the IEEE-SA Standards Board Standards Review Committee (RevCom), March 26, 2008 (item 6.3 on minutes), reaffirmation minutes accessed October 2009. NOTE: this document is only available for purchase from IEEE and is not available online at the time of writing (2009).
- ^ Michael Sperber ほか. “The Revised6 Report on the Algorithmic Language Scheme” (英語). 2009年2月2日閲覧。
- ^ Online version of the Lambda Papers(PDF文書)