ビジュアルプログラミング言語ビスケット
ビスケットはとても変わったプログラミング言語ですよね。scratch とか他のほとんどのプログラミング言語は似ているのにビスケットだけ違います。それを少し解説したいと思います。

プログラミング言語

コンピュータはプログラムで動いています。コンピュータが直接動くことができるプログラムは機械語という言葉で0と1でできています。2つの数の四則演算や数の大小比較くらいの簡単な計算しかできません。たとえば(3+4)*5 という式は直接は計算できないけれど、足し算の命令と掛け算の命令に分けるとコンピュータの機械語で動かすことができる、といった感じです。

そこに「プログラムを作るプログラム」という素晴らしい考え方が発明されました。(3+4)*5 という式を人間が書くと、その計算をする機械語のプログラムを自動的に作り出してくれるのです。新しいプログラミング言語が発明されると、プログラミングが少しずつ簡単に人間にわかりやすい書き方ができるようになって行きます。

Scratchとの違い

Scratchや他のほとんどのプログラミング言語とビスケットでは何が違うでしょうか。それはプログラムに対する基本的な考え方です。最初は効率の良い機械語のプログラムをどうやって自動生成するかという点が重要でしたが、その自動生成の仕組みがそれほど賢くなかったので、人間がコンピュータの動きを予想し、いろいろとお膳立てしてやっと効率よく動くようなものでした。ところが自動生成が賢くなってくると、人間が下手にお膳立てすると逆に効率が悪くなってしまうようになってきました。

たとえば、1から10までの数の合計を求めたいとします。コンピュータの中に足し算をする装置が1つしかなければ、1に2を足して、その答えに3を足して、その答えに4を足して…というように順番に計算するしか方法はありません。これはとてもプログラミングの基本的な部分なのでScratchや他の大多数のツールはこういうプログラミングの方法を教えます。

ところが最近のコンピュータの中には同時にいくつもの足し算ができるものもあります。たとえば4つ同時に足し算ができるコンピュータだったら、1と2を足すのと、3と4を足すのと、5と6を足すのと、7と8を足すのが同時に計算できます、次に、1+2の答えと3+4の答えを足すのと、5+6の答えと7+8の答えを足すのと、9と10を足すのを同時に計算して、というように、同時に計算できる部分をどんどん詰めこむことができます。これは、実行するコンピュータが足し算装置をいくつ持っているかによって変わってきますが、この程度の計算の分解をコンピュータが自動的にするのは難しい問題ではありません。

ところが、コンピュータに指示されたプログラムが、1に2を足して、それに3を足して、という計算の手順が示されたものだと自動的に詰め込むのは逆に難しくなるのです。それよりもずばっと「1から10までの合計が欲しい」とだけ言ってくれた方が自動化は簡単なのです。

こうなると、プログラミングで重要なポイントが大きく変わってきます。今までは「コンピュータをどう動かすか」を考えるのがプログラミングだったのに、「コンピュータに何をさせるか」だけを考えて、どう動かすかはコンピュータに考えさせることでよくなります。

今はちょうど中間状態にあるのだと思います。コンピュータが完璧に動きを考えてくれるのであれば、人間は安心して「コンピュータに何をさせるか」だけを考えるのでよくなります。ところがその技術はまだまだで、人間が所々で「コンピュータをどう動かすか」の手助けをしないと安心して任せられないということなのでしょう。しかし、いずれこれは解決するのがわかっているので、そうなると今の時点で「コンピュータをどう動かすか」を指示する能力よりも「コンピュータに何をさせるか」を考える能力を鍛えた方が良いのではないでしょうか。その考えにたって作られたのがビスケットです。

メガネとは

メガネはビスケットが発明した形式ではありません。メガネは専門用語では「ルール(規則)」と呼ばれるものです。もう少し厳密に言うと「書き換えルール」です。書き換え対象というのがあって、それを何にするかでいろいろな書き換え型のプログラミング言語を作ることができます。

