Scheme

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Scheme
Scheme
Schemeのロゴ
パラダイム 関数かんすうがたプログラミング手続てつづがたプログラミングメタプログラミング命令めいれいがたプログラミング ウィキデータを編集
登場とうじょう時期じき 1975ねん (49ねんまえ) (1975)
設計せっけいしゃ ガイ・L・スティール・ジュニアジェラルド・ジェイ・サスマン
最新さいしんリリース R7RS-small / 2013[1]
型付かたつ つよい、動的どうてき型付かたつ
おも処理しょりけい GaucheRacketMIT/GNU SchemeScheme 48GuileChez Scheme
影響えいきょうけた言語げんご LISPALGOL、MDL (プログラミング言語げんごウィキデータを編集
影響えいきょうあたえた言語げんご ClojureCommon LispDylanEgisonEuLispHaskellHopJavaScriptJuliaLuaMultiLispPythonRRacketRubyRust[2]SScalaT
ウェブサイト www.scheme-reports.org ウィキデータを編集
拡張子かくちょうし scm、ss ウィキデータを編集
テンプレートを表示ひょうじ

Scheme(スキーム)はコンピュータ・プログラミング言語げんご LISP方言ほうげんのひとつで、静的せいてきスコープなどが特徴とくちょうである。仕様しよう(2017ねん現在げんざいあらため7はんまで存在そんざいする)をすこともあれば、実装じっそうすこともある。Schemeにより、LISP方言ほうげん静的せいてきスコープがひろめられた。

概要がいよう[編集へんしゅう]

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

参考さんこう文献ぶんけん[編集へんしゅう]

脚注きゃくちゅう[編集へんしゅう]

注釈ちゅうしゃく[編集へんしゅう]

  1. ^ 元々もともとのALGOLには関数かんすう引数ひきすうとういためFUNARG問題もんだいなどもく、静的せいてきスコープの歴史れきしとしてALGOLをあまり強調きょうちょうする意味いみい。
  2. ^ えい: closure
  3. ^ えい: lambda calculus
  4. ^ えい: tail-recursion
  5. ^ えい: continuation
  6. ^ えい: message passing
  7. ^ えい: continuation passing style、CPS
  8. ^ 継続けいぞくわた形式けいしき一連いちれんλらむだ論文ろんぶんにおいて導入どうにゅうされた。ただし、体系たいけいとして確立かくりつされてはいないものの、同様どうよう手法しゅほうは「John C. Reynolds (1972), Denitional Interpreters for Higher-Order Programming Languages, http://cs.au.dk/~hosc/local/HOSC-11-4-pp363-397.pdf 」にもみられる。
  9. ^ 完全かんぜんな Planner の実装じっそうとして、エジンバラ大学だいがくの Julian Davies が POP-2 で実装じっそうした Popler がある。
  10. ^ 当初とうしょCATCH という名称めいしょうであった。
  11. ^ えい: escape operator

出典しゅってん[編集へんしゅう]

  1. ^ 出典しゅってんURL: https://small.r7rs.org/
  2. ^ Influences - The Rust Reference”. The Rust Reference. 2023ねん4がつ18にち閲覧えつらん
  3. ^ From LISP 1 to LISP 1.5”. www-formal.stanford.edu. 2024ねん4がつ8にち閲覧えつらん
  4. ^ 「Scheme 過去かこ現在げんざい未来みらい 前編ぜんぺん」『bit』(共立きょうりつ出版しゅっぱん)Vol. 28, No.4(1996ねん4がつごう) pp. 4~9
  5. ^ Baker, Henry G. (July 1978). “Shallow binding in Lisp 1.5”. Commun. ACM (New York, NY, USA: Association for Computing Machinery) 21 (7): 565–569. doi:10.1145/359545.359566. ISSN 0001-0782. https://doi.org/10.1145/359545.359566. 
  6. ^ 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).
  7. ^ Michael Sperber ほか. “The Revised6 Report on the Algorithmic Language Scheme” (英語えいご). 2009ねん2がつ2にち閲覧えつらん
  8. ^ Position statement” (英語えいご). 2013ねん12月16にち閲覧えつらん
  9. ^ Scheme Working Groups” (英語えいご). 2013ねん12月16にち閲覧えつらん
  10. ^ 川合かわい史朗しろう (2002ねん10がつ). “Gluing Things Together - Scheme in the Real-time CG Content Production”. 2014ねん6がつ20日はつか閲覧えつらん
  11. ^ 藤田ふじた善勝よしかつ. “YPSILON”. 2014ねん6がつ20日はつか閲覧えつらん
  12. ^ Online version of the Lambda Papers (PDF)
  13. ^ Sussman, Gerald Jay; Steele, Guy Lewis (1975). Scheme: An Interpreter for Extended Lambda Calculus (Report). Massachusetts Institute of Technology. hdl:1721.1/5794
  14. ^ Sussman, Gerald Jay; Steele Jr, Guy L (1998). “Scheme: A interpreter for extended lambda calculus”. Higher-Order and Symbolic Computation (Springer) 11 (4): 405–439. doi:10.1023/A:1010035624696. https://www.researchgate.net/publication/227098423_Scheme_A_Interpreter_for_Extended_Lambda_Calculus. 

関連かんれん項目こうもく[編集へんしゅう]

外部がいぶリンク[編集へんしゅう]