レジスタ、メモリ、命令: 命令セットアーキテクチャ
命令セットアーキテクチャ (ISA) は、コンピュータの最も低レベルの抽象化です。 ISAは、可能な限りハードウェアに近いように設計されていますが、 多くの場合、実際にはISAを直接コードする開発者はほとんどおらず、 より高レベルのプログラミング言語は通常、ISAとは異なる方法でコンピュータを抽象化します。 ただし、ISAの理解はコンピュータハードウェアの動作の理解の出発点となり、 高レベルのプログラミング言語やソフトウェアアプリケーションの設計上の多くの選択肢の説明にも役立ちますので、 ここで紹介されています。
x86、ARM、MIPS、RISC-VなどのさまざまなISAが存在します。 それぞれが少しずつ異なる (またはCISC アーキテクチャファミリーの場合はかなり異なる) が、 それらに共通するいくつかの概念も存在します。 これらの概念は、ほとんどすべてのコンピュータハードウェアに適用される基本的な抽象化であり、 このセクションではそれについて説明します。
レジスタ、メモリ、命令: コンピュータに最も広範に適用される抽象化
ほぼすべてのISAは、次の概念を使用しています。
- データを保持するための有限な数の レジスタ が存在します。
- より多くのデータを保持するための(仮想的に無限の) メモリ が存在します。 メモリの各位置にはデータを保持することができ、 それには関連付けられた アドレス があります。 データにアクセスするためにそのアドレスが使用されます。
- レジスタまたはメモリをいくつかの方法で変更する有限なセットの 命令 を実行する "プロセッサ" がサポートされています。
- 命令はメモリに格納され、順番に実行されます。
- 特別なレジスタ(通常は "プログラムカウンタ (PC)" または "PC" と呼ばれる)があり、 そのレジスタはメモリ内のアドレスを保持します。 各時点で、"プロセッサ"はそのメモリアドレスのデータを読み取り、そのデータを命令と解釈して実行し、その後、PCをいくつかの方法で更新します。
上記の概念にはいくつか重要な点があります。
- レジスタはメモリと比べて非常に限られた量のデータしか保持できません。 ほとんどのISAでは、レジスタの数は100未満であり、 レジスタ全体で保持できるデータの総量は1メガバイト(MB)を超えることはありません。 対照的に、メモリははるかに大きいです。 モダンなコンピュータは通常、4から数百ギガバイト(GB)のメモリを搭載しています。 携帯電話でも通常、4ギガバイト以上のメモリが搭載されています。
- 特定の時点からはじまるコンピュータの動作は、 レジスタ(PCを含む)とメモリに格納されたデータによって完全に決まります。 レジスタとメモリをプログラムの "状態 (state)" と考えることができます。 その状態によってプログラムの動作が完全に決まります。
- ISAでサポートされる命令は一般に非常に単純な操作です。 (CISC、または "複雑な命令セットコンピュータ" とは、より複雑な命令をサポートする一群のISAですが、 それらの機能は完全なコンピュータプログラムと比較しても非常に限定されています)。 例えば、「レジスタ5とレジスタ11のデータを合計し、その結果をレジスタ0に格納する」、 「メモリアドレス122の値をレジスタ1に読み込む」、または「PCを40メモリアドレス分進める」などです。 これらの命令は完全なコンピュータプログラムではありません。 これらはより大きなプログラムの構成要素として使用されます。 これらの単純な命令(プログラミングと呼ばれる)を組み合わせることで、ほとんど何でもできるプログラムを作成できます。
なぜレジスタが必要なのですか?
レジスタがなぜ必要なのか疑問に思うかもしれません。 レジスタとメモリの両方がプログラムの "状態" の役割を果たすので、なぜメモリだけを使用できないのでしょうか? レジスタは非常に限られた量のデータしか格納できませんが、非常に高速です。 一方、メモリは大きいが、レジスタに比べて遅いです(レジスタに比べて遅い)。 その結果、頻繁にアクセスする必要のあるデータをレジスタに保持し、残りのデータをメモリに格納するのが一般的な方法です。
これはISAがハードウェアに近い例です。 一般的に、抽象化は "一般的で抽象的な特性" ですが、 それらは通常、適用される基になるオブジェクトに依存し反映されます。
その他のISA
ここで紹介されている内容は、ほとんどのISAに適用できますが、 コンピュータを異なる方法で抽象化するISAも存在します。 例えば、WebAssembly(WASM) は、レジスタを持たないスタックベースのアーキテクチャです。
コンピュータプログラムはどのように実行されるのですか?
ペンでノートブックを持っている人を想像してください。 最初は、ノートブックはあるページにあります。 それから、それぞれの時間点で、人はページを読み、 そのページで何かを行います(計算を行い、結果を覚えたり、別のページに何かを書いたり)。 それには、そのページに書かれているように行動し、別のページに移動し、同じプロセスを続けます。
これは、プログラムがコンピュータで実行される方法の良い例です。 人とはプロセッサで、ノートブックとはメモリであり、 人の脳の記憶はレジスタです。
前述のように、ISAは非常に限られた数の限定機能の命令のみをサポートします。 これらの命令は、より複雑なソフトウェアアプリケーションの構築要素として機能します。 ほぼすべてのソフトウェアアプリケーションは、コンピュータハードウェア上で実行される際には、 数百から数百万の単純なISA命令に分解されます。 基本的に、ISAで定義されるプログラムの実行方法は以下のようなものです:
- 最初に、メモリとレジスタはいくつかの値で初期化されます。 通常、メモリにはすべての命令が格納されている特別なセグメントがあります。 そのセグメントに格納された命令が「プログラム」です。
- 各時点で、プロセッサはPCで指定されたメモリアドレスのISA定義命令を読み取り、実行します。 (計算を行い、結果をレジスタに書き込むか、特定のメモリアドレスにデータを書き込むなど)。 そして、PCを更新します(通常は次の命令のメモリアドレスになりますが、他の場所にもなりえます)。
- このプロセスは、プログラムが終了するまで繰り返されます。
graph TD
start --> read-instruction
read-instruction --> execute-instruction
execute-instruction --> update-PC
update-PC --> read-instruction
複数のプログラムがある場合はどうなるのですか?
同じコンピュータ上で複数のプログラムが実行される場合、何が起こるのでしょうか? 同じメモリ領域を使用するため、お互いに干渉しませんか? そして、それらはどのように実行されるのですか? 一つずつ順番に実行されるのですか?同時に実行されるのですか?
簡単に答えると、オペレーティングシステムはこれらすべての問題を解決する別の抽象化レイヤーを提供します。 単純に言えば、オペレーティングシステムはコンピュータハードウェアを仮想化し、 同時に複数の独立したコンピュータが実行されているかのような錯覚を作り出します。 各プログラムにはそれぞれ独自の「仮想」コンピュータが割り当てられます。 プログラムの視点では、このコンピュータには他の誰もいないため、干渉はありません。
ただし、オペレーティングシステムがどのようにその錯覚を作り出しているかは、本節の範囲外です。
結論
このセクションでは、コンピュータの最も低レベルの抽象化である命令セットアーキテクチャ(ISA)について説明しました。 高レベルのプログラミング言語など、他のコンピュータの抽象化と比較して、ISAはハードウェアに近く、同時に人間にとってはより使いにくいです。 しかし、開発者は通常、異なる抽象化を使用してプログラミングを行いますが、 ISAの理解はコンピュータの動作の理解の良い基盤となります。
ほぼすべてのISAには、一連の レジスタ、メモリ、およびサポートされた単純な 命令 があります。 1つの特別なレジスタは、 プログラムカウンタ (PC) と呼ばれます。 プログラムの実行方法は基本的に "PCの指す命令を取得して実行し、PCを更新し、繰り返す" というものです。 ISAの命令は、より複雑なソフトウェアアプリケーションの構築要素として機能します。 ほぼすべてのソフトウェアアプリケーションは、ハードウェア上で実行される際には、数多くの単純なISA命令に分解されます。
おめでとうございます、コンピュータハードウェアの動作原理が理解できました! 実際のコンピュータハードウェアはISAよりも複雑ですが、これで十分な近似です。
次に、C/C++ や Rust などのほとんどの低レベルプログラミング言語で見られる ISAに基づく高レベルの抽象化について紹介します。
AI Prompt Samples
このセクションのトピックについてさらに学びたい場合は、ChatGPTなどのAIに相談してみてください。
始めるためのいくつかのサンプルプロンプトを紹介します:
- ARM アーキテクチャを簡単に説明して、その命令について説明できますか?
- ARM アセンブリコードの例を示して、その動作について説明してください。
- CISC と RISC の違いは何ですか?
- 命令セットアーキテクチャはチューリングマシンとどのように比較されますか? チューリングマシンにはレジスタがないのはなぜですか? ISAにはレジスタがあるのはなぜですか?
- 現在、最も人気のある命令セットアーキテクチャは何ですか?