保存プログラムの考え――ジョン・フォン・ノイマンの名と結びつくことが多いこの発想が、再利用可能なソフトウェア、汎用コンピュータ、現代のプログラミングをどのように可能にしたかを解説します。

現代のコンピューティングの核心には単純な問いがある:なぜ一台の機械が毎回作り直されることなく、さまざまな仕事をこなせるようになったのか? 初期の電子計算機は高速に計算できましたが、「やることを変える」にはしばしば機械の物理的な設定を変更する必要がありました。保存プログラムの考え方は、コンピュータを真にプログラム可能にした転換点です。
保存プログラム型コンピュータは、タスクのための命令(プログラム)を、そのプログラムが扱うデータと同じ種類の内部メモリに保持します。配線を変えたりパネルを手動で再設定したりする代わりに、新しい命令セットをメモリに読み込んで別の仕事を実行できます。
今では当然に思えますが、これは深い転換でした:
これは単なる歴史的好奇心ではありません。保存プログラムの概念は「ソフトウェア」と「ハードウェア」が別個の存在として生まれた理由を説明し、今日デバイスを更新するだけで内部のチップを替えずに新機能を得られる理由にもつながります。
以下では、初期コンピュータが直面した問題、保存プログラム方式が何を変えたか、この考えを明確にした人々や文書(有名なEDVAC報告書を含む)、そして「フォン・ノイマン・アーキテクチャ」という呼び名がどのように広まったかをたどります。
ジョン・フォン・ノイマンの名前は保存プログラム計算に強く結びついていますが、功績はより広いチームと時代にまたがっています。多くの研究者が初期の電子計算機を構築する過程で似たような考えに収束していました。本記事はその文脈を重視します。チーム作業を理解することで、そのアイデアがいかに素早く広まり、後のほとんどのコンピュータの標準モデルになったかが見えてきます。
保存プログラムの考えが出る前、多くの初期コンピュータは今の意味で「ソフトを実行する」わけではありませんでした。高速に計算できても、何をさせるかを指定するには機械自体を物理的に変更することが多かったのです。
一般的な手法はプラグボード、パッチケーブル、スイッチパネルの使用でした。オペレータはソケット間に配線をつなぎ、スイッチを並べ、時には信号が正しい順序で届くようにタイミングを調整しました。「プログラム」は読み込むファイルではなく、暫定的な配線図だったのです。
この方式は機能しましたが、隠れたコストがありました:新しいタスクごとに小さなエンジニアリングプロジェクトが必要でした。演算の順序(加算、乗算、比較、ループなど)を変えたければ、数十本、場合によっては数百本の接続を移動しなければならないことがありました。一本の誤配線は、論理がハードウェアの接続に分散しているため見つけにくい微妙な誤りを生み出しました。
再設定には数時間から数日かかることがあり、機械を慎重にシャットダウンして配線をやり直し、テストする必要がありました。したがって柔軟性は限られ、これらの機械はしばしば長時間にわたって単一の計算に割り当てられていました。
砲兵の射表(長く反復的な計算で固定された公式)を計算するための機械があると想像してください。研究者が同じ機械で国勢調査の統計結果を集計したい場合、それは「プログラムを編集して再実行」できるような簡単な作業ではありません。処理の順序、中間結果の保存手順、条件分岐の有無などが異なるため、プラグボードを全面的に作り直して再検証が必要です。
この世界から抜け出すために設計されたのが保存プログラム型コンピュータです。
保存プログラム型コンピュータとは、命令(プログラム)が、プログラムが使用するデータと同じ作業用メモリに格納されている機械です。つまりコンピュータは「何をするか」と「何に対して作業するか」を別物として扱わず、どちらもメモリ上のビットのパターンとして保持します。
初期の先駆者たちが言った「メモリ」とは、コンピュータの高速で直接使える内部記憶、現在で言うところのRAMに最も近いものを指します。プロセッサが実行中に高速に読み書きできる場所です。
これは、電源オフ時にファイルを保持するディスクやSSDのような長期保存とは異なります。長期保存装置は便利ですが、プロセッサが次の命令を取り出し中間結果を更新するための即時的な作業領域ではありません。
命令がメモリに格納されると、タスクの切替が格段に簡単になります。新しいプログラムをメモリに読み込んで実行すれば、ハードウェアを作り直したり配線を変えたりする必要がなくなります。同じ汎用機が午前は給与計算、午後は弾道計算をこなせる—なぜなら仕事の「やり方」は置き換え可能なビット列であるからです。
レシピと材料が同じ棚に置かれている台所を想像してください。料理人(プロセッサ)は棚(メモリ)に何度も行って次のレシピの手順(命令)を読み、材料(データ)を取り出して更新します。
別の料理を作りたいときは台所を改装する必要はありません。単に別のレシピを入れ替えるだけで済みます—同じ流し、オーブン、道具を使い続けられます。
ジョン・フォン・ノイマンは「コンピュータを発明した人」ではなく、保存プログラムの考えを単独で作ったわけでもありません。彼がやったことは、有望な概念を明確に述べ、他の技術者や研究室が構築できるように広く共有される設計に磨き上げたことです。
フォン・ノイマンは戦時中と戦後の計算プロジェクトに深く関わり、チームに助言して初期設計の論理構造を整理しました。複雑な選択を平易で体系的に説明する才能があり、これは重要でした。なぜなら当時の電子計算は急速に進んでいて、複数のグループが同時に似た問題を解いていたからです。
さらに重要なのは、彼がプログラム命令をデータと同じメモリに保存するという考えを説明する影響力のある記述を作成し流布したことです。その明確な枠組みのおかげで他者が議論し教育し複製しやすくなりました。
名前というものは、必ずしも最初にアイデアを出した人につくわけではなく、その説明が参照点になった人につくことが多い。フォン・ノイマンの書き物は広く読まれ引用されたため、後の読者は自然に「保存プログラムの構成」を彼に結びつけました。
この呼び名は歴史を単純化します:すべての貢献者や報告書を挙げるより「フォン・ノイマン・アーキテクチャ」と言う方が簡単です。しかしその略称は実際に起きたことを曖昧にしてしまうことがあります。
初期の電子計算は数学者、技術者、プログラマが協力して進めた共同作業でした。保存プログラムの考えは議論、草稿、プロトタイプ、改訂を通じて成熟しました。フォン・ノイマンの持続的な役割は、アイデアを結実させ広めることで採用を加速させたことであり、単独で作り上げたというよりは結晶化と普及を促した点にあります。
EDVAC(Electronic Discrete Variable Automatic Computer)は戦後初期のプロジェクトの一つで、「一回限りの機械」を越えることを目指していました。ハードウェアの努力と同じくらい重要だったのは、設計思想を文書化して共有可能にする決定でした。当時のコンピュータ構築はまだ実験的工学に近く、知見は実験ノートや会議、限られた専門家の頭の中にとどまっていました。報告書はそうした断片的な洞察を他のチームが議論、批評、再利用できる形に変えました。
First Draft of a Report on the EDVAC(通称EDVAC報告書)は、保存プログラムの考えを概念的に述べました:コンピュータは命令をデータと同じ内部メモリに保持すべきである。メモリは計算中に数値を保持する場所というだけでなく、次に何をするかを機械に指示する手順も保持する場であると位置づけたのです。
この枠組みによって、コンピュータは固定目的装置というより、メモリ中身を変えることで「再課題化」できる汎用機と感じられるようになりました。配線で切り替えるのではなく、命令列を読み替えるだけです。
概念そのものに加え、報告書はメモリ、制御、演算、入出力という機能的区分を標準化するのに役立ちました。共通の語彙と広く読まれる記述があれば、EDVACだけでなく分野全体にとって保存プログラム型コンピュータを構築・比較・改良するための共通の精神モデルが提供されます。
「誰が保存プログラム型コンピュータを発明したのか?」と単一の名前を期待して尋ねたくなりますが、科学と工学はめったにそうは動かないものです。アイデアは並行して発展し、議論で洗練され、稼働するハードウエアで実証されて初めて説得力を持ちます。
ジョン・フォン・ノイマンは保存プログラム概念と強く結びついていますが、初期の仕事には多くの人々とグループが関わっていました:
保存プログラム型コンピュータは単一の洞察ではありません。それは(1) 命令をデータのようにメモリに置けるという概念的飛躍、(2) 信頼できるメモリと制御ユニットを構築する工学、(3) 設計を使いやすくするプログラミング実践の組合せです。異なる人々がそれぞれの部分に寄与しました。
もう一つ信用が分かれる理由は、アイデアを提案することと日々動く機械を構築することが同じではない点です。初期の報告や議論は概念を明確にしました;初期のプロトタイプや実用システムがその実現可能性を証明しました。歴史を丁寧に見ると、どちらの貢献も尊重されるべきで、単純な「最初の発明者」判断に押し込めるべきではありません。
人々が「フォン・ノイマン・アーキテクチャ」と言うとき、保存プログラム型コンピュータがどのように構成されるかの単純で教育的なモデルを指すことが多いです。これはブランドや単一の歴史的機械ではなく、多くのコンピュータに共通して現れる基本的計画の便宜的なラベルです。
概念的には次のような構成です:
重要なのは、CPUにとって「プログラム」と「数値」は物理的に別の場所にあるわけではないという点です。必要なものはすべてメモリから取り出されます。
CPUは通常次のループを繰り返してプログラムを実行します:
これは単純化した説明ですが、核心は捉えています:プログラムはメモリに格納された命令列であり、CPUはそれを順に処理していくということです。
命令とデータを同じメモリに置くとコンピュータは非常に実用的な意味で汎用になります:
これは便利なラベルであり、単独の発明を主張するものではありません。フォン・ノイマンの説明と結びつけられているという点が強調されますが、実際の早期の発展は複数の貢献者によるものでした。
「フォン・ノイマン」と「ハーバード」はまるで対立する哲学のように語られることがありますが、実際には命令とデータをどのように配置してCPUが取り出すかという実用的な二つのやり方です。
フォン・ノイマン方式では命令とデータが同じメモリにあり、通常CPUへの経路も共通です。概念的には単純で、プログラムはメモリ内のバイト列としてデータと隣り合って存在します。汎用性が高く、ソフトウェアの読み込み・変更・保存がデータと同じメカニズムで行えます。
欠点としては、命令とデータが同じ“道路”を共有するため帯域競合が発生しうる点(いわゆる「ボトルネック」)があります。
ハーバード方式では命令用の記憶とデータ用の記憶を分ける設計が行われ、多くの場合それぞれに別の経路があります。これにより次の命令を取り出しながら同時にデータの読み書きをするのが容易になるため、小規模で予測可能なシステムに向いています。多くのマイクロコントローラは、コードがフラッシュに、変数がRAMにあるという形でこのアプローチを取ります。
現代のCPUはソフトウェアから見ると「フォン・ノイマン的」に見えることが多い一方で、内部的にはハーバード的な工夫を取り入れています。典型的には命令キャッシュ(I-cache)とデータキャッシュ(D-cache)を別に持つことで、見かけ上は一つのメモリ空間でも命令とデータを効率よく供給できます。
覚えておくべきは、万能の最適解はないということです。フォン・ノイマンは単純さと柔軟性を、ハーバードは分離とスループットを重視します。多くの機械は両方の利点をバランスさせるために混合的な設計を採用しています。
保存プログラム型コンピュータは単に計算を実行するだけでなく、メモリから命令を読み込んで実行し、後で別の命令群に入れ替えることができます。この変化により、ソフトウェアは再利用可能で共有可能になりました:一度書かれたプログラムは保存・複製・改善・配布ができ、ハードウェアに手を加える必要がなくなったのです。
プログラムがメモリにあることで、同じ物理マシンが単に命令を差し替えるだけで多様な仕事をこなせます。これが「汎用機」と呼ばれる本当の意味です:一台の機械、複数のプログラム。コンピュータは単一のワークフローで定義されなくなり、プラットフォームになりました。
身近な例は、あなたのノートPCでメール、ゲーム、表計算ソフトが同じハードウェア上で動くことです。基礎となる考えは同じで、ハードはそのままに異なる保存プログラムを読み込んで実行します。
命令がメモリ内のデータとして扱われることで、ソフトウェアを書くのを助ける多層のツールを作ることが実用的になりました:
これらのツールは、プログラムが他の情報のように保存・移動・操作できるという前提に依存しています。これがソフトウェアを単発の産物から生態系に変え、コンピュータを柔軟な汎用機に変えました。
長い流れを一言で言えば:保存プログラムはコンパイラやOSを可能にし、よりよいツールがより挑戦的なプログラムを可能にし、現在では自然言語でアプリを記述すると実行可能なコードを生成するような抽象化の層まで到達しています。例えば、Koder.ai はチャットインターフェースとLLMやエージェントベースのワークフローを活用して、意図(「何をすべきか?」)から実行可能な命令(エクスポート・デプロイ・スナップショットでロールバック可能なソースコード)までの道筋を短縮する「vibe-coding」プラットフォームの一例です。
結果として変わらないのは循環の良さです:保存プログラムがより良いツールを可能にし、より良いツールがより野心的なプログラムを可能にして、コンピュータを柔軟な汎用機に変え続けているのです。
保存プログラムの考え方はコンピュータを柔軟にしましたが、同時にエンジニアが今でも語る実務上の制約を浮き彫りにしました:「フォン・ノイマン・ボトルネック」です。日常的には、これはCPU(働き手)とメモリ(倉庫)間の道路渋滞のようなものです。
典型的な保存プログラム設計では命令とデータがメモリに共存します。CPUは命令を取り出し、必要なデータを取り出し、結果を書き戻す—これらがしばしば同じ接続を通ります。もしその接続が情報を十分速く運べないなら、CPUは待つことになり、本来なら高速に計算できる力があっても性能は低下します。
このボトルネックは主に二つの要因から現れます:
CPUは秒間何十億回の演算を行えるかもしれませんが、メモリが命令とデータの安定した供給を提供できなければ、性能は最も遅い部分に制限されます。
この問題に対しては多くの工学的対処法があります:
これらは基礎となる“道路”を完全に消すわけではありませんが、混雑を和らげてCPUが待つ時間を減らすのに役立ちます。
保存プログラムの概念は博物館の展示品ではなく、日常のコンピューティングが柔軟であり続ける方法です。あなたのデバイスは新しいことをするために「配線し直す」必要はありません。単に違う命令をメモリに読み込み、それを実行するだけです。
スマホでアプリアイコンをタップすると、OSがそのアプリのコード(命令)をストレージからメモリに読み込み、CPUがそれを実行します。ラップトップでも同様です。サーバでは、数千の変化するワークロード(ウェブリクエスト、データベースクエリ、バックグラウンドジョブなど)をハードウェアを変えずに実行している様子が一層明白です。
ネットワークルーティング、ビデオデコード経路、写真補正、電力管理ポリシーなど、ハードウェアらしく見える機能もソフトウェア定義であり、ファームウェアやシステムソフトウェアで更新されることが多いです—新しい命令、同じデバイス。
PythonやJavaScriptのような言語は通常インタープリタや仮想マシン上で動きます。ソースコードをCPUが直接実行するのではなく、プログラムはバイトコードや内部命令の構造に翻訳され、それがメモリに保持され段階的に実行されます。JavaのJVM、.NET、WebAssemblyランタイム、ブラウザのJavaScriptエンジンはいずれも、命令がメモリ上のデータ構造になり、それをロード・移動・実行するという前提に依存しています。
命令は「ただの」情報なので、攻撃者はしばしば不正なコードをデータとして紛れ込ませようとします。これに対する防御としてメモリ保護、コード署名、実行不可メモリ領域などが存在し、信頼できないデータが実行可能命令として扱われるのを防いでいます。
ここまで述べてきた中心的な約束に戻ると:保存プログラムはソフトウェアによる柔軟性を約束します—同じハードウェアで新しい振る舞いを実現できるのです。
システムを見たり仕様を読んだりするときに、基本モデルを見分けるのに役立つ問い:
このようなバックグラウンドに優しい投稿をもっと読みたい場合は、/blog をご覧ください。
注: 現代の手法で「命令」を実行可能なシステムに変える実験(直接コードを書く場合や、Koder.aiのようなチャット駆動のビルドプラットフォームを使う場合を含む)を行うときは、学んだことを記録することを検討してください。Koder.aiは公開コンテンツや紹介に対するクレジット獲得プログラムも提供しており、さらに多くの実験やチュートリアル資金の調達に役立つかもしれません。
保存プログラム型コンピュータは、実行するプログラムの命令を、それが扱うデータと同じ内部メモリに保持する装置です。タスクを切り替えるには、ハードウェアを結線し直すのではなく、メモリに別の命令集合を読み込めば済みます。
保存プログラム以前は、多くの機械がプラグボード、パッチケーブル、スイッチの設定などで“プログラム”されていました。処理順序を変えるには何時間、場合によっては何日もかけて配線と再テストを行う必要があり、一本の誤配線が見つけにくい不具合を生むことがありました。
ここでの「メモリ」は、CPUが実行中に頻繁に読み書きする**高速な作業用ストレージ(現在のRAMに相当)**を指します。ディスクやSSDのような長期保存用のストレージとは異なり、プロセッサが次の命令を取り出したり中間結果を更新したりするための即時的な作業領域です。
EDVAC報告書(First Draft of a Report on the EDVAC)は、命令とデータが内部メモリを共有するという構成を明確に記述し、メモリ、制御部、演算部、入出力といった共通の語彙を広めました。その結果、他の研究チームが議論し比較し再利用できる共通のモデルが生まれました。
フォン・ノイマンの名前が強く結びついたのは、彼の記述が広く流通して参照しやすかったためで、単独で発明したからではありません。保存プログラムの考えは複数の研究者やチームが同時並行的に発展させたものです。
「フォン・ノイマン・アーキテクチャ」は一般に次のようなモデルを指します:
これは保存プログラムの構成を説明する便宜的なラベルであり、単一の歴史的機械や唯一の発明者を意味するものではありません。
フォン・ノイマン型では命令とデータが同じメモリに置かれ、通常は同じ経路でCPUに送られます。一方、ハーバード型では命令用とデータ用の記憶が分離され、しばしば経路も別です。現代の多くのシステムはソフトウェアからは単一アドレス空間に見えつつ、内部では命令キャッシュとデータキャッシュを分けるようなハイブリッド的な工夫を取り入れています。
「フォン・ノイマン・ボトルネック」は、CPUとメモリ間のデータ伝送路が制約となることで生じる性能上の制限を指します。対策としては、キャッシュ(CPU近傍の小さく高速なメモリ)、プリフェッチ(先読み)、並列化(複数コアや計算とメモリアクセスの重ね合わせ)などが使われますが、根本的な制約を完全に消すわけではありません。
命令がメモリ上の情報として扱われるため、動作を変えたいときはソフトウェアを変更すればよく、ハードウェアを作り直す必要はありません。これが、同じデバイスでアプリを切り替えたり、ファームウェアやOSの更新で新機能を追加したりできる理由です。
命令が単なるデータとして扱われるため、攻撃者が信頼できないデータを実行可能なコードとして紛れ込ませることを試みるケースがあります(例:コードインジェクション)。現代の防御策としては、メモリ保護(実行不可領域)、コード署名、その他データと実行可能コードの分離手法があります。