ビスケットのあれこれ

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

小学校の義務教育にプログラミングを入れる作戦

2015-05-27 22:46:13 | 1
賛否両論ありますが,僕は教えるべきという立場です.反対意見の人って,たとえばプログラミングを狭く考えているとか,ビスケットのことを知らないとか,そういうことなのであまり気にしていません.

プログラミングを学校に入れるよくある作戦として,Scratchのわくプロ本の作戦があります.コンピュータはいろんな教科の学習に使えるのだから,最初に使い方を覚えて,その後は各教科の中の時間でやればいいんじゃないか.というものです.そんなに難しくないから,やりかたを覚えた担任の先生がその先はやっていきます.学習指導要領の隙間をつく作戦でもありますね.僕も昔はその作戦を考えていたのですが,これですと,現状の学校の状況とその理想的な状態との間にギャップがありすぎて,たぶん無理です.やれても,ものすごいお金と労力をかけてやっと実現出来るって感じ.全国の小学生は700万人いるわけですが,担任の先生は大雑把に20万人はいるわけですよ.20万人もそんなことができるようになるとは思えない.

まずやるからには,国民的なコンセンサスが必須です.「ああ,こういうことならやってもいいんじゃない」とみんなが思うようなものでなければだめです.で,ポイントは二つ,内容と時間です.どんなに内容がよくても10時間もかかるのだったら,それなりに慎重になりますよね.逆に年間で2時間くらいでよければ,「ああそれなら...」になりそうですよね.総合の時間をやりくりすればどこだってできる.学習指導要領がどーたらとか考えなくてもいいです.

時間数を増やすのは,本当に国民的なコンセンサスが得られてからです.

なので,まずは最小時間で考えます.ざっくりと,小1小2は年間1時間くらい.小3~小6は年間2時間.小学校6年間で合計10時間です.これでどんなことを教えられるでしょうか.

実はビスケットは,本当に覚えることが少ないので,2時間(実質90分)もあると,本当にいろんなことができます.僕らが毎年夏にお手伝いしているNTTのドリームキッズでは,たった25分で「プログラミングというのは単純な命令を組み合わせるから複雑なことができるんだよ」ということまで教えてますからね.

まず,ビスケットを教える専門家を養成します.この人たちは,10時間の授業ができればよいだけです.同じ授業を何十回もいろんな子供達を相手にやるので,教え方はどんどん上手になって行きます.一人の人は1日3クラス,200日で600クラスの授業ができます.全国に20万くらいクラスがあるとすると400人くらいの先生で,全児童に毎年2時間ずつ授業ができるわけです.先生を一人500万円くらいで雇うとすれば20億円くらいです.各自治体にICT支援員とかいますから,その人たちが研修を受けて授業ができるようになってもいいですね.そしたらすでに払っている予算の範囲内です.

で,何を教えるかというと,コンピュータサイエンスです.コンピュータはエンジニアリングの視点で捉えられることがすごく多いですが,そっちではありません.エンジニアリングは他の教科,たとえば図工とか音楽とか理科とか,すでに実施している教科と重なることがすごく多いんですね.エンジニアリングは普通の先生がすでに教えていることでもあるということです.

別の言い方をすると,他の教科では絶対に教わらないことで,普通の担任の先生も知らないこと,です.まったく重ならない内容を専門家が10時間教える.これだったらありじゃないですか?

具体的にはこんな内容です.

コンピュータが得意なことと人間が得意なこと.

情報の基本的な性質.複製で劣化しない.指数関数.

シミュレーション

0と1で計算すること.十進法で計算すること.

アルゴリズムというのは,いったいなんなのか.

プログラミング言語の面白さと奥深さ.

一切ほかの教科とはかぶりませんね.コンピュータそのものをどう教えるかということだけです.
これらを2時間の枠のなかに,埋め込むのは,基本的にはビスケットの体験をやらせてから,その体験に関係する講義を5分くらいやる,という流れです.



こういうことを3年くらいやります.そのうち自分でも教えらえる担任の先生が現れてくると思います.それから,ここからが本当の応用なんですが,タブレットも一人1台持っていることだし,図工の時間を少し使って,もっとクリエイティブなプログラミングをやってみようという先生が現れてくると思います.そうなると,いろんな教科で使えるようになって行きます.そこが「プログラミングで学ぶ」です.さらに10年くらいたてば,完全に学校のなかだけで教えられるようになって,専門家の集団を派遣するということもやらなくてよくなります.

