コンピュータを知的にするのが条件分岐

ファンタジアというディズニーのアニメで「魔法使いの弟子」の弟子役でミッキーが登場します.ミッキーは水を汲む仕事を魔法使いに言い渡されて,仕事をサボるために,ほうきに水を汲むという魔法をかけて,ほうきに仕事をさせました.ところが,魔法の修行中のミッキーは魔法をかけることはできても,魔法を解くことはできません.ほうきは水をどんどん汲んで,大洪水になってしまいます.....画像

コンピュータの条件分岐の話がでるたびに,僕はいつもこの映画のシーンが思い浮かびます.水が溢れてとんでも無いことになっているのに,ほうきは延々と水を汲み続ける.コンピュータはやれと言われたことはやりますが,常識もなにもないので,常識的に変なことがあってもやれと言われた以上やり続けるのです.「バカ」と言っていいかもしれません.

条件分岐というのは,無我夢中で動いているコンピュータに対して,ちょっと休んで周りを見て知的にうごけよ,ということです.ミッキーがほうきに魔法をかけるときに,「もし水がいっぱいになったら止める」という条件分岐の命令も一緒にかけていたら,大洪水にはならなかったのですからね.ちょっと知的に動くためのワンポイントみたいなものです.

条件分岐の命令がくると,まずはその条件が成立するかどうかを調べます.「水がいっぱいになった」「気温が28度より上」「部屋が暗くなった」といったことです.で,コンピュータはその条件が成立する場合の仕事と,成立しない場合の仕事のどちらかを選びます.その中の一つに繰り返しを止める,というのがあると,平和に洪水にならないで済むわけです.

プログラミングでの条件分岐も「いつ条件を調べるか」「調べる条件は何か」「成立したら何をするか」「成立しなかったら何をするか」が必要になります.

で,ビスケットでは条件分岐はどう扱われているかというと,これも繰り返しと同様に言語のなかに組み込んでしまいました.つまり,「いつ条件を調べるか」に関して「いつも調べる」ということにしてしまいました.

「いつも調べる」というのは結構無駄なのです.ほうきが水を汲んで,おけにいれるまでにはいろんなステップがあります.「バケツに水を入れる」「バケツを運ぶ」「階段があったらのぼる」「おけにバケツの水を入れる」.このとき,ほうきが水を汲むのをやめて欲しいのは,おけに水がいっぱいになった時だけですから,「おけにバケツの水を入れる」ことの後に「おけが水で一杯になったか調べる」という命令をいれればよいことになります.他の仕事「バケツを運ぶ」「階段があったらのぼる」の後では桶の水の量は変わらないので,そのときに調べる必要はありません.

調べるタイミングはとても重要で,「おけにバケツの水をいれる」前に調べても良いのですが,せっかくバケツに水を汲んでここまで運んできたのに,入れる直前に「もういっぱいだからいいよ」って言われた時の無駄を考えると....

ところが,コンピュータは高速でいくら無駄な仕事をやらせてもお金はかからないのですから,安全側に倒してもいいわけです.ということは,おけの水の量が変化しない仕事であることがわかっていても,すべてのタイミングで「おけの水がいっぱいかどうか」を調べたって,はたから見るとバカみたいですが,どうせ有り余っているコンピュータの処理なんだからいいんですよ.それよりも,調べるタイミングが遅れてしまって,溢れさせることがあると大変ですからね.

ビスケットでは,どんなに調べることが無駄だとわかっていても,毎回,条件が成立するかを調べます.のこりの3つの要素「調べる条件は何か」「成立したら何をするか」「成立しなかったら何をするか」ですが,最後の「成立しなかったら何をするか」は何もしない,と決めました.つまり,「どんな条件が」成立した時「何をするか」の2つだけにしました.これがメガネの左側と右側になります.

ロボットの制御では,モーターを回しながらセンサーで壁にぶつかるかどうかを調べます.センサーで壁との距離を調べるのはとても緊張しますね.ついうっかり調べないでモーターを回してしまったら壁にぶつかってしまいますからね.

今のバージョンのビスケットにセンサーやモーターを制御する機能は入っていませんが,もし入るのだとすると,メガネの左側にセンサーが,右側にモーターが入ります.「壁との距離が10cmより大きければ」といったセンサーで計測した後の条件がメガネの左にはいって,メガネの右側に「モーターで進む」ということです.これで,壁にぶつからないように進むことができます.このとき,ビスケットの内部では大変なことをやっています.すべてのステップのタイミングで「壁との距離が10cmより小さい」かどうかを調べます.壁との距離が変化するのは,モーターを回したときだけで,「LEDをつけたり」「こんにちはと話し」たりという仕事の後であっても,まったくの無駄なんですが,距離が10cmより小さいかどうかを調べます.

そういう無駄に調べることと比較して,調べ忘れて壁に激突することは絶対に避けたいですし,ちゃんともれなく調べているかどうかを考えるのはとても緊張します.コンピュータはいくら動いてもお金がかからないのですから,無駄に調べさせてもいいのです.もう,プログラミングで「いつ調べるか」を気にするのはやめましょう.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする