XMAKYNA Blog

EngineeringFoundations

コンピュータはどう動くのか:ファインマンの超高速書類整理係

Language: Japanese
Illustration of a filing clerk at numbered drawers, surrounded by diagrams of instructions, addresses and repeated steps, representing Feynman’s model of computer operation.

リチャード・ファインマンは科学史に残る人物です。しかし、それだけが、XMAKYNAの技術ブログをこの講義から始める理由ではありません。私たちがここから始めるのは、重視している多くの工学的な問題が、突き詰めればとても単純な問いに行き着くからです。機械は何を読んだのか。何を保存したのか。次に何をしたのか。そして、何に影響を与えることを許されていたのか。ファインマンの書類整理係のモデルは、こうした問いを考える共通の言葉を与えてくれます。後の記事は、その土台を毎回説明し直さずに先へ進めます。

40年以上たった今でも(このセミナーは1985年に録音されました)、この講義は驚くほど新鮮に感じられます。コンピュータに少しでも興味がある人なら、ほとんど誰でも得るものがあるでしょう。ファインマンは専門用語から始めないからです。登場するのは、整理係、番号の付いた引き出し、単純な命令、次にどこへ行くかを示すメモ、そして別の引き出しを指し示せる値です。それだけで、コンピュータの基本的な仕組みが見え始めます。

この講義もこの記事も、コンピュータのすべてを説明するものではありません。ただし、役に立つ中核は説明しています。情報はどこかに保存され、命令が次に何が起きるかを決め、保存された値が機械を別の場所へ導き、単純な操作が組み合わさってはるかに複雑な振る舞いを生み出します。

これはセキュリティにも重要です。深刻な障害の多くは、この図式まで戻すとずっと分かりやすくなります。機械は間違った場所から読み、間違った次の手順へ進み、別の部分では違う意味を持つ値を信頼するかもしれません。あるいは、引き出しの中身や整理係が次に見る場所に影響を与えられる誰かによって、意図的に別の方向へ導かれるかもしれません。

機械は命令を完璧に守りながら、それでも危険なことをする場合があります。この事実を理解することは、私たちが今後も繰り返し使う基礎の一つです。

大規模言語モデル(LLM)をはじめ、出力が驚くほど有能に見えるシステムと日常的に接する今、この講義はまた違った響きを持ちます。ファインマンが説明していたのは現代のAIではありませんし、この記事もそうだったかのようには扱いません。講義が与えてくれるのは、もっと根本的な視点です。目を引く出力の先を見て、機械が実際に何をしているのか、どうしてその結果に至ったのか、どこで間違いうるのか、そしてその間違いが重要な場面では何が起きるのかを問う視点です。私たちにとって、これはAIを使う際の中心的な工学課題でもあります。コードがビルドできる(コンパイルが通る)、実行できる、もっともらしく見える。それだけでは不十分です。正しいことを、なお確かめなければなりません。

そこでこの記事は、意図的に基礎から始めます。ファインマンの単純な比喩を、専門家でない人でも、コンピュータがどう情報を見つけ、命令に従い、進む方向を変え、単純な手順から複雑な振る舞いを生み出すのかをしっかり思い描けるところまで追います。この図式は、あとで何度も必要になります。

まず、整理係といくつかの引き出しから

番号の付いた引き出しが並ぶ部屋に、一人の整理係がいると考えます。各引き出しには、数値や別の簡単な情報を入れられます。整理係は引き出しを開け、中を読み、値をコピーし、別の場所に新しい値を書き、二つの値を比較し、次に何をすべきかを示す命令に従えます。

Diagram of a filing clerk with a next-instruction note, numbered drawers containing values and an instruction, and four literal operations: read, write, compare and follow next.Diagram of a filing clerk with a next-instruction note, numbered drawers containing values and an instruction, and four literal operations: read, write, compare and follow next.
図1. 書類整理係のモデル。番号付きの引き出しに値が入り、少数の字義どおりの操作が読み取り、書き込み、比較を行い、次の命令へ進む。

わざと地味な設定です。整理係は、その数値が金額なのか、色なのか、文字なのか、温度なのか、チェス盤上の位置なのか、それとも別の引き出しのアドレスなのかを知る必要がありません。意味は、私たちが表現の仕方を決めることで与えます。整理係にあるのは、値、場所、手順です。

これは、コンピュータを神秘的なものにしないための、とても有効な見方です。外から見ると驚くような振る舞いをする機械でも、一つ一つを見れば拍子抜けするほど単純な操作からできています。高度さを生むのは構成です。何を保存するのか、どう表現するのか、次にどの命令を実行するのか、そしてそうした操作をいくつ連ねられるのかです。

プログラムの進路も保存されている

本当に強力なのは、書類整理システムがデータだけでなく、作業の進み方まで表せることです。整理係はどこかに、次に実行する命令を記録しています。現代のコンピュータアーキテクチャでは、この小さな状態は一般にプログラムカウンタと呼ばれます。名前は技術的ですが、考え方は笑ってしまうほど単純です。整理係のメモに、実質的には「次は命令101を読め」と書いてあるだけです。

命令101のあと、通常なら102、103、104と続くかもしれません。しかし、ある命令が「次のカードへ進まず、命令250へ行け」と言うこともできます。これがジャンプです。条件付きジャンプなら、そこに判定が加わります。この値がゼロなら250へ、そうでなければ102へ進む、という具合です。

何も神秘的なことは起きていません。機械は、次の命令がある場所として保存していた値を変えただけです。それでも、この一つの考え方から、分岐、ループ、再試行、そしてプログラムの見慣れた形の大部分が生まれます。ループとは、ある条件が変わるまで、整理係を既に通った命令へ戻すジャンプにすぎません。

ここは少し立ち止まる価値があります。大量のコンピュータ用語が、普通の記録管理にまで単純化されるからです。機械の制御フローそのものが状態です。「次に何が起きるか」という答えはどこかに表現され、命令はその答えを変えられます。

Diagram showing instructions 101 to 104 in sequence and a conditional test that changes the stored next instruction to 250 or 103.Diagram showing instructions 101 to 104 in sequence and a conditional test that changes the stored next instruction to 250 or 103.
図2. 制御フローそのものが状態である。通常は命令を一つずつ進むが、条件によって保存された「次の命令」を書き換え、実行の進路を変えられる。

ポインタは、書き留められた場所にすぎない

ポインタも同じ書類整理システムで説明できます。500番の引き出しに914という数値が入っているとします。914は、単に九百十四という数かもしれません。別の文脈では「探しているものは914番の引き出しにある」という意味かもしれません。数値がこのように使われるとき、それはポインタ、つまり別の場所(別の引き出し)を参照するアドレスとして働いています。

ここでも、力は解釈から生まれます。整理係がメモリの中に光る矢印を見るわけではありません。値を読み、現在の命令から「この値を場所として扱え」と指示され、次の操作がその値を使って別の引き出しを選びます。一つの保存された数値が、その後の処理がどこから読み、どこへ書くかを変えられるのです。

Diagram showing drawer 500 storing 914, which can be ordinary data or treated as an address that redirects the next read to drawer 914.Diagram showing drawer 500 storing 914, which can be ordinary data or treated as an address that redirects the next read to drawer 914.
図3. ポインタは間接参照を目に見える形にする。500番の引き出しには914が入っており、914を場所として扱うと、次の読み取り先は914番の引き出しになる。

これが、書類整理係のモデルがうまく広がっていく理由の一つです。データが別のデータを指し示し、命令が別の命令へ進路を変える。場所に対する少数の操作だけで、その操作自体よりはるかに豊かな振る舞いを持つ構造を作れます。

単純な命令、巨大な振る舞い

