今やコンピュータは社会のすみずみに行き渡っています。車や家電製品の中にもコンピュータは内蔵されています。スーパーコンピュータは膨大なデータを高速処理して、気象予測をはじめとする情報を提供しています。学校の授業でもパソコンを使ったプログラミング教育が行われています。そのような「コンピュータはどういうしくみで動いているのだろう?」という疑問をもつのは自然なことでしょう。しくみを理解すれば、コンピュータの振る舞いの意味を理解でき、より高度な使い方もできるようになります。
はじめの一歩は足し算から
まず簡単な1+2=3
の計算から始めましょう。この計算を電卓で行うには、次のようにキーを叩きます。
C 1 + 2 =
足したい数字が100個、1000個、……と増えれば足し算の操作を100回、1000回繰り返すことになります。これはすごく大変です。ということで、この計算手順を、メモリに記憶するところから本格的なコンピュータはスタートしました。例えば、1+2=3
の計算を行うには、図1 に示すようにメモリの0~3番地に置いた命令をひとつずつ読み出し、命令の意味を解釈して、実行します。入力の1と2は、4、5番地に置き、計算結果は6番地に書き込みます。
図1 メモリに置いた命令とデータ
コンピュータの中では、これらの命令やデータをすべて0と1で表現します。0と1で表現した命令を機械語 と呼びます。また、数値データや音声、画像なども同様です。
図2 は、本書でビットコンタ と名付けたモデルコンピュータで、図1 のプログラムを0と1で表現したものです。16ビットの先頭4ビットが、読み出す、加える、書き込む、停止するといった操作の種類を表しています。
図2 ビットコンタの機械語プログラム
先頭の0番地から命令を1つずつ読み出し、その指示内容を解釈し、実行することによってコンピュータは自律的に動作します。これをプログラム内蔵方式 と呼びます。先に挙げた様々なコンピュータもこの方式によって動作しています。
電磁石を使ってコンピュータを作ろう
次に、0と1で表現された命令データを処理するにはどうしたらよいかを考えてみましょう。電磁石は、小学校5年の理科で勉強しますが、鉄くぎなどを導線でぐるぐる巻いたもので、導線に電流を流すと磁石になります。これを使って、図3 の回路を作ってみましょう。赤い点線で囲んだ部分に電磁石と、バネで右に引っ張られたスイッチがあり、これをリレー と呼びます。左側の回路にはスイッチAと電池がつながれており、右側の回路にはバネで右に引っ張られたスイッチの他に、電池と豆電球がつないであります。図3 ではスイッチAは切れているため、電流は流れず、したがって右側の回路のスイッチも離れたままで豆電球は点きません。
図3 電磁石によってスイッチを開閉するリレーのしくみ
ここでAを押すと図4 のように電流が流れ、電磁石の力が働いてスイッチが閉じ、右側の回路に電流が流れて豆電球が点きます。赤い線は、電流が流れていることを表します。Aを押すことを「A」で、豆電球が点くことを「L」で表したとき、AとLは論理的に同じことを表すことから、L=Aとなります。つまり、Aが1ならLも1です。
図4 スイッチAを閉じると豆電球が点く
ここで、右側の回路のスイッチを図5 のように、スイッチAが離れて電磁石の力が働かないときにバネの力で閉じて豆電球が点くように変えてみましょう。先ほどとは逆に、Aを押して電流が流れ電磁石の力が働くと、右側の回路のスイッチが引っ張られて開き、電流は流れず、豆電球は消えます。
図5 リレーによるNOT回路
AとLの関係も先ほどとは逆に、Aを離すと豆電球が点く、となります。Aを離すことをĀで表すと、L=Āです。Aに対するĀの関係を否定(NOT) と呼びます。
ここで応用問題として、図6 の回路の動作を考えてみましょう。AとBのスイッチを押す、離すの組み合わせは4通りあるので、各場合のスイッチの状態、電流の流れ方を考え、豆電球が点くかどうかを考える問題です。
図6 NAND回路の振る舞いを考えてみよう
答えは、「 A,Bを共に押した時だけ、真ん中の回路に電流が流れ、電磁石の力で右側のスイッチが開いて、豆電球が消える」です。この回路全体は、AとBを共に押したときだけ豆電球が付く左側の回路(ANDと呼ぶ)の出力を、図5 のNOT回路に入力したもので、NAND回路 (NOT+ANDの意味)と呼びます。
NAND回路があれば、コンピュータを構成する任意の論理回路は構成できます。つまり、電磁石を活用したリレーを用いてコンピュータを構成することが可能です。図7 は、このような論理素子を用いて構成したビットコンタのハードウェア構成を示しています。このコンピュータにおいて機械語プログラムが実行される様子や、コンピュータを構成するのに必要となるディジタル回路については、算数の知識だけで分かるように本書の中で解説しています。
図7 ビットコンタのハードウェア構成
アセンブリ言語を使って機械語プログラムを作ろう
コンピュータが構成できたなら、次の仕事はこのコンピュータの上でプログラムを作り、動作させることです。とは言っても、いきなり機械語でプログラムを作るのは大変なので、図8 に示すようなアセンブリ言語 を用いて作成します。アセンブリ言語により作成したプログラムは、アセンブラ により図2 に示した機械語プログラムに変換します。
図8 ビットコンタのアセンブリ言語プログラム
こうしてハードウェアをどう構成するかを理解し、さらにハードウェア上でソフトウェア、つまり機械語プログラムがどのように実行されるかを理解することによって、筋の通ったコンピュータのしくみを理解することができます。
本書について
本書では、以上のような流れに沿って、コンピュータの基本⽅式から始めて、ハードウェアとソフトウェアの階段を登りながら、筋の通った理解ができるように⼼掛けています。また、コンピュータのコア部分である CPU とメモリに絞り、算数の知識だけあれば読めるように⼯夫しています。さらに本書の内容に即したアセンブラとシミュレータから成る付属システムを⽤意しました。アセンブリ⾔語のプログラムが機械語プログラムとなり、ハードウェアで実⾏される様⼦をシミュレータで観察することにより、理解を深めて欲しいと思います。⾼校教科「情報」などでのプログラミング教育の基礎にもなると思います。
なお、先に著した『コンピュータのしくみを理解するための 10章 』(技術評論社、2005)は、本書より幅広くコンピュータシステムの全体像を⽰しています。例えば、本書にはない、様々な機械命令の定義法、浮動⼩数点数の表現や演算法、⼊出⼒装置とその制御、割り込みの概念、オペレーティングシステム、⾼⽔準⾔語によるプログラミングとコンパイラの働き、データ構造とアルゴリズムなども取り上げています。本書を理解したらぜひ読んで欲しい本です。
著者プロフィール
馬場 敬信(ばば たかのぶ)
1970年京都大学工学部数理工学科卒業、1978年工学博士(京都大学) 。2013年まで宇都宮大学大学院工学研究科情報システム科学専攻教授を務め、名誉教授となる。2020年まで同大学客員・特任教授を務め、現在、TBC学院情報処理学科顧問。並列処理、コンピュータアーキテクチャを中心にコンピュータシステムに関する教育と研究を行う。情報処理学会フェロー、電子情報通信学会フェロー 著書『Microprogrammable Parallel Computer』( The MIT Press, 1987) 、『 コンピュータアーキテクチャ』( オーム社、第1版1994~第5版2020)など。著作やセミナー等を通してこれからを担う若い人達の役に立てれば幸いと思っている。趣味は、テニス。