こんにちは。オブジェクト指向な開発担当、金内です。
名著「達人プログラマー」では年に1つは新しいプログラミング言語を覚えることが推奨されています。たしかに新しい言語に触れると、慣れ親しんだ言語で凝り固まったアタマによい刺激になります。
嬉しいことに、世の中には既に数えきれないほどのプログラミング言語があり、新しい言語もどんどんどんどん生まれているので、「もう学ぶべき言語がないっす」ということは起こりませんね。
みなさんは「次に学ぶ言語」としてどんな言語に興味を持っているでしょうか?
今回は「次に学ぶ言語」としてもぴったりな Smalltalk をご紹介します。Smalltalk は、数あるプログラミング言語の中でも純粋なオブジェクト指向プログラミング環境の手本として高く評価されていて、最近では iPhone / iPad アプリの開発に欠かせない Objective-C のルーツとしても脚光をあびています。どうですか? 興味がわいてきましたか?
Smalltalk の誕生は今から 30 年以上前の 1970 年代にさかのぼります。単なる言語というよりも、OS や IDE に相当する機能までを含んだ「環境」として開発されました。
何が素晴らしいかといえば、まさにいまそこにあるオブジェクトを触っている感覚を味わえる点です。オブジェクトを生成して、メッセージを送って、ちょっと期待と違う動作をしたら、その場でクラス定義を開いてメソッドを書き換えれば、さっきのオブジェクトの動作がもう変わっています。オブジェクトの存在を実感できる、ダイナミックな環境はとても魅力的です。
リファクタリングや TDD(テスト駆動開発)といったソフトウェア開発手法が Smalltalk の世界から生まれてきたのも、この動的で柔軟な環境と無縁ではないはずです。
Smalltalk は誕生以来たくさんの実装が生まれ、それぞれ活躍していますが、今回はオリジナル版直系の子孫であり、無償で利用できる Smalltalk 環境「Squeak(スクイーク)」を例にごくごく簡単に説明します。
以下、特に断らない限り Smalltalk と書いたら Squeak の Smalltalk とご理解ください(実装によって書き方などちょっとずつ違うので)。また、スクリーンショットは Squeak 4.2 を Mac OS X で実行したものを利用しています。
■ Squeak を起動してみる
Squeak は http://squeak.org からダウンロードできます。
インストールして起動すると、次のような画面になります。
おおー。これが、数十年の歴史を持つ純粋オブジェクト指向プログラミング環境の現在の顔です。ウィンドウやメニューなどがあっていかにも「環境」っぽい感じですね。
とりあえず、左上の「Project」から「New Project」->「New MorphicProject」としてプロジェクトを作ってみましょう。新しいまっさらな画面が開きます。これがたった今つくったプロジェクトです。ここで、クラスを定義したりオブジェクトを生成したりオブジェクトにメッセージを送ったり頭をかきむしったりしながらプログラミングを進めていくわけです。
■ すべてはオブジェクトとメッセージ
純粋オブジェクト指向プログラミング環境と言われる Smalltalk の大きな特徴は、すべてがオブジェクトとメッセージで表現されている点です。C++ や Java などのハイブリッド型言語では数値などがオブジェクトではないデータとして扱われますが、Smalltalk では数値も文字もブール値もすべてがオブジェクトです。
メッセージはメソッド呼び出しに相当します。オブジェクトにメッセージを送ると、対応するメソッドが動作します。
Smalltalk でオブジェクトにメッセージを送るには次のように書きます(”” の中身はコメント)。
myObj printString. "printString メッセージを送る" myObj printStringLimitedTo: 100. "引数 100でメッセージを送る"
この、オブジェクトとメッセージの間にある空白がいいですよね。グッときます。
■ 制御構造もオブジェクトとメッセージ
Smalltalk には、プログラミング言語では当たり前の繰り返しや条件分岐といった制御構造のための構文がありません。これらもオブジェクトとメッセージによって表現されます。
たとえば条件分岐(いわゆる if-then/if-then-else)はどのように表現されるか見てみましょう。
まず、条件式の結果は真偽値、つまりブール値になります。これが、Smalltalk ではれっきとした Boolean 型のオブジェクトなわけです。Boolean 型のオブジェクトには ifTrue: というメソッドがあり、この引数に実行ブロックを渡すと値が true の時だけブロックが実行されます。まさに if-then ですね。
"Boolean 型オブジェクト result で if-then を実現" result := (a > b). result ifTrue: [myObj doSomething]. "[] はブロック(クロージャ)"
if-then-else の場合は、同様に ifTrue:ifElse: というメソッドに真偽それぞれの場合のブロックを渡せば OK です。
■ Objective-C との類似点
iPhone / iPad / Mac 用のアプリ開発に欠かせない Objective-C は、C 言語をベースにオブジェクト指向拡張を取り入れていますが、その拡張部分には Smalltalk の大きな影響が見られます。
たとえば Objective-C を特徴づけるメッセージ式の書き方は次のようものです。
[array addObject:obj];
これは、上で紹介した Smalltalk のメッセージ送信を “[]” でくくったのと同じですね。Smalltalk の記述法を C 言語に取り入れるために、[] で囲むという手段をとったものと考えられます。[] は Smalltalk でブロックを表現しますが、それを捨てたのも設計当時としては妥当な判断でしょう。おかげで Objective-C でもオブジェクトとメッセージの間の空白を堪能できてしまうわけです。そう考えると、時にうっとうしい Objective-C の [] にも感謝できるというものです。
■ 開発ツールについてもちょっとだけ紹介
多くの Smalltalk 実装に組込まれている開発ツールのうち、主要なものを3つだけ紹介しておきます。これらは Tools メニューから起動できるので、とりあえず動かしていろいろ試してみてください。
System Browser
クラスブラウザです。カテゴリに分類されたクラスとそのメソッドをブラウズできます。さらに、クラスの作成・編集やメソッドの編集などもできます。 カラム表示のレイアウトは他の環境でもよく見かけますね。
Workspace
プログラムの断片を書いてすぐに実行したり、結果を表示させたりすることができる、いわばシェルです。 ここで Smalltalk のシステムと対話できます。クラス定義などもできるので、ここだけで作業が完了してしまうこともあります。
Transcript
プログラムの実行結果の表示など、コンソールのような役割をします。
■ Hello World!
お約束の Hello World を実行しているスクリーンショットを載せておきます。Smalltalk のコードは Workspace にあります。単なる文字列表示だけだと面白くないので、コレクション内から文字列を探して1つずつ Transcript に表示させてみました。
後ろにあるウィンドウがひっくり返っているのは目の錯覚ではありません。Squeak のウィンドウは、他の図形オブジェクトなどと同様に自由に回転できますし、回転したまま使えます(あまり便利ではないですけど)。
■ まとめ
iPhone / iPad をきっかけに Objective-C が盛り上がり、そのつながりで Smalltalk の名前を耳にした人も多いのではないでしょうか?せっかく興味を持っても、どうやったら始められるのかよくわからないままになってしまうともったいないので、本格的な Smalltalk を簡単に体験できる Squeak を駆け足でご紹介しました。
ふだんは Java / C++ / Objective-C など、手続き型 + オブジェクト指向のハイブリッドな言語を使いつつも、もっとオブジェクト指向についてよく理解したいと思っている方は、この夏休みに Smalltalk で「純粋な」オブジェクト指向を体験してみてください。
さらに調べたい方は Smalltalk や Squeak というキーワードで検索してみればさくさんの参考情報が見つかります。Squeak には Etoys という教育向けの簡易プログラミング環境もあるので、興味のある方はそちらも調べてみてください。