引き出しを読む。引き出しに書く。二つの値を足す。比較する。一つの値を、別の値がある場所として使う。次に来る命令を変える。繰り返す。一つずつ見れば、特別なことではありません。

ところが、非常に大きな書類整理システムの上で、それらを驚異的な速度で組み合わせると、表計算ソフト、コンパイラ、ゲーム、データベース、画像デコーダ、ウェブブラウザ、OSを実現できます。書類整理係は、アプリケーションごとに別の不思議な能力を持つ必要はありません。データと命令の並べ方を変えることで、同じ基本的な仕組みから違う振る舞いを生み出せます。

Diagram showing simple operations such as read, write, add, compare and redirect repeated millions of times to produce larger behaviours such as spreadsheets, compilers, databases and operating systems.Diagram showing simple operations such as read, write, add, compare and redirect repeated millions of times to produce larger behaviours such as spreadsheets, compilers, databases and operating systems.
図4. 大量の状態に対して単純な操作を驚異的な速度でつなぐと、複雑な振る舞いが生まれうる。速度が拡大するのは手順の規模であって、判断力ではない。

この説明の見事さはそこにあります。コンピュータを取るに足らないものにするのではありません。これほど平凡な材料から力が生まれるからこそ、むしろその力がいっそう印象的になります。

整理係が知的に見え始めるとき

ファインマンは最後に、書類整理係のモデルをもっと難しい問いへ押し進めます。機械は考えられるのか。彼の捉え方では、難しさは、コンピュータが思考の手順を決して実行できないことではありません。人間の思考には、整理係へそのまま渡せる、既知で完全に確定した手順が用意されていないことです。

チェスの話に入る前に、ファインマンは算術で同じ点をもっと単純に示します。機械は、数学者が計算するときの体験を真似しようとしているのではありません。定型的な算術にはるかに向いた、別の仕組みを使っています。

「機械は誰よりもうまく、ずっと速く、しかも違うやり方で計算する。……人間のように見せるために計算方法を変えることは決してない。それは後戻りだからだ。人間が行う算術は遅く、面倒で、混乱しやすく、間違いだらけだからだ。」

ここでファインマンが対象にしているのは算術であって、人間の知性一般ではありません。論点は実行方法です。定型的な算術では、コンピュータが別の方法を使うこと自体が利点です。人間らしく見せるためだけに人間の手順をまねさせるのは、その利点を捨てることになります。

そこから、もっと難しい問いが生まれます。算術を人間のやり方で行う必要がないなら、知的な振る舞いも人間と同じ経路から生まれなければならないのでしょうか。

チェスはその難しさを具体的にします。強い人間の棋士は、何百万もの局面を順番に列挙しているようには見えません。フォーク、弱いマス、見覚えのある形、有望な変化といった構造に気づきます。ファインマンが注目するのは、「人はパターンを見た」と言うことと、その有用なパターンが最初にどんな機械的手順によって見つかったのかを本当に知ることとの間にある隔たりです。

コンピュータは、同じ問題に別の方法で取り組めます。人間よりはるかに多くの局面を調べ、明示的なルールや評価を適用し、ヒューリスティックを使って、どこにも同じだけの計算量を費やすことを避けられます。人間の熟練者が同じ手にたどり着いた内面的な道筋を再現する必要はありません。

ファインマンはこの違いを鮮やかに表現します。「人間と同じように指させることはできないが、ほとんどすべての人間より強く指すようにはできる。」(強調はXMAKYNAによる)

この一文には、もっと大きな工学的な考えがあります。似ていることと役に立つことは別だ、という点です。人間と同じ道筋を再現しなくても、私たちが知的だと認める結果を機械は生み出せます。重要なのは、機械が実際にどんな手順を実行しているのか、どんなパターンや規則性を利用できるのか、可能性をどう探索し選ぶのか、そして能力がどこで終わるのかです。

