![]() |
コンピュータのしくみ (手動計算機) |
基本論理回路を使って 加算回路 や 記憶回路 を作ることができる、
ということは理解できたと思います。
しかし、 演算と記憶はコンピュータの基本的な要素とはいえ、 本当にこんなのでコンピュータ (計算機) ができるのか、
心配です。
そこでまず、演算回路と記憶回路とスイッチを使って、手動の計算機を作ることを考えてみます。
下図で "FULL ADDER" と書かれている四角形は演算回路です。
下にある "ADD"、"AND"、"NOT" などのボタンで演算内容を切り替えられますが、
図では最初 「加算回路」 がつながれています。
8 ビットの計算ができるように、 8 個並んであります。
その様子は図の右下にある "8 bit" というボタンをクリックすると見ることができます。
縦長の長方形にはアキュムレータやレジスタ、メモリといった名前がついていますが、すべて記憶回路で、
これも 8個が一組になって 8ビットのデータを記憶できるようになっています。
上部の左側が入力信号、右が出力信号で、下のスイッチを ON にすると入力信号のデータが記憶され、
出力側に現れます。
同じ記憶回路なのに名前が違うのは、多少機能や役割等が違うためで、いずれもデータを記憶する、
いわば 「メモ用紙」 のようなものです。
中でもアキュムレータは最も頻繁に使われるレジスタ、 いちばん使い易いメモ用紙です。
図のいちばん上、横に走っている線をバス (データバス) といいます。
各種のレジスタやメモリがこの線を共用して、まるで乗り合いバスのように信号を伝送しているからです。
レジスタ類やメモリの出力のスイッチを ON にすると、 データをバスに乗せることができます。
どの信号をバスに乗せるかを決めることになるので、 これを 「〜を」 のスイッチと呼ぶことにします。
また、下にあるスイッチを ON にすると、バスのデータを記憶します。
これを、 どのレジスタやメモリに記憶させるかを決める、 「〜に」 のスイッチと呼ぶことにします。
更にその下の 0 が並んでいる枠は、レジスタ類やメモリのデータを表しています。
枠内をマウスでクリックすると、 0 は 1 に、 1 は 0 に変わります。
たとえば、 3 番地のメモリの枠内をクリックして、 "01101011" など、
何でも構いませんが、値を変えてみてください。
次に、 3 番地のメモリの出力、 「3を」 のスイッチをクリックします。
これで、 3 番地のデータが、バスにつながります。
これを、 たとえばアキュムレータに記憶させるには、 「Aに」 のスイッチをクリックします。
アキュムレータがこれを記憶して、 3 番地のメモリと同じ値になります。
(「Aに」 のスイッチをクリックしている間はデータが伝送される経路が表示され、 離すと消えます。
なお、 右下の "mode" をチェックすると、 「〜を」 スイッチを ON にしたときの表示モードが変わります。)
とりあえず、加算も試してみましょう。
今度は 0 番地を、たとえば "00101110" にして、 「0を」 のスイッチをクリックします。
次に、「Rに」のスイッチをクリックすると、レジスタの値は "10011001" に変わります。
01101011、00101110、10011001 をそれぞれ 10 進数にすると 107、46、153 です。
107 + 46 = 153 という計算ができたわけです。
しかし実は、 これは反則です。
なぜなら、実際にはメモリのデータを、
直接 1 ビットずつ書き換えたりすることはできないからです。
ヒトが操作できるのは、 図の左端にある入力ポートだけです。
入力ポートはデータを外部からコンピュータに入力するための入り口です。
普通はキーボードなどが接続されますが、 ここでは 1 ビットずつスイッチで 0 と 1 を切り替える、
というイメージです。
正式 (?) に 107 + 46 を計算するには、
まず入力ポートを "01101011" にしておいて、
「I を」、 「0に」、 とスイッチをクリックして、 0 番地に "01101011" を書き込みます。
次に入力ポートを "00101110" に変えて、 「I を」、 「Aに」、 でアキュムレータに "00101110" を書き込みます。
最後に、「0 を」、 「Rに」、 とクリックすれば完了です。
どうやら、 演算回路と記憶回路とスイッチがあれば、 計算機はできそうです。
(なお、 少し慣れてくれば、 「〜を」 や 「〜に」 のスイッチではなく、
レジスタやメモリの図形 (四角形) をクリックしても図のスイッチが動きます。)
さて、下に並んでいる 5 つのボタン、 "IN" "OUT" "READ" "WRITE" "CALC" は、
この計算機 (手動) を、もう少し 「コンピュータ」 に近づけるための仕掛けです。
入力ポートのデータをアキュムレータに読み込む、 「I を」、 「Aに」、 という操作を "IN" と呼ぶことにします。
このボタンをクリックすると 「I を」 と、 しばらくして 「Aに」 のスイッチが自動的に動きます。
それに伴ってデータの経路も表示され、 クリックを離すと消えます。
アキュムレータのデータを、右端の、出力ポートに接続されているレジスタに書き込むことを "OUT" と呼ぶことにして、
"OUT" のボタンで 「A を」 と 「Oに」 のスイッチが動きます。
(出力ポートは計算機の中のデータを外部に出力するための、データの出口です。)
"READ" はメモリのデータをアキュムレータに読み込みます。
"WRITE" は逆に、アキュムレータのデータをメモリに書き込みます。
"CALC" はアキュムレータとメモリのデータを演算 (ここでは加算や AND、NOT などの論理演算) します。
メモリの番地は 0 番地 〜 3 番地 の前にあるラジオボタンで変えることができます。
"CALC" の処理では、2 度 "CALC" ボタンをクリックします。
最初は演算処理を行うためで、演算の結果はレジスタに書き込まれます。
2 度目はこれをアキュムレータに転送するためで、
こうすることによって演算結果は常にアキュムレータに残ることになります。
"IN" 〜 "CALC" のボタンをクリックすると、 まず 「〜を」 のスイッチが ON になり、
しばらくして 「〜に」 のスイッチが ON になります。
(「〜に」 のスイッチが ON になるまでの時間は "<<"、 ">>" ボタンで調節できます。)
クリックを離すとデータの電送経路の表示が消えます。
このボタンを使って先程と同じ計算をするには、
入力ポートを "01101011" にして "IN" をクリックして
(アキュムレータに "01101011" を書き込んでおいて) "WRITE" します。
次に入力ポートを "00101110" に変えてもう一度 "IN"、 そして今度は "CALC" で計算を実行し、
もう一度 "CALC" をクリックして結果をアキュムレータに転送します。
最後に "OUT" をクリックして、 計算の結果を出力します。
出力することによって、 ディスプレイに表示されるなど、
何らかの形でヒトが処理結果を見ることができるようになります。
このようにして家族の体重、たとえばお父さんは 67kg、お母さんは 53kg、私は 48kg、弟は 45kg、
この合計を計算してみてください。
まずメモリに 01000011、 00110101、 00110000、 00101101 を書き込んでおいて、
順に加算していけばいいのですが…。
この計算機にはメモリが 4 組しかないので 4 人の合計しか計算できませんが、
メモリを増やせばたくさんのデータの集計ができるようになります。
しかし、それにしても面倒ですね。
ややこしいボタンを何度も何度も押さなくてはなりません。
人が操作したのでは時間もかかるし間違いも起こります。
それならいっそのこと、 "IN" や "OUT" といった処理も 2進数のコードにして、
そうした処理の手順もメモリに記憶させておいて、
計算機はそれを一つずつ読み出しながら自動的に処理を進めるようなしくみを付け加えてみたら…。
なんだかとても素敵なものができそうですが、
上のような 「手動式計算機」 に、 自動的にスイッチを動かすしくみを付け加えたものが 「コンピュータ」、
それを動かすために2 進数でコード化された一連の操作の手順が 「プログラム」 です。