コンピュータの仕組みとは

コンピュータは、入力されたデータを処理し、その結果を出力する装置です。その内部では、CPUや主記憶装置、入力装置、出力装置などが役割を分担し、主記憶装置に格納されたプログラムの命令を実行しています。
この記事では、コンピュータの基本構成から、CPU内部のレジスタ、命令の実行過程、命令形式、アドレス指定方式、CISCとRISCまで、コンピュータがどのようにプログラムを実行しているのかを順に解説します。
コンピュータの基本構成
一般的なコンピュータの基本機能は、制御装置、演算装置、記憶装置、入力装置、出力装置の5つに分けて考えられます。制御装置と演算装置を中心とする処理装置は、一般にCPU(Central Processing Unit:中央処理装置)やプロセッサと呼ばれ、演算処理と各装置の制御を担います。

入力装置はキーボードやマウスなどからデータを取り込み、出力装置はディスプレイやプリンタなどを通して処理結果を外部へ伝えます。記憶装置には、処理中のプログラムやデータを保持する主記憶装置と、データを継続的に保存する補助記憶装置があります。
コンピュータの基本構造を理解する代表的なモデルが、ノイマン型コンピュータです。プログラムとデータを主記憶装置に保持するプログラム内蔵方式を採用し、CPUが命令を順に取り出して実行する逐次制御方式を基本とします。
仕組み・基本的な考え方
プログラム内蔵方式と逐次制御方式
プログラム内蔵方式では、実行するプログラムと処理対象のデータを主記憶装置に格納します。処理内容を変更するときは、ハードウェアそのものを組み替えるのではなく、実行するプログラムを変更することで異なる処理に対応できます。
プログラムを実行すると、CPUは次に実行する命令の位置を参照し、主記憶装置から命令を取り出して解読します。その後、必要なデータを読み出して処理を行い、原則として次の命令へ進みます。分岐命令では次に実行する命令の位置を変更します。この一連の処理を繰り返すことで、プログラムが実行されます。
CPUの構成と主なレジスタ
CPUは、主に制御装置と演算装置から構成されます。制御装置は命令を読み出して解読し、CPU内部や主記憶装置などへ必要な制御信号を送ります。演算装置は、加減算などの算術演算や比較・論理演算を実行します。
CPU内部には、処理に必要な情報を一時的に保持する高速・小容量の記憶領域であるレジスタがあります。代表的なものとして、次に実行する命令のアドレスを保持する命令アドレスレジスタ(IAR)、読み出した命令を保持する命令レジスタ(IR)、演算結果や演算途中のデータを保持するアキュムレータ、アドレス計算に使うインデックスレジスタ、計算やアドレス指定など多用途に使う汎用レジスタ(GR)があります。このほか、基準となるアドレスを保持するベースレジスタや、スタックの位置を管理するスタックポインタなども使われます。
命令アドレスレジスタは、プロセッサによってプログラムカウンタ(PC)などの名称で呼ばれることもあります。
命令の取り出しと実行
CPUによる命令実行は、命令を主記憶装置から取り出すIサイクル(フェッチ)と、取り出した命令を解読して処理を行うEサイクル(実行)に分けて考えることができます。
Iサイクルでは、まず命令アドレスレジスタが示す番地を主記憶装置へ送り、その番地にある命令を読み出して命令レジスタへ格納します。命令を取り出した後は、命令アドレスレジスタをその命令の長さに応じて進め、次に実行する命令の番地を指すようにします。
Eサイクルでは、命令レジスタ内のオペレータ部(命令コード)を命令解読器で解読し、必要に応じてオペランド部のアドレス情報から有効アドレスを求めます。その有効アドレスに基づいて主記憶装置からデータを取り出し、命令を実行した後、演算結果をレジスタまたは主記憶装置へ格納します。分岐命令では、次に実行する命令のアドレスそのものを変更します。

CPUの基本動作は、大きく見れば「命令を取り出す(フェッチ)→命令を解読する(デコード)→必要なデータを取り出す→命令を実行する→結果を格納する」という処理の繰り返しです。
具体例
アドレス指定方式の違いは、命令中に同じ「100」という数値が書かれていても、それを値として使うのか、番地として使うのかで理解すると分かりやすくなります。
即値アドレス指定では、オペランド部の内容そのものが処理対象のデータです。たとえば100を指定した場合、汎用レジスタGR0には値100が格納されます。
直接アドレス指定では、オペランド部の内容を主記憶装置上の番地として解釈します。100番地に200が格納されていれば、100番地を指定した命令によってGR0へ読み込まれる値は200です。
間接アドレス指定では、指定した番地に格納されている値を、さらにアクセス先の番地として使います。100番地に200が格納され、200番地に300が格納されているなら、100番地を間接指定することで最終的に値300を読み出します。
指標アドレス指定(インデックス修飾)では、命令中のアドレスにインデックスレジスタの内容を加算して有効アドレスを求めます。たとえば、アドレス100にインデックスレジスタGR1の値2を加えると、有効アドレスは102になります。102番地に220が格納されていれば、GR0へ読み込まれる値は220です。

