Scheme

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

テンプレート:Infobox プログラミング言語

Scheme(スキーム)は構文スコープを持つLISPの方言の一つである[1]

LISP系統の言語としてはCommon Lispと並んで現在でもよく使われている。

言語仕様の小ささとその出自からプログラミングの教育分野でもよく使われている。

概要

Schemeは、マサチューセッツ工科大学の人工知能研究所においてカール・ヒューイットの設計したアクタ言語Plasma (Planner-73) の動作を理解するために、アロンゾ・チャーチのλ計算を基盤に持つLISP方言として、カール・ヒューイットの学生であったジェラルド・ジェイ・サスマンガイ・スティールによって1975年頃に設計された。

アクタを言語に導入するにあたって採用されたALGOL 60由来の構文スコープは、状態を持つデータであるアクタ(クロージャ[2])の実現以外にも、lambda 構文を用いたλ計算[3]末尾再帰[4]の最適化に不可欠な機構であった。

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

歴史

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

言語 作者
1958年 LISP マッカーシー、他
1964年 Meteor ボブロウ
1969年 Convert ガズマン
1969年 Planner ヒューイット
1970年 Muddle サスマン、ヒューイット、他
1971年 Micro-Planner サスマン、他
1972年 Conniver サスマン、他
1973年 Plasma ヒューイット、他
1975年 Schemer サスマン、スティール

この中でカール・ヒューイットが設計した規則ベースの言語Plannerはあまりに複雑な機構を持っていたため実装されなかった。サスマン等はそれを使いやすい言語Micro-Planner、Conniverとして実現した。

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

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

機能

構文スコープ

Scheme以前のLISP方言では変数束縛が実行履歴を元に決定される動的スコープが採用されていたが、Schemeでは変数の意味が構文的に定まるという構文スコープをLISP方言として当時初めて採用した。構文スコープは環境の機構により実現される。

Algol 60からの直接の影響はこの構文スコープである[9]。構文スコープは後にSchemeからの影響を受けた形でCommon Lispにも採用されたと言われる。

継続

call/cc

Schemeはcall-with-current-continuation(略称:call/cc)と呼ばれる[10]ピーター・ランディンやジョン・レイノルズに始まる脱出オペレータ[11]の命令を提供する。

言語仕様

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

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

2013年7月、「The Revised7 Report on the Algorithmic Language Scheme (R7RS)[15] (small language) が成立した。

仕様の決定

テンプレート:節stub

実装

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 - IA-32, SPARCのネイティブコードを出力。IEEE/ANSI, R5RS, ERR5RS, R6RS準拠。
  • LispMe - Palm OS用の実装。無料。
  • MIT Scheme - x86アーキテクチャ用のScheme実装。無料。
  • Mosh - R6RS準拠の高速なインタプリタFFI、ソケットなどの拡張も。
  • Ocs
  • PocketScheme - Windows CE用の実装。
  • Racket - 旧称PLT Scheme。教育用の豪華な開発環境、柔軟なシステムで広く使われる。
  • QScheme
  • rhizome/pi
  • Scheme48
  • SECDR-Scheme - Lispkit Lisp拡張による(並列)Scheme。
  • 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はしばしば他のアプリケーションの拡張用言語として使われる。代表的なアプリケーションには以下のようなものがある。

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

Android用のApp Inventorでは、SchemeコンパイラであるKawaを使ってJVM用のバイトコードを生成している。

出典

ラムダ論文一覧

Schemeが発表された一連の論文は、ラムダ論文と呼ばれている[18]

題名
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

参考文献

脚注

テンプレート:Reflist

関連項目

外部リンク

テンプレート:Sister

  • Schemeは構文スコープを持つ初めてのLISP方言である。
  • テンプレート:Lang-en-short
  • テンプレート:Lang-en-short
  • テンプレート:Lang-en-short
  • テンプレート:Lang-en-short
  • テンプレート:Lang-en-short
  • テンプレート:Lang-en-short、CPS
  • 継続渡し形式は一連のλ論文において導入された。ただし、体系として確立されてはいないものの、同様の手法は「テンプレート:Citation」にもみられる。
  • 「Scheme 過去◇現在◇未来 前編」より
  • 当初は CATCH という名称であった。
  • テンプレート:Lang-en-short
  • 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).
  • テンプレート:Cite web
  • テンプレート:Cite web
  • テンプレート:Cite web
  • テンプレート:Cite web
  • テンプレート:Cite web
  • テンプレート:PDFlink