ビスケットのポインタについて

2015-05-21 09:06:47 | 1
ビスケットでソートとかカウンターとか基本的な仕組みが作れることはわかったのですが,それらを組み合わせて大きなシステムが作れるのかというと,どうもそんな気がしませんね.何かが決定的に足りないのです.その1つがポインタです.今のビスケットにはポインタはありません.将来,導入が予定されています.

ポインタというのは何かというと,コンピュータの原始的な段階で,単なる自動的に計算する機械から,1つ上のレベルで考えることが出来るようになったという極めて画期的な発明です.まずはその解説から.

40名のクラスがあって,その中のある二人を選んだら,その二人から別なもう一人を決める方法を考えます.同じ二人のペアでは毎回同じ人が決められます.変な問題ですみません.生徒には出生番号というのがあって,1番から40番まで決められています.二人の出席番号をX番とY番,そこから決められる人はZ番だとすると.
Z = f(X, Y)
というXとYで何か計算をしてZが決まる関数fを作ればよい,ということになります.fはいろんな形があると思いますが,これは数学のブログではないのでこれ以上は触れません.

さて,1から40までの数の計算をすることですが,元々は人間の話でした.田中さんと吉田君が選ばれたら,そこから決められる人は佐藤さん,という話でした.元々は人間の話だったのに,出席番号というのを使ったおかげで,数の計算にすることができた.ここが画期的なんです.

コンピュータにはメモリーというのがあって,その中に数字がずらっと入っているわけですが,メモリーの1つ1つにも番地という出席番号のようなものが付けられています.コンピュータは数字の計算ができますけれど,その計算結果をメモリーの番地とみなして,その番地に入っている別の数字を取り出して,次の計算に使います.別のたとえで言うと,脳外科のお医者さんが自分の脳の手術をやっている感じです.数字が名前になるというのがそういうことなんですね.これでOSが作れるようになったし,新しいプログラミング言語も作れるようになった.極めて重要な仕掛けです.

ビスケットの場合メモリーというのは画面そのもので,番地は画面の位置になります.なのでポインタに相当する機能は画面上の離れた場所を指し示す方法ということになります.

たとえば,トラックの荷台に箱を積んで走る.というプログラムを考えます.トラックの絵と,箱の絵があります.このとき,箱の中に何が入っているか.いろんなものを入れたいですが,それらの中身をトラックと一緒に絵の動きで動かすのは大変ですね.すべてのパターンを作るわけにも行かないし,他のトラックとぶつかって,荷物を落としてしまったりしそうです.箱の中はトラックの動きとは別の場所に置いておきたいです.

ビスケットに導入される予定のポインタは2つの絵が組になってます.始点と終点の絵です.始点は箱の形をしていて,終点は箱の中身を示す形をしています.終点の絵の上に箱に入れたい荷物を重ねて置きます.トラックには始点の絵を積んで走ってもらいます.それで,たとえばどこかのステーションに付いたら,トラックに積まれている荷物を降ろして,ステーションでカウントするとか.箱を4つ作って,この箱には何をいれて,こっちの箱には何をいれて.それでそれぞれの箱を4台のトラックに積んで,この荷物をいれた箱は上に向かって走る.こっちの箱は斜め右上に向かって走る.そんな風にも使えます.

メモリー(画面)が一枚の平坦なものだったのが,トラックが走る世界と,箱の中の世界の2つに分かれたということもお気づきでしょうか.トラックが走っているうちに,別のトラックの荷物の中に入ってしまうこともあるかもしれません.落語の頭山の世界です.そういうレイヤーの違う世界が混ざってしまうのを面白がるのもありますけれど,一方で画面を複数枚用意して,それぞれの動きは混ざらないようにして,ポインタは別の画面間に置くという方法もあると思います.これでかなり複雑なプログラムを作って行けますね.1枚の画面の方は昔のCPUの直接触っていたのと同じ,複数の画面でやる方は高級言語で作っているという違いもわかると思います.

ポインタがあると,スタックが作れるので,再帰的な動きをさせることもできるようになると思います.いろいろなアルゴリズムのアニメーションも作れるようになります.


柔らかい書き換え(Fuzzy Rewriting)について

2015-05-20 08:42:44 | 1
知恵袋で柔らかい書き換え(Fuzzy Rewriting)について質問を受けました.ちょっと嬉しいので,ここに回答を書いておきます.

