機械を読む機械

よみもの+手を動かす時間:およそ25分

仕事の数だけ、機械を作るのか

ここまで、仕事ごとに別の機械を作ってきました。裏返す機械、1をたす機械、たし算の機械。どれもテープとヘッドは同じで、遷移表だけが違う機械でした。

すると、いやな予感がしてきます。かけ算がしたければ、もう1枚。割り算がしたければ、さらにもう1枚。100の仕事には、100枚の表——つまり実質100台の機械が要るのでしょうか。

チューリングの答えは、こうです。いいえ。1台でいい。

表は、テープに書ける

種は、遷移表をじっと見ると見つかります。表は何でできているでしょう。状態の名前、読む記号、書く記号、動く向き——ぜんぶ記号の並びです。

そして記号の並びなら、テープに書けます。テープの前半に「まねしたい機械の表」を書き、後半にその機械への入力を置く。あとは、表を読んで、そのとおりに動く機械を1枚の表として作ればいい。

この機械を**万能機械(universal machine)**と呼びます。裏返したければ裏返す表を、たしたければたし算の表をテープに書く。機械を作り直す代わりに、テープの中身を差し替える——1台で、どんな機械のまねもできます。

あなたは、これをもう作っている

ここからが、このレッスンの山場です。「表を読んで、そのとおりに動く機械」——あなたはこれを、もう作ったことがあります。

コース2で作った評価器です。下の実験室は、あなたが組み上げたあの言語の完成形です。

③ 評価された値
42

この欄に打ちこんだ文字列は、評価器というプログラムにとってのデータです。評価器はその文字の並びを粒に分け、木にして、木のとおりに動きました。「テープに書かれた設計図を読んで、そのとおりに動く」——万能機械と評価器は、同じ思想の上に立っています。

つまり「プログラムを実行する」とは、特別な魔法ではありません。プログラムという名のデータを、別のプログラムが読んでいるだけです。プログラムもデータである——これが、計算機科学でいちばん深い発見のひとつです。

プログラムがデータだと、何が起きるか

この発見の帰結を、暮らしの中から2つだけ拾います。

ひとつめは、アプリがダウンロードできること。スマートフォンに新しいアプリを入れるとき、あなたは機械を増設していません。プログラムというデータが届くだけで、できる仕事が増える——万能機械のテープに、新しい表を書き足しているのです。

ふたつめは、プログラムを読み書きするプログラムが存在できること。プログラムがデータなら、それを読んで別のプログラムを書き出すプログラムも書けます。コース2の寄り道で名前だけ出てきたコンパイラ——ある言語の文章を機械語に翻訳するプログラム——が成り立つのは、このためです。

演習:機械はそのまま、データを書きかえる

上の実験室で、double を3倍の関数 triple に書きかえて、triple(21) を実行してください。63 が出れば成功です。

そのうえで、ひとつ考えてください。あなたがいま書きかえたのは、機械(評価器)でしょうか。それとも、データでしょうか。

ヒント1(考え方)

関数のかたちはコース2のレッスン10と同じです。fn 名前(引数) { 式 }。変えるのは名前と、かけ算の数だけです。

こたえ

fn triple(x) { x * 3 }triple(21) で、63 が出ます。そしてあなたが書きかえたのはデータだけです。評価器のコードには指一本ふれていないのに、機械は別の仕事をしました。テープを差し替えれば別の機械になる——万能機械の上で暮らすとは、こういうことです。

このレッスンで分かったこと

  • 遷移表は記号の並びでできている——だからテープに書ける
  • テープ上の表を読んでまねる万能機械は、1台でどんな機械にもなれる
  • コース2で作った評価器がまさにそれ。打ちこんだプログラムは、評価器にとってのデータ
  • プログラム=データだから、アプリは「届く」だけで増え、コンパイラが存在できる