Prev / Next / カメ太の日記

PUKAI発表資料:ドリトルV2/兼宗(一橋大学)[infoedu][dolittle]

2008-04-16

(PUKAIの発表資料です。スライドを作る時間がなくて、なんと日記に書いて説明してしまいました)




初めての人が多いので最初から。

【野望】
兼宗と久野先生が始めたプロジェクト(2000年)
- 小中高(大)向けの入門言語

普通に考えると、フツーの言語を簡易化することになる。しかし...
- PascalやPerlの簡易版とか:-) つまらない、ひねりがない
- 今どき、オブジェクト指向でないのは...
- そもそも過去に失敗した歴史
    N88BASIC: PCが配られてもアプリがないので、ROMに内蔵されたBASICを教えていたらしい。GOTOの世界
    LOGO: 多くの学校に配られて使われたらしい


【言語的なLOGOの振り返り】
「教育現場ではどんな言語まで許容されるのか」という意味で

LOGOの設計は1968年頃? LISP1.5あたりから分派か
1970年代後半から1980年代前半に普及。日本でも多くの小中学校に入ったらしい
証拠: 1980年代に、国内でLOGOの書籍30冊が近く出版
個人的には、1990年にLOGOのフリーソフトを作ったのが縁で調べた

LOGOは言語仕様がない(!)ので、解説書と処理系から共通点を調査
実体は「括弧のないLISP」。教育用言語としてはかなり変体的

(1) ループは再帰のみ
- タートルグラフィックスでフラクタル図形を描くには自然。でも子供はフラクタルなんて作れない
- 手続きの最後で自分を呼ぶ。末尾再帰のループ展開は暗黙の言語仕様
- 無限(再帰)ループ中にifを入れてbreakする。これは難易度が高いようで、見学した授業の多くは末尾再帰の無限ループを停止キー(キーボードのファンクションキー)で止めていたorz
- for, whileはない

手順は ぐるぐる
  歩く 1
  右へ 1
  ぐるぐる
終わり



but, 一定回数の繰り返しだけ、repeat(単なるループ)を入れてしまっている。これでは台無し。「子供には再帰」と主張するなら最後までそれを貫かないと...
実際、先生方に話を聞くと、使っていたのはrepeatだけだったらしい。「子供でも再帰」は幻想

(2) データ構造はリストのみ
- 集合も配列も木構造も自由自在。car, cdr, cons相当の命令あり
- しかし、ほとんど使われることはなかったらしい...

(3) スコープはダイナミック
- 古いLispだから...。手続き内のbindされていない変数は、どこから呼ばれるかで意味が変わる
- 最初lexicalで作りかけ、動作が違うので気付きました :-)

(4) 代入はset
-通常の言語の「x=1」「y=x+1」は、次のように書く。Lispのsetそのまま(setqではない)
- しかし、第1引数をquoteする意味を理解している先生にはお目にかかったことがありません...

変数は "x 1
変数は "y :x+1



こんな変体言語が、
・命令を日本語に訳しただけ
・タートルグラフィックスという愛らしい見せかけ
だけで、全国の小中学校の先生と生徒がお絵描きに使っていた

教訓: 「フツーの言語でないと難しい」は幻想!



【ドリトル】
消えた言語の話はこれくらいにして、これからの言語の話

というわけで、「フツー」にこだわらずに言語設計した


(1) 子供にオブジェクト指向
人間に優しいモデルのはず。JavaやC++は、なぜ難しい???

仮説: 「クラス設計」が悪

設計してからプログラムを作るのは、お仕事だから(設計図、仕様書)
初心者や子供は、粘土や紙をあれこれいじくりながら工作を学んで行くように、最初は設計せずに、試行錯誤しながら学んで行くのがよい

→ クラスのないオブジェクト指向(プロトタイプ方式)
1986年頃? Self
199?年 JavaScript
2000年 ドリトル(教育言語に取り入れたのは初)

(黒板があれば図 → なかったので省略。オブジェクト同士の親子関係図)

