Smalltalk
| Smalltalk | |
|---|---|
| パラダイム | オブジェクト指向 |
| 登場時期 | 1972年に開発が開始、 1980年に公開 |
| 設計者 | アラン・ケイ |
| 開発者 | Smalltalk-80, Dan Ingalls他(Xerox PARC); Smalltalk-80 → ObjectWorks → VisualWorks, ParcPlace Systems; VisualWorks, Cincom / Smalltalk-80 v1 → Apple Smalltalk, Larry Tesler他(Apple); Apple Smalltalk → Squeak, Dan Ingalls他(Apple → Walt Disney Imagineering → Viewpoints Research) |
| 最新リリース | VisualWorks 7.9 日本語版 /2012年10月12日 英語版 /2012年7月27日 |
| 型付け | 動的型付け |
| 主な処理系 | VisualWorks, Squeak |
| 影響を受けた言語 | SIMULA 67, Sketchpad, LISP, LOGO |
| 影響を与えた言語 | Actor, Flavors, Objective-C, SELF, Ruby |
Smalltalk(スモールトーク)は、Simulaのオブジェクト(およびクラス)、Lispの機能、LOGOのエッセンスを組み合わせて作られたクラスベースの純粋オブジェクト指向プログラミング言語、および、それによって記述構築された統合化プログラミング環境の呼称。
Smalltalkで一語であり、Small Talk、SmallTalkなどは誤りである。
目次 |
開発の経緯 [編集]
XEROXのパロアルト研究所 (PARC) で1970年代に約10年かけ3世代(Smalltalk-72、76、80)を経て整備された。当初は、暫定DynabookであるAltoのオペレーティングシステム的位置付けだったが、AltoのXEROX社製品としての販売の可能性が同社上層部決定により完全に排除されたこと、アイデアパーソンであるアラン・ケイの研究開発グループ離脱などを受けてDynabook色は失せ、Altoのハードウエア技術を基にした商用マシン上で動作するプロの開発者向け統合化プログラミング環境「Smalltalk-80」として1983年に発売されることになる。現在はCincomよりVisualWorksというパッケージ名でメジャーOS向けに販売されている。
Smalltalkとオブジェクト指向 [編集]
豊富で整備されたクラスライブラリは、特にオブジェクト指向プログラミングの手本とされ、デザインパターンの宝庫と称されるまで洗練されたものになっている。また、後世の多くのオブジェクト指向プログラミング言語に直接間接的に多大な影響を与えた。
アラン・ケイが「オブジェクト指向」という言葉を創った当初は、Smalltalkシステムが体現した「パーソナルコンピューティングに関わる全てを『オブジェクト』とそれらの間で交わされる『メッセージ送信』によって表現すること」を意味していた。しかしのちに、C++の設計者として知られるビャーネ・ストロヴストルップが(自身、Smalltalkの影響は受けていないと主張する)C++の設計を通じて整理し発表した「『継承』機構と『多相性』を付加した『抽象データ型』のスーパーセット」という考え方として広く認知されるようになった(カプセル化、継承、多相性)。現在は、両者の渾然一体化した曖昧な概念として語られることが多い。
Smalltalk環境の独自性 [編集]
Smalltalkは、オブジェクトへのメッセージ送信をダイレクトに記述する表記の特殊性や、制御構造をもたずオブジェクトへのメッセージ送信の形で記述する徹底ぶりとも併せて、C言語やC++などの構造化プログラミングの流れを強く受け継ぐ言語、およびその開発手法に慣れた開発者にとって極めてとっつきにくい言語・環境であるといわれている。このことは、Smalltalkが単なるプログラミング言語ではなく、従来のOSの概念をも包括する「環境」であることが一つの理由である。Smalltalkを単なる言語としてとらえると、他の言語と比較したとき、使用するOSのGUIに全く従わないなど、その独自性が大きな「欠点」として映る場合もある。
これはVisualWorksやSqueakなど、旧来のSmalltalk環境、つまりDynabookコンピュータ環境の要素を引き継ぐIDEを通じてSmalltalk言語や処理系を学ぶなら、多かれ少なかれ新たなOSに接するような心構えを持つべきことを意味する。
Smalltalk言語はSmalltalk環境から見ると、その扱いは、いわばbashなどのシェルに近い。Smalltalkのライブラリー構成はプログラムを作るためだけの機能だけでなく、対話操作を想定した機能を用意している。例えばクラスの構造や使い方はクラスオブジェクトにメッセージを送る事で知ることができる。具体的にはオブジェクト(クラスやメソッドも含む)の構造を調べたければ、そのオブジェクトにinspectメッセージを送れば良い。オブジェクトの使い方を知りたければcommentメッセージを送れば知ることが出来る。また、Smalltalk環境内であればどこでもマウスで選択した文字列をSmalltalkのソースコードとして実行でき、シェルにコマンドを打ち込む時の様な簡単な問い合わせをすぐ実行できるようになっている。Smalltalkの学習において、Smalltalk環境の詳細についてはSmalltalkに尋ねる形となりSmalltalkの文字通りSmalltalkと会話していく事になる。
環境および処理系 [編集]
Smalltalkの言語仕様は原則として非常に単純なため、環境もしくは処理系の相違による互換の有無は、クラスライブラリの差異程度に由来するもの(ある意味、バージョンの違いもこれも含まれる)から、言語仕様自体の改変に由来のものまで空間的に連続で多岐にわたる。このため、単にSmalltalkとして語弊のある場合、一般にその環境および処理系の呼称もしくは商標(必要ならそのバージョン)をして他と区別するために用いる慣習がある。
- Smalltalk-72
- Smalltalk-74
- Smalltalk-76
- Smalltalk-78
- Smalltalk-80
- ObjectWorks
- VisualWorks
- Squeak
- VisualAge Smalltalk
- Little Smalltalk
- GNU Smalltalk
- Dolphin Smalltalk
- #Smalltalk
- SmallScript (S#)
- Smalltalk MT
- Smalltalk/V
- Smalltalk/X
- Concurrent Smalltalk
- Distributed Smalltalk
- Strongtalk
- PIC/Smalltalk
- Smalltalk/JVM
- Smalltalk Express
- Ambrai Smalltalk
文法 [編集]
Smalltalkでは「メッセージ式」と呼ばれる書式でコードを記述する。メッセージ式は「レシーバ」に「メッセージ」を送ることを表すためのもので、そのまま
receiver message
と記述する。メッセージはさらに、コールされるメソッドの名前を表す「メッセージセレクタ(あるいは単にセレクタ)」と0個以上の引数の組み合わせからなる。セレクタは引数の数だけコロンを自身に含まなければならず、メッセージとして記述する際にはコロンの直後に引数を挿入する。
"メッセージ式" "セレクタ" "引数" receiver noArg "noArg" "なし" receiver oneArg: arg "oneArg:" "arg" receiver argOne: arg1 argTwo: arg2 "argOne:argTwo:" "arg1, arg2"
引数なしのメッセージを「単項メッセージ」、そのセレクタを「単項セレクタ」と呼び、引数ありのメッセージを「キーワードメッセージ」、そのセレクタを「キーワードセレクタ」と呼ぶ。メッセージ記述の際に引数の挿入により分断されたキーワードセレクタ断片(例えば argOne:argTwo: なら argOne: と argTwo:)を「キーワード」と呼ぶが、あくまで便宜的な呼び名に過ぎず、そうしたエンティティがある訳でも、他の言語に見られる「キーワード引数」のような意味や機能(引数順を入れ替えられる⋯とか)がある訳でもない。
セレクタは原則としてアルファベットと数字と0個以上(かつ、引数と同数)のコロンから成るが、例外として二項演算を模した記述が可能となるように記号のみから成る引数1つのセレクタを使ってメッセージ式を記述することもできる。これを「二項メッセージ」、そのセレクタを「二項セレクタ」と呼ぶ。
"メッセージ式" "セレクタ" "引数" 3 + 4 "+" "4" #(1 2 3), #(4 5) "," "#(4 5)"
この場合、上の「3 + 4」では、「3」がレシーバで「+ 4」がメッセージである。
通常の処理系では、単項メッセージ > 二項メッセージ > キーワードメッセージの順で評価される。二項メッセージ間で乗除の優先はない。
3 + 4 * 5 min: 6 factorial "== ((3 + 4) * 5) min: (6 factorial)"
テンポラリ変数は宣言が必要で、| で挿むように記述する。変数への代入は「:=」。古い処理系では「_」が使用された(グリフは「←」)。複数の式を順次実行する場合は、式をピリオドで区切る。処理を中断し戻り値を指定するには「^ 戻り値式」(リターン)を使う。
| a b | a := 3. b := 4. ^a + b
制御構文は「リターン」を除いて存在しない。例えば if-then-else なら ifTrue:ifFalse: セレクタを用いたメッセージ式として、条件式の結果の真偽値へのメッセージ送信の形で次のように記述する。
3 < 4 ifTrue: [5] ifFalse: [6]
ただ、多くの処理系では条件式やループ式はバイトコードレベルでインライン展開される(ジャンプ命令の表現に置き換えられる)ため、実際に、例えば上のコードを評価した場合に「ifTrue: [5] ifFalse: [6]」というメッセージが送られる訳ではなく、ひいては ifTrue:ifFalse: という名のメソッドがコールされることもないということは、いずれ知っておく必要がある。
主なリテラル表現には次のようなものがある。
"整数" 3 "小数" 3.4 "浮動小数点数" 3.4e5 "文字" $a "文字列" 'abc' "シンボル" #abc "配列(要素はリテラル限定)" #('This' #is $a 10) "ブロック(パラメータなし)" [3 + 4] "ブロック(パラメータ付き)" [:x | x + 1]
リテラルではないが、よく用いられるオブジェクトの生成式には次のようなものがある。
"分数" 3 / 4 "複素数" 3 + 4i "座標" 3 @ 4
なお、コメントは "..." とダブルクオーテーションで括る。
他の言語で予約語にあたる擬変数は self、super、nil、true、false、thisContext の6つ。selfとsuperはそのメソッドをコールしたメッセージの受け手(レシーバ)を、nilとtrueとfalseはそれぞれUndefinedObject、True、Falseに属するソルインスタンスを、thisContextは実行中のコンテキスト(スタックフレーム)を参照するのに使える。
selfとsuperは同じオブジェクトだが、メッセージ式でメッセージレシーバに指定されたときのメソッドサーチの起点が、オブジェクトが属するクラスから(selfの場合)か、そのスーパークラスから(superの場合)かで異なる。
メソッドの定義は、コード文字列を引数として与えたクラスへのメッセージ送信でも行えるが、通常は環境に組み込まれたクラスブラウザ(システムブラウザ)と呼ばれるGUIツールを用いる。
メソッドの定義コードは、「メッセージパターン」と呼ばれるメッセージ式のメッセージ部分を模した書式に続けて0個以上のメッセージ式を連ねることで記述する。例えば、前出の、レシーバか引数を比べてより小さな方を返す「min:」というメソッドの定義は次のようなものになる。
min: other ^self < other ifTrue: [self] ifFalse: [other]
一行目の「min: other」がメッセージパターンで、メソッド名(セレクタ)と仮引数となる擬変数の宣言を兼ねる。念のためここでメソッド名は「min:」、仮引数となる擬変数名は「other」である。メッセージパターンのあとに処理を続けて書くこともできるが、通常は行を改めて(さらに、ここでは省いたが慣習としてメソッドの説明をするコメントを書き、それに続けて)処理を記述する。
なお、メッセージパターンのみで具体的な処理を記述せずにメソッドを定義した場合を含め、リターンによる明示的な戻り値の指定が無い場合、メソッドは戻り値として常にselfを返す。したがってSmalltalkでは値を返さないメソッドを書くことはできない。
メッセージ [編集]
Smalltalkにおいて、メッセージ、セレクター、メソッドはそれぞれ別物である。 C++系統の言語の様にオブジェクトに対しメッセージを送るという事は単なるメソッド呼び出しの比喩ではない。
あるオブジェクトに対し「hello」というメッセージを送信する事を考える。 この時、Smalltalkにおいては「hello」というメソッドが必ず呼ばれる保証はない。 例えば「hello」メッセージのレシーバーに指定されたオブジェクトが「hello」メソッドを 登録していなければレシーバーに指定されたオブジェクトの「doesNotUnderstand:」メソッドが呼ばれる事になる。
詳しくはメッセージ転送を参照。
外部リンク [編集]
- Goldberg, Adele; Robson, David (May 1983). Smalltalk-80: The Language and its Implementation. Addison-Wesley. ISBN 0-201-11371-6.