altoの紹介(うわっ、1999年に書いた記事だ)の時に書いたが、Smalltalk というプログラム言語がある。
今では当たり前になった「オブジェクト指向プログラミング」の思想を実現した、最初の言語だ。
プログラムを簡単にする方法として、アラン・ケイは「オブジェクト指向」という基本的アイディアを示した。
Smalltalk は、これを「実験的に」実装したものだった。
実験してみたら、アイディアの不備もわかる。さらに良いアイディアも出る。
Smalltalk は、「言語」と言っても、OS に相当する部分を含む。
アプリケーションも全て Smalltalk で書かれている。
ライブラリ(オブジェクト)なども全て Smalltalk で書かれている。
インタプリタ言語なので、OS 部分のソースを読んで、自分で手を加えることも可能だ。
言語の仕組みそのものである「処理系」は Smalltalk では書かれていないものの、Smalltalk で書いたものを別のコンパイル言語に「コンバート」し、コンパイルすることで処理系を作ることが出来る。
つまるところ、Smalltalk を覚えた人間は、Smalltalk の全ての動作に手を加えることが出来る。
不備のあったアイディアや、後から出てきたアイディアは、どんどん Smalltalk に反映されていった。
Smalltalk は拡張を繰り返しながら充実し…現代的なオブジェクト指向言語に「必要な要件」は、大体このときに出揃っている、と考えても良い。
(後に C++ が導入したアイディアや、別の言語が導入したアイディアもあるが、それらは実のところ「些細な」問題だ)
Smalltalk は、実にすばらしいものだった。
…というか、アラン・ケイとその周辺が「すばらしい」と喧伝した。実際はどうだったか知らない。
だって、長い間非常に高価な商用システムしかなくて、一般人が触れる機会なんてなかったもの。
一般人は、Smalltalk のアイディアを C 言語に持ち込んだ「C++」でオブジェクト指向を勉強するくらいしかなかったけど、これは余りすばらしいとは思わなかったな。当時は。
もちろんオブジェクトが作れることは便利なのだけど、Smalltalk のようなエレガントさ…誰にでも使える単純明快さは、C++ にはなかった。
アラン・ケイと仲間たちは、Apple が販売していた商用の Smalltalk-80 をベースにして、新しい「フリーの」Smalltalk を作り上げた。
これが、Squeak 。
無料で配られているけど、Squeak というのは「商品名」だ。言語としては、Smalltalk になる。
(アラン・ケイが作った Squeak と言う言語、という書かれ方を散見するが、微妙に間違っている)
Squeak が作られた目的は、子供向けにプログラミングの教育を行うためだ。
ここはちょっと説明が必要。
そもそも、Smalltalk のアイディアの一部は、Logo から来ている。そして、Logo は「実用にする」言語ではなく、子供の教育のための言語だった。
だから、アラン・ケイも Smalltalk を子供たちに使わせた。
そして、子供にとってわかりにくい部分などを「言語の欠点」として修正した。
この過程で、Smalltalk は「使いやすさ」を獲得していった。
Squeak は、これを再びやるための環境だった。
…先に挙げた alto の記事では、最後に Squeak を紹介して終わっている。
しかし、アラン・ケイたちは、すぐに Squeak では十分でない事を知る。
コンピューター自体が珍しく、触っているだけで子供たちが熱中した時代なら Smalltalk があれば十分だったかもしれない。
でも、今の時代はコンピューターゲームなんて当たり前だし、複雑なプログラムを楽しもう、なんてことは難しいのだ。
そこで、EToys が作られた。
(商標の問題で、Squeak EToys と呼ばれることもある。表記も eToys だったり etoys だったり、かなりいい加減。)
実のところ、EToys は Smalltalk 上で動作するアプリケーションだ。
現状では、Smalltalk のフルセットに EToys がインストールされた形で配布されている。
EToys では、環境を起動するといきなり自動車の絵が動いている。
そして、それを動かすプログラムも表示されている。
プログラムの数値部分を適当にいじると、車の動きも変わる。
とりあえず「テレビゲームにしか興味がない」ような子供でも、引き込むための「掴み」の部分を持っているわけだ。
EToys はよくできていて、あらかじめ命令が書かれた「タイル」を並べるだけでプログラムを組むことが出来る。
タイルは人間にわかりやすいように書かれていて、多言語化もされている。
つまり、英語環境で組まれたタイルでも、日本語に変換して表示できる。
EToys は、「タイルで作られたプログラムを実行するアプリケーション」ではない。
タイルで作られたアプリケーションを Smalltalk に翻訳し、出来上がった Smalltalk プログラムを実行するアプリケーションなのだ。
だから、タイルで組んだものを Smalltalk のプログラムとして表示することも出来る。
アラン・ケイたちは、どうも Smalltalk の入門用として EToys を作ったようだ。
先に書いたように、Smalltalk は OS 部分を含む。
そして、Smalltalk は、世界で最初の GUI OS と言っても良い。
…つまり、操作方法が非常に古臭い。
EToys も、独自の古臭い GUI 作法で動いている。
Windows の操作に慣れている人でも、最初は戸惑って何も操作できないだろう。
Scratch は、アラン・ケイとは別のグループ(MIT)が、EToys と似たようなものを作ろうとして、Squeak をベースとして作り上げた環境。
別々に活動しているが、お互いに良い影響を与え合っているようだ。
EToys は、タイルでプログラムを組む、というわかりやすい方法を導入してはいるが、これは「キーボード入力の手間を省いた」程度の話で、実のところそれほどわかりやすくはなっていない。
Scratch では、タイルの形を工夫している。
プログラムの主要な流れである「連接」は、ジグソーパズルのような凹凸があるタイルで表されている。
また「繰り返し」や「条件分岐」は、 匚 のような形のタイルの中に、他のタイルをはめ込む形で表現される。(中にタイルを入れると、左の縦棒部分はどんどん延びる)
秀逸なのは、「永久ループ」の下には「連接」のための凹凸がないこと。
これによって、永久ループの下に命令を組むことは出来ないことが、視覚的に表現されている。
(詳しくは、この日記に付けられた画像を見てください)
他にも、条件式を入れる部分は六角形になっていて、条件式のブロックは六角形で表現されるとか、数値部分は長丸になっているとか、「そこにしか入らない」ことが視覚的にわかりやすい。
そして、形だけでなく色でも表現されているので、たくさんのブロックをつなげても構造がわかりやすい。
また、Scratch は、「現代的な」GUI 作法に従っている。
初めて遊ぶ子供でも、普通の GUI に慣れてさえいれば、それほど戸惑わない。
最も特徴的なのは、Scratch で作ったプログラムの発表の場を設けていること。
作ったプログラムは、すぐに WEB にアップロードでき、WEB 上の Java で動作する「Scratch インタプリタ」によって、誰でも見ることが出来る。
(習作で作ったゲームを発表してみた。…Java で動くと遅くてつまらないな…)
それどころか、ソースをダウンロードして「リミックス」を発表することもできる。
面白いプログラムは、複数の作者の手によって、どんどんバージョンアップされる。
これは、子供にとっても刺激的なことだろう。
もちろん、Scratch はいいことずくめではない。
タイルによるプログラムは、EToys よりも「簡略化」されている。
これは、わかり易さを目指してのことだろうが、表現力を削いでいる結果にもなる。
特に、初心者にはわかりにくい「オブジェクト指向らしさ」をなくしてしまっているのが難しいところ。
ハードルが下る一方で、ゲームなどを作り始めるとすぐに足枷になる。
インスタンスの生成も、メソッドも、パブリックなプロパティもないのだ。
大域変数はあるし、全てのオブジェクトに対する「メッセージ送信」と、「メッセージ起動されるプログラム」は作れるので、メソッドとプロパティの代用は出来る。
でも、インスタンス生成がないのは辛い。
Scratch では、画面に対する「描画」は、基本的にオブジェクトを定義することで行う。
つまり、インスタンスが生成できない、というのは、キャラクターが自由に表示できないことと同義なのだ。
これはゲーム作成の上では、かなりの足枷だ。
じゃぁ、足枷を感じたら別の言語に乗り換えられるか、というと、これも難しい。
EToys なら、Squeak に乗り換えやすいのだが、Scratch は「完全に閉じている」ために乗り換えられないのだ。
Scratch はプログラムの入門用言語としてよくできているが、将来を保証することは何も考えられていない。
と、急にこんな比較を始めたのは、子供に何かやらせてみたいと思ったから。
長男が小学校から帰った後、少しつまらなそうなので。
いろいろ検討して、Scratch を遊ばせて見た。
最初に用意されているサンプルキャラクター(スプライトオブジェクト)である「猫」に命令を出してみる。
最初はマウスカーソルを追いかけるプログラムを作って遊ぶ。
なんとなく理解したようで、いろんな部分の数値を書き換えて遊んでいる。
一気に 100000000 ドットとか動かして、画面の端にぶつかって震えるのを見て笑ったりしている。
でも、大人には無意味に思える事を試して笑うことが大切。
そうやって意味を覚えていくんだ。
自分で背景やキャラクターを描ける事を教えたら、背景をぐちゃぐちゃ描き始める。
最初は無意味だったが、やがて迷路のようになり、その中の一箇所に「花」を描いた。
僕がこれを受けて、迷路の壁は越えられないが、矢印キーで自由にキャラクターが動かせるプログラムを作る。
Scratch では「キーが押された」時に起動するプログラムを指定できるので、非常に簡単。
「常に」動いているプログラムに、「壁がなければ進む」ことだけ指定しておいて、矢印キーの各キーに、それぞれの方向を向かせる、たった1タイルのプログラムを割り振るだけ。
(日記に付けられた画像はこのプログラム)
最後に、「花」を切り出して新たなスプライトを作り、キャラクターが衝突したら音を出すプログラムを仕込む。(スプライトの衝突は、1タイルで簡単に検出できる)
なんとなく、花まで行くとゴールしたような感じになった。
花の上を歩くと、音が激しく鳴り続けるのを聞いて、長男はゲラゲラ笑っていた。
プログラムが楽しい、と思えればそれでいい。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |