前回は、Scratchのオブジェクト指向プログラミング(OOP)について、アラン・ケイの定義や「おとうさんスイッチ」を用いて説明した。

 簡単に振り返ってみると、その本質は、オブジェクト(スプライト)へのメッセージ送信(メッセージング)だった。メッセージを受け取ったスプライトは、対応するスクリプトを実行する。そして、スプライトの例としてネコを用い、「i」のキーが押されると、「『い』が押された」というメッセージが放送(ブロードキャスト)され、それを受け取ったネコが一回転するスクリプトが実行された。

 このとき、ネコは1匹しかいなかったが、もしネコがたくさんいたらどうなるだろう。今回はこのような並行プログラミングについて考える。

ネコのクローン

図1●スタンプ、ハサミ、拡大縮小ボタン
図1●スタンプ、ハサミ、拡大縮小ボタン

 では、さっそくネコを増やしてみよう。スプライトは何個でも複製(クローン)を作ることができる。複製を作るには、ステージの上にあるスタンプボタンを使う(図1)。これをクリックすると、カーソルがスタンプの形に変わるので、ネコのスプライトの上で再度クリックする。すると、ネコのクローンがステージに現れる。このとき、見た目だけでなく、その操作(スクリプト)と属性(変数とその値)も一緒にコピーされている。ただし、名前は「スプライト1」から「スプライト2」に変わる。

 Scratchにはクラスがなく、新しいオブジェクト(インスタンス)はもとのオブジェクトを原型(プロトタイプ)としてクローニングで生成する。つまり、Scratchはインスタンスベース(プロトタイプベース)である。

 ここで、スプライト2のネコの色を変えてみよう。ステージの下のスプライト一覧から「スプライト2」をクリックして選択し、「見た目」カテゴリーにある「色の効果を(25)ずつ変える」をクリックすると、色相を変えるメッセージが送られて黄緑色になる。オリジナルのスプライト1は変化しない。このように属性値はスプライトごとに独立である。

並行処理とポリモーフィズム

 では、「i」のキーを押してみよう。2匹のネコが同時に1回転したはずだ。同じメッセージを受け取ったスクリプトは、何もしなくても並行に動作する。

 今度は、スプライト2のスクリプトを変えてみる。 [(10)度回す]の10を20に変更するとどうなるだろうか。「i」キーを押すとスプライト1は1回転、スプライト2は2回転する。

 このように、同じ「『い』が押された」というメッセージが送られても受け取るレシーバーによって振る舞いが違う。これが多態性(ポリモーフィズム)だ。

 ピタゴラスイッチのコーナー「おてつだいロボ」は、おとうさんスイッチの逆で、子供ではなくおかあさんがスイッチを押して、子供に「おもちゃを片付ける」などのメッセージを送る。このとき、子供は何人いてもよい。子供たちはそれぞれ自分なりの方法でおもちゃを片付ける。

 Scratchで並行プログラミングが可能なのは、技術的な理由ではなく、そちらの方が子供にとって、私たち大人にとっても、自然だからだ。ゲームやアニメのキャラクターも並行に動いている。逆に、一列に並んで順番に処理を進める方が特殊なのかもしれない。