どんな発明もそうですが,ビスケットにもそれが発明される以前のものがあって,その欠点を補うということで作られてます.

Stagecastというもので,これは元々はアップルリサーチで作られた KidSim の商品版です.KidSimは古いマックの上で動いてまして,僕も学生の頃に触って感動しましたけれど.まさか自分が子供向けの言語を作るなんて思っていなかった時代です.

KidSimの論文はこれですが,英語を読まないでもここで使われている絵を見ればビスケットに似ていることがわかります.94年ですから20年以上前ですね.

たとえば,

です.ゴリラが岩の前にいたら岩を飛び越えて反対側に行く,という命令ですね.

KidSimは当時のコンピュータの限界もあったと思いますが,格子状に配置されたアイコンの位置関係を規則に従って書き換えて行く,という言語です.ビスケットと違ってアイコンには内部状態をもたせることができて,例えば自動車だったら燃料という状態があって,1つ前に進むごとに燃料を1つずつ減らして行くとか,燃料が空になったら止まるとか,そういったプログラムが書けるようになってます.Simというのはシミュレーションのことですが,値を使ったシミュレーションがちゃんと作れるようになっています.

ビスケットはそういった内部状態の部分は全部切り捨ててますね.機能を削るのは研究としては主張しにくいですが,言語の方向性を明確にするという意味では尖らせてます.

ビスケットが新たに導入したのは,アイコンは格子状ではなく自由な位置に置けて,しかも回転させることができる,ということです.それだけが違いです.だからビスケットで回転させないタイプの例題(たとえば二進法のプログラムとか前回のソートのプログラムとか)はそのままKidSim (Stagecast)で走らせることができると思います.感染が広がるやつもできると思う(内部状態はあまり入れたくなかったですが,いま考えると感染の強さとか治りかけとか,そういう表現のためには入れてみてもいいかもしれませんね).

で,そうやって書き換え対象と規則(めがね)を柔軟にしたときに,課題なのはどうやって動かすのかです.格子状のアイコンの場合はアイコンの配置がピッタリ決まっているので,それと同じ配置を探すというのは全然難しくありません.それに対してビスケットでは厳密に同じ配置で探すのではなくて,似ている配置であればOKにしようという方針にしました.つまり書き換え規則を曖昧に柔軟に解釈しようということですね.

めがねの中に部品がそれぞれ1つだけのときは曖昧性はないのですが,部品が2つずつ入ったとき.たとえば感染が広がる例の「ぶつかったら」の部分です.正確にこの配置でぶつかるのだけでなく,大体こんな感じでぶつかったら,という解釈をしよう,ということです.そのときめがねに入っている配置に対して,どれくらずれているかという計算をします.ピッタリ同じ場合もあるし,少しだけズレた場合もあるし,ギリギリぶつかった場合もあるし.そのズレは,書き換えの結果,つまり「風邪がうつる」の部分に反映されます.風邪がうつるの場合も正確にこの配置で風邪の人が出現するのではなくて,ピッタリ同じの場合は同じ配置になるけれど,ズレていたらそのズレに応じて出現する位置も変わる,という計算をしています.こういう部分が,ビスケットを動かしていて飽きないアニメーションになっている理由だと思います.曖昧なマッチングをしても生成が厳密のままだったら生成されるアニメーションはどんどん単調になっていくはずです.

でこの方法をFuzzy Rewriting(柔らかい書き換え)と名付けました.

実はこの柔らかい書き換えは,アイコンの配置の書き換えにしか使えないわけではありません.一般化することができます.何かの対象をベクトルで表現して,それの時系列変化を発生させる.書き換え規則は,変数を使って定義する代わりに,書き換えの代表的な例を示して定義する,という解釈になります.説明がどんどん難しくなりますが,もっと広い応用があるんですよってことですね.

例えばピアノにしてみると
「ドレミ」→「ミレド」
ドレミと弾いたら,ミレドというのが返ってくるという鍵盤のメガネを作りました.それに対して
「ドレファ」
と弾いたら,何が返ってくるのかということです.で柔らかい書き換えで動くピアノの場合は
「ファレド」
というのが返ってきます.メガネを沢山いれてあげて,勝手に演奏するシステムができて行きますね.

具体的な計算方法ですが,バージョンが変わってまして,初期の計算は論文にもなっているのですが,最新のはコードだけです.初期の計算方法に関しては

https://github.com/viscuit/viscuit6

で密かに公開していたりします.これだけではビスケットは動きません.

