ビスケットのあれこれ

ビジュアル言語ビスケット(Viscuit)に関するあれこれを書いてゆきます.

ビスケットでプログラミングのどんな概念が学べるのか

2016-05-08 10:14:53 | 1
Twitterで住井さんと山口さんがプログラミングの興味深い議論をしてまして.その議論をきちんと追えてはいないんですが,ビスケットについても語られていた部分があったので,ちょっと考えてみました.

もともとは,数学とプログラミングの違いからはじまり,プログラミングの本質はどこにあるのかから,逐次実行,分岐,反復は基本だよね,といった流れのようです.


<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


Scratchを始め,ほとんどのプログラミング言語には,明確に逐次実行,分岐,反復が言語の構成要素として現れています.これらを組み合わせることでプログラムを作りますから,当然これらの構成要素を強く意識します.ビスケットとはいろいろと違うのですが,一番大きな違いは「いまどの命令を実行しているのか」という概念がそれらの言語にはあるということです.この「どの命令を実行しているのか」はCPUのレベルではプログラムカウンタという言い方をしてます.命令がメモリーに順番に並んでいて,その順番通り実行すればよいので,基本的には数が1つずつ繰り上がることから,「カウンタ」という呼び名になっています.もっと上の言語になると命令の列をメモリーとして意識しないのでカウンタと呼ぶのは変ですが.なんというんでしょうね.明確な呼び名がすぐに思いつかないのは,その概念が(ブロックのような)プログラムの構成要素としては出てこないからでしょうか.そのプログラムカウンタのようなものが,現在実行しているブロックを指し示していて,指し示すブロックが変わってゆくことが逐次実行,分岐,反復を表現しているわけです.

それに対して,ビスケットにはどの命令を実行しているのかという概念がそもそも存在しません.存在していないので,逐次実行,分岐,反復といった概念も明確に理解することには繋がらないですし.ではどんなことを学んでいるのでしょうか?

ビスケットの教え方を順を追って見てみましょう.この過程で,子供達のコンピュータの理解はどのように変化しているのかを推測してみます.

1)メガネの左右に同じ絵を入れて,その絵を動かす.メガネの中の絵の動き方で方向と速度を調整できる.この時点では自分で絵を動かすツールという理解になるでしょう.同じ絵は同じ動きをする.メガネの中を変えると,同じ絵は一斉に動きを変えます.メガネが壊れると一斉に動きがとまります.瞬時に変化が全員に伝わるすごさと,一斉に壊れるというコンピュータの脆さも伝わります.ときどき,システムのデザインをやっている大人からは,ここまでの理解だけではメガネに丸が左右にあることは無駄で,方向と速度を示すだけの一つの丸でよいのではないかという質問をもらいます.

2)同じ絵を使ったメガネを二つ用意する.たとえば上に進むメガネと下に進むメガネ.これは新しいビスケットに追加された機能で,2つのメガネがランダムに選ばれて実行します.その結果その絵はゆらゆらと動くことになります.普通のプログラム言語ではランダムな実行というのはかなり上位な概念で作られますが,ビスケットではそれが組み込みの機能として入っています.このとき,子供達には,メガネは命令というよりは,その絵が持っている性質を表しているという印象に変わると思います.我々は「おばけは上に行ったり,下に行ったりする」という言い方をしています.命令ではなく,あるべき性質の一つを定義すると感じです.だいぶ宣言型言語らしくなってきました.

これでもメガネのまるは,まだ一つで十分ですね.

3)2つの絵で,パクパクするアニメーションを作る.このとき初めて,メガネの左側の意味がでてきます.メガネはある絵をある絵に変える(位置関係も含めて)という説明をします.いままではたまたまメガネの左右に同じ絵が入っていたから動いて見えているだけでした.絵を変えるということができるとわかると,たとえば絵を10個書いて,10個のメガネで順に変化させるといった実験もできるようになります.2コマから10コマに変わるという理解で,逐次実行が理解できたと思ってもよいかもしれません.途中で同じ絵から始まるメガネを複数つくると,「赤いボールは,青くなったり,黄色くなったりする」といったことにもなります.これは状態遷移図につながります.ある絵で動きが止まってしまうことがありますが,それはその絵から始まるメガネを作っていないからです.これで反復が明確に見えてきます.それから最初にある絵を置いたとしても,そのあとその絵が出てくることがないということがある場合は,その絵が右側(結果)にはいっているようなメガネを作っていないということです.これらを通じて,プログラムが止まらずに動き続けるにはどうしたらよいか,という重要な概念を学ぶことができると思います.

つぎにやっと条件が分岐が入ってきます.

4)メガネの左側に2つの絵をいれます.この絵とこの絵がぶつかったら,という言い方をします.いままでは絵の単独の性質を記述していましたが,二つの絵の衝突を導入することで,その絵の位置関係を使ってある条件を表すことができるわけです.一番単純なのは「尺取り虫がボールにぶつかったらボールをける」というメガネですね.絵の配置だけを変化させています.もう少し複雑になると,「健康な人と風邪をひいた人がぶつかったら,風邪がうつる」というメガネで,2つの絵がぶつかると,片方の絵の種類が変化する,ということが表現できます.これを動かすと絵の数が変化する様子が見れるので,一つの箱庭のシステムとしてものをみることができるようになります.ここから,指数関数的な広がりの理解などに繋げられます.

こうしてみると,ビスケットでは逐次実行,分岐,反復にだけ特化しているというよりは,もっといろいろなシステム全体の動きを総合的に理解して,その中の一つに,逐次実行,分岐,反復が現れている,と考えることができるように思います.実際にはその3つだけが自然界で重要であるとは思えないですよね.たまたま,コンピュータのハードウェアが採用していたというだけであって.

それよりも,ビスケットが重視しているのは,「一つの命令は小さい変化しか起こせない」ということです.逐次実行,分岐,反復も小さい変化を組み合わせて作られてますし,それ以外にも小さい変化で作れるものはたくさんあります.つまり,プログラミングのもっとも基本的な考えは「小さい変化を組み合わせて複雑なことを実現している」ということであって,そこから上位の概念を教えるのがよいだろうと思います.

最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
Unknown (通りすがり)
2016-05-13 06:54:07
「逐次実行、分岐、反復」「逐次実行、分岐、反復」って呪文のように唱えるのはどうなのかなあ。

大学でプログラムを書けない「先生」がよくそういう「C言語」の授業をしてるけど、僕は中1の頃からPerlが書けたけれども、「逐次実行、分岐、反復」なんて大学に入るまで聞いたことがなかったよ。

本当にプログラマーはそういう考え方をしてるんだろうか。

なんとなく「こういうことがしたいときはこういうパターン」みたいな、機械学習的なパターン認識のような気がするが。

もちろん、構造化定理、という数学的帰結は理解できるけれども、それを教えるのはプログラミング言語理論の授業であって、決してプログラミングの授業ではないような気がする。

そうそうそうそう。

el.jibun.atmarkit.co.jp/noriwo_t/2016/03/ai-802c.html
>実はプログラマーほどAIに奪われやすい立場は他にない

>1:(構造化)プログラミングは「順次処理」「分岐」「繰り返し」しかないので単純

残ったものは一体何なんでしょうね。

コメントを投稿