だからこそ、知性へ飛躍したように見える場面でも、書類整理係のモデルは残ります。結果が驚くほど賢く見えても、下にある機械は依然として表現を操作し、選択肢を比較し、決まった操作に従って状態の中を進んでいます。謎がハードウェアへ移ったわけではありません。難しさは、有用な構造をどう表現するか、手順がそれをどう見つけるか、そして機械が人間と同じように考えなくても計算からどれほど多くのものが生まれうるかという点に移ります。

講義の後半は、思考する機械、知性、ヒューリスティックとその限界について、この記事よりはるかに広く扱います。それでも、範囲をここまで絞ったあとにも残しておきたいファインマンの締めくくりの言葉があります。「私たちは知的な機械に近づいていると思う。しかし、それらは知性に必然的に伴う弱点を示している。」

今この言葉を聞くと、当時とは違う響きを感じずにはいられません。機械は本当に役に立ち、驚くほど有能でありながら、完璧でなくてもよいという余地を残しているからです。弱点があるからといって、知性が自動的に否定されるわけではありません。知性そのものにも限界、盲点、特徴的な失敗の仕方がありうるということです。工学にとっては、有用な機械知性はまず無謬にならなければならない、と考えるよりずっと有用な出発点です。

整理係は字義どおりに動く

その知性自体にも鋭い面があります。その下にいる整理係は、今も字義どおりに動きます。整理係が従うのは実際に存在する手順で、使うのも実際に存在する状態です。私たちの意図を補ってはくれません。

命令が間違った引き出しを指していても、整理係は私たちが本当はどこを指したかったかを察してはくれません。500番の引き出しに914ではなく915が入っていれば、その後のポインタは別の場所へ進むかもしれません。ジャンプ条件を間違えて書けば、整理係は間違った分岐を完璧に進めます。システムの一部がある値をサイズとして解釈し、別の部分が違う意味で解釈していても、食い違いが怪しいからという理由で整理係が止まることはありません。

整理係が「混乱している」と言うとき、コンピュータが人間のような混乱を感じているという意味ではありません。状態、表現、手順のいずれかが、設計者が実際に守られていると考えていたモデルと一致しなくなった、という意味です。機械は完全に従順なままでも、システムは誤ったものになりえます。

実際のシステムでは、同じ引き出しを複数の整理係が扱うこともあります。一人が値を読んでいる間に、別の一人がそれを変更したり、消したり、その引き出しを別の用途に回したりできます。すると最初の整理係は古い値を使い続けたり、もう自分が考えていた対象のものではない引き出しへメモどおりに進んだりするかもしれません。複数の整理係が同じ引き出しに触れられるなら、誰がいつ読み書きできるかも、手順が正しいかどうかの一部になります。

ここから工学が面白くなる

難しいソフトウェア障害の多くは、この問題の何らかの形にまで戻せます。間違った場所をたどった。ある表現で判断し、別の表現で動作した。値を確認したあと、使う前にその値が変わった。古い記録を最新として扱った。フォールバックが作業を別の経路へ送った。後段が、前段では一度も確立されていない意味を信頼した。

外から見れば、こうした障害は高度なソフトウェアで起きています。しかし内側から外へ見れば、問いは驚くほど具体的です。整理係はどの値を読んだのか。その値はどの引き出しを指していたのか。次にどの命令が実行されたのか。どの条件がジャンプを引き起こしたのか。次の命令は、どんな状態を受け取ったと思っていたのか。

これは、私たちが大切にしている工学上の習慣です。システム全体についての主張が曖昧になったら、仕組みを再び字義どおりに説明できるところまで降りていきます。

そして、ここからセキュリティが入る

通常のバグは、整理係を偶然に混乱させるかもしれません。セキュリティ問題が成立しうるのは、誰かが状態や命令に意図的に影響し、機械を役に立つ結果へ向かわせられる場合です。

