Smalltalk未経験者(ただし、C++、Java等のオブジェクト指向言語によ るプログラミング経験はある)に向けたFAQ形式でお送りします。


Smalltalkって何?

Smalltalkは純粋なオブジェクト指向プログラミング言語です。 (「純粋」が何を意味するかは、次の「Smalltalkってどんな言語?」を参 照してください) Smalltalkは初め、1970年代頃にXerox社(外部リンク)のPalo Alto研究所(外部リンク)におい て、Alan Kay氏らを中心に作られました。最初に一般に公開されたバージョンは Smalltalk-80と呼ばれています。その後、様々なベンダーがSmalltalkの 環境を開発/拡張し、1996年に標準ANSI-Smalltalkが策定され、現在に至っています。 参考文献:

ですが、 通常「Smalltalk」と言うときにはプログラミング言語の文法だけではなく、そ の開発環境や実行環境までをも含めることが多いでしょう。これは、C言語のよ うなプログラミング言語しか知らない方から見れば奇異に見えるかも知れませ ん。例えば、Visual C++等の開発環境はC(++)言語の一部ではありません。です が、Smalltalkの場合は、(基本的にインタプリタ式の言語であるという理由も ありますが)開発環境と言語が、それこそ不可分と言えるほどに深く結び付いて います。例えばC言語では、「ソースファイルにプログラムを書いて、それをコ ンパイラに渡す」というのが基本的なプログラミング手法であり、統合開発環 境は、言わばその糖衣に過ぎないと言えるでしょう。一方、Smalltalkはちょう ど反対で、統合開発環境によるプログラミングが通常のスタイルであって、ソー スファイル(通常は fileOut 形式と呼ばれる形式で書かれます) を実行するというスタイルが付加的なものなのです。 このような事情もあってか、Smalltalkの入門等では、統合開発環境や付属ライ ブラリの使いかたに重点が置かれている場合が多い印象があります。しかし、 Smalltalkは開発環境を抜きに、プログラミング言語単体として見ても素 晴しい言語であると、私は考えています。ですから、以下では開発環境について よりも、純粋にプログラミング言語としてのSmalltalkを紹介していきます。


Smalltalkってどんな言語?

プログラミング言語としてみた場合、Smalltalkはどんな特徴を持ったプログラ ミング言語なのでしょうか? 現在広く使われているオブジェクト指向言語といえ ば、C++や、それを起源に持つJava、C#などでしょうか。これらの文法や言語の 設計思想は、元をたどればAlgol(1958年にヨーロッパで作られた 手続き型言語)までたどり着くことが出来ます。(「Algol系の言 語」と呼ぶことにしましょう。もちろん更にたどるならばFortranに行き着きま す) 一方、SmalltalkはAlgol系言語の影響はあるものの、基本的には Lisp(1958年に作られた関数型言語)に近い言語であると 言えます。つまりは、広く使われている他のオブジェクト指向言語とは、全く別 系統と言えるでしょう。ですから、「Smalltalkの特徴」と言うと、「全てが特 徴」と言えなくもないのですが、以下ではSmalltalkが「純粋なオブジェクト指 向言語」であるということに着目して、Smalltalkの特徴の内のいくつかを紹介 します。 ちなみに、Ruby (外部リンク)のオブジェクト指向はSmalltalk起源です。また、Mac OS Xで使用さ れていることで有名なObjective-Cのオブジェクト指向もSmalltalk起源 です。 参考文献:

文法が単純明解

多くのプログラミング言語の文法は、それこそアドホックな機能の積み重ねのよ うなところがあります。関数を宣言するには○○と書く。クラスを宣言するには ××と書く。条件分岐は△△…といったように。しかも、それらが裏では同じ機 能を利用しており、その言語に精通してくれば統一的な理解が得られるといった ものではありません。これが、「アドホック」で意味したいところです。一方 Smalltalkは、いくつかの単純な文法規則の上に全てが構築されています。以下 で追々説明していきますが、メソッドの宣言も、クラスの宣言も、条件分岐も、 同じ機能の上に実現されているのです。これにより、Smalltalkは勉強しやすく、読み やすい言語となっています。