たとえば文字の並びに対して

 ab → ba
という書き換えルールがあると、
abcdaabc
というような文字の並びに対してabを探してはbaに置き換えるということを繰り返します。ここではabが2回現れているのでそれらを書き換えると
bacdabac
となります、ここにさらに1回abが現れるので、それも書き換えて
bacdbaac
になって、これで止まります。

こんな感じで、数式を書き換えたり、ビットマップを書き換えたり、アイコンの配置を書き換えたり、といった言語が1990年くらいに盛んに研究されていました。ビスケットは2003年の誕生ですからだいぶ後発の方です。

書き換え型のプログラミング言語はどの順序で書き換えをするかを指定しません。指定するのは書き換えて欲しいことだけです。どの順序で書き換えるかはコンピュータが勝手に考えます。

ビスケットの例でこれは数を小さい順に並べ替えるプログラムです。メガネは間違っている状態を正しい状態に直すという形で作ります。たとえば、2と1が並んでいた場合は2の方が大きいので順序を入れ替えて1と2に並べるということです。これを全ての数の組み合わせだけ作ります(ここには一部しか置いていません)。

そうすると、このようにバラバラに並んでいた数が自動的に小さい順に並び変わります。このプログラムはどの順番で数を並べ替えるかを指定していません、

プログラミングを勉強された方ならお分かりかと思いますが。ソートという数を並べ替える方法はいろいろと工夫されていて、とても巧妙なやりかたで高い効率で計算するアルゴリズムがいくつもあります。残念ながらビスケットのやり方はとても非効率で足元にも及びません。しかし人間がどう動くかを考えなくて良いので、プログラムはとても簡単になります。

ビスケットのこだわり

たとえば、絵を斜め上に動かすプログラムを考えてみます。コンピュータは斜め上という言葉はわからないので、コンピュータに分かるように言う必要があります。コンピュータが分かる言葉というのは数値ですから、斜め上を表す数値として「右に50、上に30の方向」というように言います。人間にとってはだいたい斜め上であればよい場合も結構あるのですが、コンピュータは厳密な数字しか受け付けません。

プログラミングを簡単にするために、たとえば、ある入門用のプログラミング言語では動く方向を4方向の矢印で表現するようになっています。たしかに厳密な数値で表現しなくて良い分簡単にはなっていますが、肝心のプログラムの表現力は下がってしまいます。

それに対して、ビスケットでは絵が動く方向を、元の絵と後の絵という2つの絵で表現しています。2つの絵の置き方のずれで方向を指定します。だいたい斜め上にずらしておけば、そこからコンピュータは厳密な数値を取り出して、そのずれと正確に一致した動き方をします。この方法の良さは、コンピュータが持っている表現力を一切失っていないということです。人間は大雑把に方向を指示します。しかしコンピュータはその指示された方向に正確にずっと動き続けます。これが大事なんですね。

絵を動かす方向をどうコンピュータに指示するかというところがビスケットは進化したわけです。

表現力を落とさない

ビスケットの設計でこだわっているのは、表現力を落とさないで単純化するという点です。表現力を落として良ければ単純化は簡単ですし、複雑なままで表現力を保つのも難しくはありません。両立させるから難しいのです。そこにとてもこだわっています。動きの方向をメガネで指定する方法はその一つです。

お絵かきの色の選び方にもこだわりがあります。多くの子供向けアプリは、子どもにたくさんの色を選ばせるのは負担だから色の数を減らして色を選びやすくした設計になっています。最初はとっつきやすいですが、同じ色しか出ないので、だんだん色に対して飽きてきて鈍感になってきます。それに対して、ビスケットではコンピュータが表現できる全ての色を対等に直感的に選択できるように設計しています。実際に幼稚園児に使ってもらっているのをみていると、誰も色を選ぶのに困っている様子はないですね。

プログラミングは新しい表現方法です。であるからこそ、表現力についてもっと考えてみてもよいのではないでしょうか。