自然なモデル
・インスタンス生成
・オブジェクト間の関係(継承っぽい)


(2) オブジェクトを意識させる構文
オブジェクトに呼びかける。「カメ太!〜して」という雰囲気
子供も初心者も、強烈にオブジェクトを意識することになる

obj ! args... msg.
(例) カメ太!100 歩く。



前の結果のオブジェクトにメッセージを送れる(カスケード)
正確には、最初のメッセージの返値に次のメッセージが送られる

// カスケード
obj ! args1... msg1 args2... msg2.
(例) カメ太!100 歩く 90 右回り。




(3) 変なこだわり(遊び:-))
基本構文は、「メッセージ送信」と「代入」の2つだけ。本当にそれだけ

カメ太=タートル!作る。 // 代入+メッセージ送信
カメ太!100歩 歩く。 // メッセージ送信


メッセージ送信とカスケードを使って、制御構文を実現

eval: 基本形はブロックオブジェクトのeval。実際にはほとんど使われないが

「...」!実行。



while

「...」!の間「...」実行。

// 「...」!の間 → While
// While!「...」実行。



if/then

「...」!なら「...」実行。

// 「2 > 1」!なら → True
// True!「...」実行。

// 「1 > 2」!なら → False
// False!「...」実行。



if/then/else

「...」!なら「(T)」そうでなければ「(E)」実行。

// 「2 > 1」!なら → True
// True!「(T)」そうでなければ → Done
// Done!「(E)」実行

// 「1 > 2」!なら → False
// False!「(T)」そうでなければ → True
// True!「(E)」実行




(4) タイマーでスレッド
アニメーションに便利

時計=タイマー!作る。
時計!「...」実行。 // 0.1秒間隔で100回実行(10秒間)
...



タイマーの実行は終了するまでに時間がかかるので(上の例は10秒)、メインの流れとは別スレッドで実行される。つまり、タイマーを実行すると、処理の流れはタイマーの終了を待たずにそのまま次の行に進んで行く。子供たちは知らずにスレッドでプログラムを作っている!
たまには終るのを待ちたいこともあるため、単純な待ち合わせを用意した

時計=タイマー!作る。
時計!「...」実行。 // 0.1秒間隔で100回実行(10秒間)
時計!待つ。



ここまでが言語の話。以下はドリトルの代表的な応用例



(5) タートルグラフィックス
やはり強力。LOGOと同じではつまらないので、いくつか拡張した

工夫1: 描いた線をオブジェクトにする。自分の描いた図形を動かすことで愛着が湧く
工夫2: タイマーによるアニメーションと衝突イベント。もはやタートルグラフィックスではない。

ここで宝物拾いゲームを1行ずつ実演。
宝物拾いゲーム

カメ太=タートル!作る。
左ボタン=ボタン!”左”作る。
左ボタン:動作=「カメ太!30 左回り」。
右ボタン=ボタン!”右”作る 120 0 移動する。
右ボタン:動作=「カメ太!30 右回り」。
時計=タイマー!作る 200 回数。
時計!「カメ太!10 歩く」実行。
タートル!作る ”tonbo.gif” 変身する ペンなし (乱数(600)-300) (乱数(300)-150) 位置。
タートル!作る ”tonbo.gif” 変身する ペンなし (乱数(600)-300) (乱数(300)-150) 位置。
タートル!作る ”tonbo.gif” 変身する ペンなし (乱数(600)-300) (乱数(300)-150) 位置。
カメ太:衝突=「|相手| 相手!消える」。



これはお絵描きプログラム。上のプログラムで見たように、ボタンは(1)ボタンを作る、(2)押したときの動作を定義する、という2行で書ける。「歩くボタン」「左に曲がるボタン」「三角形を描くボタン」「色を塗るボタン」などを2行ずつ作って行くと、いつの間にか「立派なアプリケーションソフトを作れた!」という達成感を得られる。プログラムは長くなって行くが、いちどに考える部分が2行ずつしかないので、考えるのが苦手な子供でも扱える。中学校までの義務教育では、クラスの全員が扱えることも大切
paint

