Scheme

ウィキペディアから

Scheme

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

概要 パラダイム, 登場時期 ...
Scheme
Thumb
Schemeのロゴ
パラダイム 関数型プログラミング手続き型プログラミングメタプログラミング命令型プログラミング 
登場時期 1975年 (50年前) (1975)
設計者 ガイ・L・スティール・ジュニアジェラルド・ジェイ・サスマン
最新リリース R7RS-small / 2013[1]
型付け 強い、動的型付け
主な処理系 GaucheRacketMIT/GNU SchemeScheme 48GuileChez Scheme
影響を受けた言語 LISPALGOL、MDL (プログラミング言語) 
影響を与えた言語 ClojureCommon LispDylanEgisonEuLispHaskellHopJavaScriptJuliaLuaMultiLispPythonRRacketRubyRust[2]SScalaT
ウェブサイト www.scheme.org
拡張子 scm、ss 
テンプレートを表示
閉じる

概要

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

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

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

歴史

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

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

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

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

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

機能

静的スコープ

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

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

ただし、1962年の LISP 1.5 も1960年代後半の Maclisp もスコープの変数束縛に関しては色々と不完全だった。[5]

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

継続

call-with-current-continuation

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

言語仕様

Scheme の言語仕様はIEEEによって公式に定められ[6]、その仕様は「Revisedn Report on the Algorithmic Language Scheme (RnRS)」と呼ばれている。2016年現在広く実装されているものは改訂第五版に当たるR5RS(1998年)である。

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

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

2013年7月、「The Revised7 Report on the Algorithmic Language Scheme (R7RS)[9] (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 - Java アプリケーション組み込み用のLISPドライバ
  • Kawa - GNUプロジェクトのひとつ。Scheme プログラムを Java 仮想機械用にコンパイル可能。
  • Larceny - IA-32SPARC の機械語を出力。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 CodeJava 仮想機械上で動作するR5RS準拠の実装。Java オブジェクトを Scheme 上から利用することが可能。
  • TinyScheme - 非常に小さい実装。Zaurusなどでも走る。正規表現やソケット通信もサポート。
  • Vx-scheme - VxWorks 用の実装。
  • Ypsilon - R6RSに準拠するリアルタイムアプリケーション向けの実装。

SRFI(サーフィ)

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

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

応用

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

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

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

出典

要約
視点

ラムダ論文一覧

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

さらに見る 年, 題名 ...
題名
1975年Scheme: An Interpreter for Extended Lambda Calculus[13][14]
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
閉じる

参考文献

脚注

関連項目

外部リンク

Wikiwand - on

Seamless Wikipedia browsing. On steroids.