攻撃者は、コンピュータを命令に逆らわせる必要はありません。むしろ逆です。興味深い障害の中には、コンピュータがあまりにも忠実に従うために起きるものがあります。攻撃者の影響を受けたポインタをたどり、誤解を招く表現を受け入れ、許可されたジャンプを行い、認可された操作を実行し、あるいは手順に書かれたとおり次のコンポーネントへ値を渡します。

Diagram showing wrong location, wrong meaning or wrong route feeding literal execution, where instructions are followed exactly yet produce a dangerous result.Diagram showing wrong location, wrong meaning or wrong route feeding literal execution, where instructions are followed exactly yet produce a dangerous result.
図5. 字義どおりの服従は正しさを保証しない。すべての命令を正確に守っていても、状態、意味、経路が間違っていれば危険な結果になりうる。

その結果は、整理係に何をする権限があるかで変わります。捨ててもよい一時領域での混乱なら無害かもしれません。同じ混乱でも、認証情報、永続的な状態、私的データ、ネットワークアクセス、あるいは別の高権限コンポーネントの近くなら、重大な意味を持ちます。

こうした違いには、別の記事でまた戻ります。この記事はそれらを先取りするためのものではありません。目的は、共有できる心のモデルを持つことです。セキュリティ特性の名前について議論する前に、どんな情報があり、何を意味し、どこを指し、次にどの命令が実行され、そこからどんな権限に到達できるのかを問う。

繰り返し使っていくモデル

書類整理係は、XMAKYNAの文章で繰り返し使う言葉になると考えています。難しい考えを分かりやすくしながら、幼稚にはしないからです。ポインタは「書き留められた場所」になる。ジャンプは「次の命令」というメモの書き換えになる。プログラムカウンタは整理係のしおりになる。メモリは引き出しになる。実行とは、その引き出しに対する小さな操作の連続になる。

この図式ができれば、より高度な議論にも足場ができます。誤った状態、古い状態、誤解を招く表現、進路の変更、権限、攻撃者が制御する混乱について、コンピュータに人間の判断があるかのように装わず、また抽象概念の名前そのものが仕組みを説明するかのように扱わずに話せます。

難しい工学が実際以上に不可思議に見え始めたとき、このモデルは役に立ちます。規模と見慣れなさを取り去れば、ある意味では今も書類棚です。状態、表現、手順を正しくすれば、機械はその仕事を実行します。

だから、この講義は単に昔の魅力的なコンピュータ解説ではありません。長く使える考え方を与えてくれます。

講義情報と名称について

講演者:Richard P. Feynman。リンク先の録音そのものに1985年9月26日という日付が表示され、場所はカリフォルニア州ビッグサーのEsalen Instituteで開かれたIdiosyncratic Thinkingワークショップと示されています。

この講義は複数の題名で流通しており、関連するEsalenの資料について異なる日付を示す出版物もあります。リンク先のアップロードの題名はHardware, Software and Heuristicsです。Computers From the Inside OutとThe Feynman Lecture on Heuristicsという題名も別の場所で見られます。ここでは、この講義をComputers From the Inside Outと呼びます。

講義を見る: Richard Feynman, Computers From the Inside Out (YouTube).

要するに

コンピュータを十分に分解して考えると、驚くほど長く使える一つの像が残ります。とても速く、きわめて字義どおりに動く書類整理係が、実質的に膨大な番号付き引き出しと少数の操作を使っている。値は別の引き出しを指し示せる。命令は次に来る命令を変えられる。プログラムカウンタは整理係のしおりにすぎず、ジャンプはそのしおりを移す。こうした単純な動きを驚異的な速度で繰り返すことで、巨大な振る舞いが生まれます。

このモデルは単純ですが、浅くはありません。機械が動くのは、私たちが実際に符号化した状態と表現に対してであって、「こう理解してくれるはずだ」と期待した意図に対してではないことを思い出させます。整理係の混乱は正しさの問題です。攻撃者が意図的に整理係を混乱させることができ、そこに利用価値のある権限がつながっているなら、それはセキュリティ問題です。私たちは今後もこの考えに何度も戻るでしょう。