何を繰り返すかが大事

プログラミングで重要な3つの仕組み「繰り返し」「条件分岐」「逐次実行」と言われていますが,これ言葉だけでなく結構深い話なので,順番に解説したいと思います.まずは「繰り返し」です.

まず,一般的なプログラミングにおける「繰り返し」は3つの構成要素に分解できます.「いつ繰り返しを始めるか」「何を繰り返すか」「いつ繰り返しを終えるか」です.「いつ始めるか」はそのブロックを実行したとき,「何を」はそのブロックの内側にある本体ですね.それに対して,「いつ終えるか」はいろんなバリエーションがあります.「繰り返す回数が決まっている」「ずっと繰り返す」「ある条件を調べて繰り返すかどうかを決める」です.条件を調べる場合もタイミングで変わります.「繰り返しの本体を実行する前に条件を調べる」「1回本体を実行した後で条件を調べる」「本体の実行の途中で条件を調べる」です.たかが繰り返しですがこれくらい細かく指定する方法にわかれています.その微妙な違いで,繰り返しの回数が1回多かったり少なかったりするわけで,何事も正確に動かなければいけないコンピュータにとっては1回の違いが致命的な場合もありますからね.

細かく指定するということは,間違えが入る可能性が増えるということでもあります.プログラミング言語の進化としては,どうやってプログラミングを間違えにくくするか,細かく指定しないですむ方法はないか,という方向を目指します.

たとえば,配列の一つ一つの要素について何かしたいときには,繰り返しの回数は配列の長さと同じです.なので,配列に対する繰り返しは回数を指定しなくてもよいという言語に進化します.

コンピュータもどんどん変わってきました.昔はコンピュータを動かすと言ったら,プログラムを実行して答えを出して実行が終わる,ということでしたが,今は,プログラムがずっと動いているのが普通になりました.ずっと動かしていて,やめたくなったら「X」ボタンを押して閉じればよいし,処理するデータがなくなったら次にデータが発生するまで待っていればいいのです.昔と違って,コンピュータを動かすことにお金はかからないので,電源が入っている以上,多少無駄な計算をやってもいいから,「動かす・止める」といった指示の手間を無くしてもいいよね,ということです.

プログラミング言語もそういうコンピュータの使われ方をなぞった,ずっと動き続けるのが前提のものが出てきます.ビスケットもその一つですね.

ビスケットにはscratchのように明確に繰り返しのブロックはありません.繰り返しは大事じゃないのかというとその逆で,繰り返しは大事すぎて言語の仕組みに組み込んでしまいました.プログラムを動かす,止めるという考えもありません.常に繰り返しています.

ビスケットはアプリを起動した瞬間からアプリを終了するまで,ずっと繰り返して動いています.「いつ始めるか」「いつ終わるか」は言語から消えて,「何を繰り返すか」ということだけにフォーカスできます.メガネを組み合わせてつくっているのが「何を繰り返すか」の部分ということです.

ビスケットにはもう一つ繰り返しを見えなくする仕組みが入っています.魚をステージに3匹おきました.その魚を動かすメガネをつくります.すると,3匹の魚が一斉に動き始めました.メガネを修正すると,3匹の魚の動きも一斉に変わります.

BASICなどの言語で絵を3つ同じように動かそうとすると,そこにも繰り返しをつかいます.繰り返しの本体にはN番目の絵を横に動かせという命令がかかれていて,それを3回繰り返すようにします.これで魚は1ステップ動くだけなので,これをずっと動かし続けるようにするにはさらに外側に繰り返す仕組みが必要です.たかが魚を3匹横に動かし続けるだけで,繰り返しが2重に必要なのです.

最初にBASICでプログラミングを学んだまま,その後にプログラミング言語がどのような方向を目指して進化してきたのか,ということを知らない人は「繰り返し」が見えていないと心配なのかもしれません.

ビスケットが繰り返しを隠したことで,どんな効果が出たのでしょうか.

これはビスケットで多角形を描かせるプログラムの例です.

一本の線があると,その線はそのままで新しく斜めに線を追加します.ビスケットではこれを無限に繰り返すので,斜めの線が次々と円を描くように追加され,最終的に多角形になります.多角形になるというのは実は2本の線がぴったりとある角度になったときだけであって,普通に線を2本並べると,

のように,線が交差しながら何周も回ります.ここから,角度をもっと広く・狭くして自分のつくってみたい多角形が作られるまで調整するのです.

ここで,試行錯誤が入っています.プログラミングにおける試行錯誤は人間とコンピュータが一体となった繰り返しです.「修正するー実行するー結果を見る」これを自分が欲しい形になるまで繰り返すのです.ビスケットが自動的に線を繰り返し斜めにして描いてくれているので,ビスケットを使う人は2本の線をどの角度にするか,という点だけに集中できます.

これがビスケットが目指していることであり,プログラミング言語が進化した結果でもあるのです.

追伸

ちょっと話が脱線しますが,このプログラムで角度を広くすると

このような形で止まってしまい,これ以上線が増えません.数えると11本しか無いようです.ビスケットは無限回繰り返すはずなのに,なぜか10回しか繰り返していません.これはなぜでしょうか?

実はビスケットは,誤操作でビスケットがフリーズしてしまうのを防ぐために,ステージ上に置ける絵の数を1000個と制限しています.それ以上になると絵が増えるメガネは,新たに絵を増やすことはせずに,絵が動くだけしかしません.ところがこのメガネは1本の線はまったく同じ位置に置かれて「線は動かない」となっているので,ここでピタッととまったように見えるのです.

では,たった10回繰り返しただけなのにもう1000個も絵があるのかというと,あるのです.これは「1本の線が2本になる」というメガネです.最初1本の線から始めますが,次に2本,4本,8本と2倍2倍に増えてゆきます.これを10回繰り返すと1024になるので,ここで止まって見えるのですね.ビスケットは正確に同じ位置に線を置くため,気がつきませんが,実は真ん中の線は1本にみえて250本も重なっているらしいです.

この動きはビスケットらしく無いので,この先この仕様をかえて,1本が2本になるときに,1000を超えた時どっちの線を選ぶかをランダムに決めるようにしようと思います(今は必ず動かない方が選ばれるのでつまらない).そうすると,10を超えてからは,線が増えるアニメーションは遅くなる(確率で曲がったり曲がらなかったりするから)と思いますが,100角形でもできるようになると思います.

もう一つの方法はここで紹介している方法のように線が2本が重なると消えるというメガネを追加して,線が増えないようにコントロールします.

シェアする

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

フォローする