制御文がない

Smalltalkには制御文、すなわちC言語で言うところのif文やwhile文等がありません。 では、条件分岐やループはどのように実現するのでしょうか? まず、面白い例と して条件分岐から見ていきましょう。C言語風の

   1      if (x > 0) {
   2          printf("x は正");
   3      }

をSmalltalkで書くと、

   1      x > 0 ifTrue: [
   2          'x は正' print].

のようになります。式 x > 0 は真偽値 true もしくは false を返します。その 次の ifTrue: は、true または false のメソッドです。つまり、Smalltalkにお いてはif文もメソッドとして実装されているのです。それに続く [〜] はブロックと呼ばれ、処理をオブジェクト化したものだと考えれば良い でしょう。この処理を ifTrue: メソッドに引数として渡しているわけです。 Lispをご存じの方は lambda 関数だと思えば良いですし、Ruby な方は do〜end ブロックや {〜} ブロックが、ちょうど [〜] に対応していると考えて下さい。 (ブロックをプログラミングの中心に据えている辺りは、SmalltalkがLispから受 け継ぐ特徴の一つです) ループも、ブロックを引数にとるメソッドとして実装されています。例えば、

   1      while (x > 0) {
   2          何か処理;
   3      }

というループは、Smalltalkでは

   1      [x > 0] whileTrue: [
   2          何か処理].

と書かれます。x > 0 という判定も複数回実行されねばならないために、ブロッ クの中に入っていることに注意。しかし、この手のループは実際上はあまり使用 しません。頻繁に使うのはいわゆる「イテレーション」です。何か配列のような もの(配列でも良いですし、Rubyで言うところのハッシュや範囲オブジェクトでも構いません)の全て の要素を画面に表示する事を考えましょう。このような場合、Smalltalkでは do: というメソッドを使って、

   1      arr do: [:value |
   2          value print].

のように書きます。ここでは配列 arr の全ての要素を画面に表示しています。 このように、Smalltalkでは全ての制御構造はメソッドなのです。

クラス/メソッドの宣言もメソッドで

Smalltalkでは、クラスやメソッドの宣言ですら、そのためのメソッドを実行 (これは厳密な言い方ではありません。Smalltalkでは「メッセージを送 る」というべきでしょう。ですが、分かりやすさを重視し「メソッドの実行」と いう言い方を用います)することで行います。(具体的には、例えば派生 クラスを作りたいときは、基底クラス のクラスメソッドに「派生クラスを作るメソッド」が存在するので、それを実行 します)

メタモデル

Smalltalkは純粋なオブジェクト指向言語です。これは「全てがオブジェクト」 であることを意味しています。全てがオブジェクトだということは、つまり クラスもオブジェクトということです。同時に、全てのオブジェクトはなん らかのクラスに属していなければなりません。単純な三段論法により、クラス も「クラスのクラス」に属していなければならないことが分かります。この「ク ラスのクラス」をメタクラスと呼びます。もちろん、普通はメタクラス などの存在は表にはあらわれません。通常のプログラミング言語と同じようにし てSmalltalkを使うことが出来ます。しかし、背後で動いている、このような メタモデルをいじることで、Smalltalkの仕組み自体を(ある程度)変更でき るのです。Smalltalkはその言語仕様の多くの部分が標準ライブラリで提供され ているので、自分好みに言語自体をカスタマイズできる、とも言えるでしょう。


Smalltalkの処理系にはどんなのがあるの?

まず、Smalltalk処理系を提供しているベンダーへのリンク集として、Smalltalk Link Fountain(外部リンク)をどうぞ。大きいところではIBMもSmalltalk処理系「VisualAge Smalltalk」を販売しています。 無料で使用できる処理系としては、例えばCINCOM「CINCOM Smalltalk」の 製品評価/学習用バージョン「VisualWorks Non-Commercial」や、eXept Software「Smalltalk/X」、また最近広く使われているものに「Squeak」などがあります。 もちろんGNUプロジェクトも「GNU Smalltalk」を作っています。

wiredBeep/topics/Programming/Smalltalk/Whats (last edited 2008-01-26 11:32:01 by beeplex)