言語の進化とプログラミング教育

プログラミング言語というのは,人間が頭に浮かんだものを正確にコンピュータに伝えるために何らかの方法で記述する方式です.人間はそのプログラミング言語の使い方を習得するのと同時に,コンピュータはその言語で書かれたものを解釈して自分が実行できる形式である機械語のレベルにまで変換できなければなりません.

昔はコンピュータの入力装置としてパンチカードとカードリーダーというのがありました.カードに穴をあけて,1行分のテキストを表現します.これを重ねて何行かのプログラムとしてコンピュータに読み込ませて実行しました.

そこから文字ターミナルという入出力装置に変わって,画面全体でカーソルを移動しながらテキストを編集できるようになりました.プログラミング言語の文法も行から少し自由になりました.ターミナルが入出力装置であるという性質を生かして,人間がプログラムを一方的に記述するのではなく,コンピュータ側からその入力を助けてくれる仕組みが発達し,それは現在でも改良されています.となるとプログラミング言語の設計もコンピュータからの支援を前提としたものもありということになります.

次にビットマップディスプレイとマウスが登場し,プログラミング言語の表現力が爆発的に広がるかに思われましたが.

もう一度,プログラミング言語の最初の定義に戻ると,人間が頭に浮かんだものを正確にコンピュータに伝えるための表現方法,ということなので,人間とコンピュータのインタフェースが進化すればそれを生かしたプログラミング言語を設計できる,ということです.いままで人間がコンピュータに歩み寄っていた部分が,コンピュータが人間に合わせて,どんどん人間に使いやすいものに変わって行きます.

たとえば,画面上の絵を斜め上に動かす,ということを考えます.人間にとっては「斜め上」という言葉でわかるのに対して,コンピュータにとっては右に12,上に20だけ動け,という具体的な数値にまで落とし込まないと動けません.

実際の斜め上はいろいろな角度と方向がありますが,それを一つに決めてしまうと簡単になります.つまり「斜め上」という言葉をそのまま「右に10,上に10」という固定された動きに置き換えればよいのです.これはこれで一つのプログラミングの表現になりますが,コンピュータが持っている表現力(いろんな角度といろんな距離)を捨ててしまっています.入門用のプログラミング言語のなかにはこのアプローチ,つまりコンピュータの表現力を捨てることによってプログラムを簡単にする,というものがけっこうありますね.ビスケットも大きな意味ではその方向です.しかし捨てなくていいものまで捨てているので,入門用言語が下に見られるのも仕方がありません.

別の方法もあります.たとえば,斜め上に動けと言われたとき,コンピュータはランダムに斜め上に動きます.それが自分が気に入った動きなのかそうじゃないのかを,良い,近い,ダメのボタンを押してコンピュータに伝えます.何度かやり取りするうちに気に入ったものが見つかればそこで動きを決定します.

いろんな意見があると思いますが,僕はこの対話的に解に近づけてゆく方法もプログラミング言語の表現の一つとしてあってよいと思っています.

ちなみにビスケットは
のようにメガネの左と右を使って,動きを差分として表現しています.この方法では斜め上という言葉にとらわれることなく,動く方向と距離の表現力をフルに生かしたプログラムができます.また対話的なプログラミングとしても見ることができ,まずは大体の感じで絵を並べて,実際の動きを確認しながらメガネの中の絵の配置を調整して,より自分が求めている動きに近づけてゆきます.ランダムなものから選ぶよりも自分で制御している感じが強いですね.

人間がプログラミングをする上で不得意な部分があれば,それをコンピュータが支援する.上の例では斜め上を数値で表現する方法は人間にとって分かりにくいので,絵のずらし方による表現と,作られた動きの確認という2つの方法でそこを補いました.

人間にとって時間変化を全体でとらえることも苦手です.


たとえば,このメガネは魚を回転させています.メガネの右側に斜めに魚を入れることで,魚は回転します.回転の円の大きさや中心はメガネの中のずらし方だけで決まります.ビスケットのメガネは一定時間での絵の変化を表現しています.このメガネは円というより正多角形を2辺の関係で表現しているとも解釈できます.辺の長さだけ横にずれて辺と辺の角度だけ魚は回転する,という指示です.この欠点は円の大きさと中心を思い通りの位置にするのがとても難しいということです.

ビスケットに限らず,プログラミング言語のほとんどは小さな時間的変化を記述しますが,実際に指示したいものはもっと長い時間での全体の動きです.全体の動きを想像しながら小さな時間変化を記述して積み上げる,という苦行がプログラミングです.

これはまだビスケットには入っていない機能なんですが,たとえば20ステップくらい未来までの動きを一つの絵として見せたらどうでしょうか?

メガネを作ると一瞬でこのような絵が作られます.メガネの魚のずれと角度を微調整すると即座に円の大きさと中心に反映するので,自分が求めている動きが作りやすくなります.

ビスケットでピタゴラスイッチのような作品をつくるときも,動きを何度も微調整してうまいタイミングでぶつかる様にしますが,この未来を一望できる仕組みがあれば簡単に作れてしまいます.

プログラミングを学ぶことで,コンピュータを操作する以外のことが学べてしまう,というのはプログラミング言語を進化させるチャンスです.

プログラミング言語がまだ進化していなかったときは,人間があれこれ頭を使って作らなければいけなかったので,論理的な思考が必要と言われてたのもそういうことです.

こんな感じでプログラミング言語が至れり尽くせりやってくれるようになると,わざわざプログラミングのために何かのスキルをつける必要はなくなります.プログラミング的思考といわれている能力が進化したプログラミングでは不要になるかもしれません.

プログラミング言語がどのように進化するのかを踏まえないでプログラミング教育は考えらません.

プログラムを書けるかどうか,という入口でもがいているのではなくて,コンピュータに何をさせたいのか,ということを思いつく能力がますます重要になってくるということです.

シェアする

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

フォローする