某企業の新人研修で使われた様子と作品例。カメの姿は画像ファイルを読み込んで変えられる。同級生の写真を切り抜いてロールプレイングゲーム風にした新人もいた。Javaだけを2週間やるのと比べて、ドリトルを2,3日やってからJavaに進むようにしたら定着率が劇的に改善したそうです。プログラミング経験がない場合、初期の段階で「だいたいこう作ればいいんだな」という感触と、「自分はプログラムを書ける」という自信を持たせておくのが重要。いきなりJavaやC++を教えると、示された例題を打ち込んでいるだけの学習(キー入力の学習)に陥りがち
r1 r2

衝突イベントは、ゲームに便利。ここではブロック崩しの例で考えてみる

V1: 動いたオブジェクトに衝突が発生。ボールの衝突の中で、ぶつかった相手を判別して、「パドルと壁なら跳ね返るだけ。ブロックなら、相手を消して得点を加える」という条件処理をする必要があった。複雑で難しい

V2: ぶつかった相手にも衝突が発生。ボールは「何かにぶつかったら跳ね返る」だけでよく、ブロックに「自分を消して得点を加える」という処理を書く。処理が単純になり、プログラムが大幅に簡単になる

ブロック崩し

これくらいの内容がドリトルプログラムの基本形。小中高の授業ではプログラミングにそれほど時間を使えないので、数時間でプログラミングの楽しさが伝わることを目指している



(6) ロボット制御
外部機器を操作する。組込機器の動作原理を体感するのが目的

典型的にはロボットカー。左右に車輪がある。アームを付けることもできる
MYU

STEP1: 出力のみ。目をつぶって広場を歩くのと同じ(小学生)
STEP2: 先頭にスイッチ。衝突したことがわかる(中学生)
STEP3: アームにスイッチ。物を運ぶなど仕事ができる(中学生の応用編)

写真は小学校の授業例。自作の橋をくぐり、ぐるっと回転して橋を越えてゴールする
car1 car2

その他、エレベータや二足歩行(静岡大学)、飛行船も
この写真はエレベータ(高麗大学)とアーム付き3軸ロボットカー(静岡大学附属島田中学校)
エレベータ ロボットカー
この写真は制御プログラムと飛行船(京都コンピュータ学院)
飛行船制御 飛行船


(7) ネットワークプログラミング
オブジェクトを交換する

対戦ゲーム: プロトコルを決める、協力してデバッグ
nw2

チャット: 小中高で成功。インターネットやケータイの裏側を体験的に理解できる


(8) 音楽プログラミング
鼻歌風にメロディを書ける。同時に複数の楽器で合奏も可能。

メロディ!"ドドソソララソー" 作る 演奏。




【今後】
1.V2リリース
- 現在はテスト版。5月に正式版リリース

2.本
-解説書を出す

3.国際交流
- 研究費の関係で成果を出す必要あり
- 韓国語のプログラムを日本語に翻訳して実行/拡張→フィードバック
韓国語版

4.中学校向け
- 3月の指導要領で、技術の「プログラミング」「計測・制御」が必修化
- 実施は3年後(?)だが、前倒しで実施の文言も
→ 普及のチャンス

5.高校向け
- 秋に指導要領。科目名は「A/B/C」から「情報の科学」「社会と情報」で確定
- 「情報の科学」に期待。CSアンプラグド的な内容とアルゴリズムくらいは入らないか
→ 普及のチャンス

補足:
最近の小中高のパソコン教室は、フリーソフトのインストールは事実上できない。禁止されているか、再起動すると消えてしまう。そもそも、インストールが必要だと気軽に使ってもらえない
そこでWebブラウザで実行できるオンライン版を公開している。Javaアプレットの制限で、入力したプログラムをローカルのディスクに保存できないが便利

permlink