機械を読む機械
仕事の数だけ、機械を作るのか
ここまで、仕事ごとに別の機械を作ってきました。裏返す機械、1をたす機械、たし算の機械。どれもテープとヘッドは同じで、遷移表だけが違う機械でした。
すると、いやな予感がしてきます。かけ算がしたければ、もう1枚。割り算がしたければ、さらにもう1枚。100の仕事には、100枚の表——つまり実質100台の機械が要るのでしょうか。
チューリングの答えは、こうです。いいえ。1台でいい。
表は、テープに書ける
種は、遷移表をじっと見ると見つかります。表は何でできているでしょう。状態の名前、読む記号、書く記号、動く向き——ぜんぶ記号の並びです。
そして記号の並びなら、テープに書けます。テープの前半に「まねしたい機械の表」を書き、後半にその機械への入力を置く。あとは、表を読んで、そのとおりに動く機械を1枚の表として作ればいい。
この機械を**万能機械(universal machine)**と呼びます。裏返したければ裏返す表を、たしたければたし算の表をテープに書く。機械を作り直す代わりに、テープの中身を差し替える——1台で、どんな機械のまねもできます。
あなたは、これをもう作っている
ここからが、このレッスンの山場です。「表を読んで、そのとおりに動く機械」——あなたはこれを、もう作ったことがあります。
コース2で作った評価器です。下の実験室は、あなたが組み上げたあの言語の完成形です。
この欄に打ちこんだ文字列は、評価器というプログラムにとってのデータです。評価器はその文字の並びを粒に分け、木にして、木のとおりに動きました。「テープに書かれた設計図を読んで、そのとおりに動く」——万能機械と評価器は、同じ思想の上に立っています。
つまり「プログラムを実行する」とは、特別な魔法ではありません。プログラムという名のデータを、別のプログラムが読んでいるだけです。プログラムもデータである——これが、計算機科学でいちばん深い発見のひとつです。
プログラムがデータだと、何が起きるか
この発見の帰結を、暮らしの中から2つだけ拾います。
ひとつめは、アプリがダウンロードできること。スマートフォンに新しいアプリを入れるとき、あなたは機械を増設していません。プログラムというデータが届くだけで、できる仕事が増える——万能機械のテープに、新しい表を書き足しているのです。
ふたつめは、プログラムを読み書きするプログラムが存在できること。プログラムがデータなら、それを読んで別のプログラムを書き出すプログラムも書けます。コース2の寄り道で名前だけ出てきたコンパイラ——ある言語の文章を機械語に翻訳するプログラム——が成り立つのは、このためです。
✎ 演習:機械はそのまま、データを書きかえる
上の実験室で、double を3倍の関数 triple に書きかえて、triple(21) を実行してください。63 が出れば成功です。
そのうえで、ひとつ考えてください。あなたがいま書きかえたのは、機械(評価器)でしょうか。それとも、データでしょうか。
ヒント1(考え方)
関数のかたちはコース2のレッスン10と同じです。fn 名前(引数) { 式 }。変えるのは名前と、かけ算の数だけです。
こたえ
fn triple(x) { x * 3 } と triple(21) で、63 が出ます。そしてあなたが書きかえたのはデータだけです。評価器のコードには指一本ふれていないのに、機械は別の仕事をしました。テープを差し替えれば別の機械になる——万能機械の上で暮らすとは、こういうことです。
このレッスンで分かったこと
- 遷移表は記号の並びでできている——だからテープに書ける
- テープ上の表を読んでまねる万能機械は、1台でどんな機械にもなれる
- コース2で作った評価器がまさにそれ。打ちこんだプログラムは、評価器にとってのデータ
- プログラム=データだから、アプリは「届く」だけで増え、コンパイラが存在できる