命令の形式とアドレス指定
1つの機械語命令は、基本的に「何をするか」を表すオペレータ部(命令コード)と、「何を対象にするか」を表すオペランド部(アドレス情報)から構成されます。オペレータ部では加算、減算、比較、分岐などの処理を指定し、オペランド部ではアドレス指定方式やアドレス修飾に使うレジスタ、主記憶装置のアドレス、汎用レジスタの番号などを指定します。
命令形式は、オペランドの個数によって0アドレス方式、1アドレス方式、2アドレス方式、3アドレス方式などに分類できます。0アドレス方式ではスタック上のデータを処理対象とし、1アドレス方式では主記憶上のデータとアキュムレータを使います。2アドレス方式では2つのオペランドを指定し、演算結果は一般に第1オペランドで指定された場所へ格納されます。3アドレス方式では、たとえば「C ← A + B」のように2つの入力と結果の格納先を1命令の中で指定できます。
同じ命令形式でも、オペランドの解釈方法によって実際に参照するデータは変わります。即値、直接、間接、指標などのアドレス指定方式は、限られた命令形式でさまざまなデータ配置に対応するための仕組みです。
何に使われる?
ここまでの仕組みは、特定のアプリケーションだけに使われるものではなく、CPUがプログラムを機械語命令として実行するときの基礎にあります。OSやアプリケーション、組込み機器の制御プログラムなども、最終的にはCPUが実行できる命令列として処理されます。
レジスタ、命令形式、アドレス指定方式を理解すると、アセンブリ言語やコンパイラが生成する機械語の動作を追いやすくなります。また、低レイヤのプログラミングや組込みシステムでは、CPUと主記憶装置の間で命令やデータがどのように移動するかを理解する基礎になります。
関連する技術・概念
CISCとRISC
CPUがどのような命令を、どのような形式で扱うかを定める仕組みを命令セットアーキテクチャ(ISA:Instruction Set Architecture)といいます。その設計思想を説明する際によく用いられる対比が、CISC(Complex Instruction Set Computer)とRISC(Reduced Instruction Set Computer)です。
CISCは、比較的複雑な命令や多様なアドレス指定方式を備え、1つの命令で多くの処理を表現しやすくする方向の設計思想です。一方、RISCは、命令を比較的単純で規則的な形式に整理し、命令の解読や実行を効率化しやすくする方向の設計思想です。
ただし、CISCとRISCは現代のCPUを完全に二分する分類ではありません。また、命令セットの設計と、CPU内部でその命令をどのような回路や処理手順で実行するかというマイクロアーキテクチャは区別して考える必要があります。CISCだから必ずマイクロプログラム制御、RISCだから必ずワイヤドロジック制御になる、という一対一の対応関係があるわけではありません。
マイクロプログラム制御とワイヤドロジック制御
CPUの制御装置を実現する代表的な方法に、マイクロプログラム制御方式とワイヤドロジック制御方式があります。
マイクロプログラム制御方式は、CPU内の基本動作をマイクロ命令として記述し、制御記憶に格納されたマイクロプログラムによって各部を制御する方式です。制御内容をプログラムとして表現するため、一般に複雑な制御を構成しやすく、変更や拡張にも対応しやすいという特徴があります。
ワイヤドロジック制御方式は、命令実行に必要な制御を論理回路として実現する方式です。制御をハードウェアで直接実現するため高速化しやすい一方、制御内容を変更するには回路設計の変更が必要になります。これらはCPU内部の制御方式に関する分類であり、CISCとRISCという命令セットの設計思想とは別の軸にあります。
パイプライン処理
パイプライン処理は、命令のフェッチ、デコード、実行などを複数の段階に分け、異なる命令の各段階を重ね合わせて進めることで、単位時間あたりに処理できる命令数を増やす手法です。規則的な命令形式はパイプラインを設計しやすくするためRISCの考え方と相性がよいとされますが、パイプライン処理そのものはRISCだけに限定された技術ではありません。
まとめ
一般的なコンピュータは、制御装置、演算装置、記憶装置、入力装置、出力装置という5つの基本機能から構成されます。その中心となるCPUは、制御装置・演算装置と各種レジスタを使いながら、主記憶装置に格納された命令を取り出し、解読し、実行します。
CPUの動作を追ううえでは、命令のフェッチと実行、命令コードとオペランド、そして即値・直接・間接・指標といったアドレス指定方式が重要です。さらに、CISCとRISCのような命令セットの設計思想と、マイクロプログラム制御やワイヤドロジック制御のような内部実装の方式を区別すると、コンピュータアーキテクチャをより正確に理解できます。