未来のプログラミング言語(ビスケットによるソート)

2015-05-16 14:42:09 | 1
ビスケットは変わっているプログラミング言語ですから,ビスケットでどういうプログラムが作れるのかというのはまだ完全にはわかっていません.発明されてから12年で,中身も全然進化していないのに,最近になっても,これまで思いつかなかったプログラムが見つかったりします.

これはビスケットによるソートのプログラムです.

ソートというのは,数の小さい順に並べ替えるというもので,例えばWebの画面で表が出てきたとき,項目の横に三角が表示されていてそれを押すと,金額の安い順とか,駅に近い順に表を並べ替えてくれる,その中で動いている仕掛けです.

ここでは,1から4までの数字を小さい順に並べ替えています.右の方が数が大きくなります.ビスケットは数を知りませんからまずは1から4までの絵を書きます.数字じゃなくてもよくて,何か順番がついているものならどんな絵でも構いません.たとえば,ネズミ,ネコ,ライオン,ゾウという強いもの順(大きいもの順)というのでもよいです.ただしジャンケンのように強さが1周してしまうものはダメです.なので,ゾウはネズミに弱いという童話的なルールは無しです.

ここでのメガネは非常に面白いのですが,「間違っている場合を直す」という方針で作られています.一番上のメガネは,2の右に1があれば,1と2を入れ替える.となっています.残りもメガネも全て,間違った置き方をしていたら,絵を入れ替えてます.

たったこれだけですが,動きはこのようになります.

動画

説明らしい説明もないのですが,ビスケットは絵の並びの中から,間違った並びを見つけては,その順序を入れ替える,ということをひたすら続けてます.どこから入れ替わるかはビスケットがどのように動いているかで決まるのでわかりません.

さて,これはプログラムと呼んでよいのでしょうか.何か普通のプログラムと違いますよね.ソートというといろんなアルゴリズムがあって,そのアルゴリズムを表現したのがプログラムで,というのが普通に習うのかもしれませんが,アルゴリズムっぽいものはまったくありません.でも,ビスケットはちゃんと数を並べ替えてくれてます.

これって,プログラムの仕様を書いてあるだけですよね.数の大小の定義と言ってもいいです.仕様を書いたらそのまま動いてしまったということです.

実はここに,プログラミング言語の未来というか,僕がプログラミング言語の研究を始めた20数年前に見ていた研究者の夢「未来のプログラミング言語」がチラッと見えています.

当時の夢というのは,こういうものです.

もう,アルゴリズムのようなプログラムを人間が記述するのは止めよう.人間は,コンピュータにどう動いて欲しいかを考えるのではなくて,コンピュータに何をやって欲しいかだけを考えよう.動き方はコンピュータが勝手に考えてくれる.未来のプログラミング言語は,何をやって欲しいかを伝えれば動いてくれるようなものになるだろう.

そういう未来のプログラミング言語を作るのが僕らの夢だったわけですが,世の中のプログラミング言語の進化というのは,あまりそっちの方には進まなくて,人間が巨大なプログラムをエラーが少なく書きやすくなる,という方向になってしまいましたね.それでも,少しずつですが進化してきていると思いますよ.たとえば,江木君の Egison がとても嬉しい発明です.

ちなみに,専門的な話をすると,ビスケットの動作は,配列の隣り合った数を比較して入れ替える,というのをランダムに全部の要素で実行しているだけですから,見方によってはとても仕様を書いて実行しているとは言えません.これらのメガネから自動的にクイックソートを誕生させれば嬉しいですが,そこまですごい話ではないです.つまり,仕様を記述してバカな効率でよければ動かすのはなんとかなる.すごい効率にはならない.そんなレベルです.

進化は遅いとは言え,さすがに今の子供達が大人になる頃には,この夢は叶っているんじゃないのかとは思うのです.

今のプログラミング教育のブームとか,中学の技術でやっているプログラミングとか,「どう動かす」を訓練することにフォーカスが当たっていますが,それは実に古い「プログラミング言語観」に囚われていると言えます.

「どう動かす」というスキルは,すごいプロフェッショナルであれば生き残ると思いますが,ほとんどはコンピュータに置き換わってしまうのではないでしょうか.並みのプログラマーは不要になってしまう.だって,未来には仕様を入れれば動いてしまうプログラム言語ができるんですよ.

しかし「何をやって欲しい」の部分はコンピュータには置き換えられない.そういう人を育てるべきではないでしょうか.