📌

コンパイラと、PCの動作原理をざっくり理解

に公開

コンパイラは、PCにしてほしいことを人がわかりやすく書けるようにするもの。
コンパイラがなければ、人は、パソコンがわかる言葉で命令を書く必要がある。

命令用の信号として、0を足し算、1が引き算という仕様が決まっていたとする。
その後ろに足す2つの数値を記入する場合
(わかりやすいように10個の0の入力を標準とし、その中の1番目を1にしたら、1として扱い、3番目を1にしたら3を入力したことにする)
1 + 2は
0 00 00 00 00 01 00 00 00 00 10
となる。
見にくい。

足し算の処理をADDと書き、引き算の処理をSUBと書くとき、ADDを0,SUBを1と変換する。
00 00 00 00 00 は0
00 00 00 00 01 は1
00 00 00 00 10 は2と書いてよいことにし、0から10までの変換を定義した場合、

0 00 00 00 00 01 00 00 00 00 10は、
実際は空白もないので、
000000000010000000010
は、
ADD12で表記できる
見やすい。

これがコンパイルするということであり、コンパイラのありがたみである。

ここからは実際に数値を電気信号として扱うにはどうしたらいいか、
足し算をするために必要な回路について説明する。

情報を電気信号に変換するとき、
ON、OFFしか表せない。
ON、OFFを便宜上1,0に対応させるとき、
一つの電気スイッチでは、二つの状態しか表せない。

つまり、2を表せない。

そのため、数値を表す場合、複数のスイッチを使うことになる。

2 は 2つのスイッチで
表す。スイッチの状態を0,1で表すとき、

00
01
10
11

の状態があり
それぞれに0123
の数値を便宜上割り振る。

これは、どう割り振っても問題ないが、人間が認識しやすい都合上
連番で割り振るものとする。

2はON、OFFのスイッチの世界では、
10とあらわすことになる。

先ほど、
ADD12

と書いたが、

コンパイラを以下の定義に変更する。

命令 数値とし、
数値は、1個前の演算結果を取得するという仕様にする。
基準を0とする。

そうすると、

ADD1
ADD2
と書ける。

0 01
0 10

と書き換えられ、
命令を最初のスイッチ、
数値を2番目3番目のスイッチで表す仕様とすると、

001
010

で足し算の命令を電気としてあらわすことができる。

000000000010000000010よりは簡潔に表せている。

論理回路

論理回路は、情報を受け取り、その情報に従って情報を返すもの。

コンパイルされたものを処理するためのもの。
コンパイルされたものがどう実行されるかのイメージをつかむとコンパイラが何をしていて、
コンピュータがどういったものなのか理解できるため、
多少嘘が混じってはいるが、解説する。

厳密なものは自身で調べるようにしてください。

理解の上で助けになるよう誇張した表現をすることをここに断っておく。

まず、すべての論理回路は、基本的にすべての入力について、すべての出力パターンを定義することで論理を形成する。

つまり、魔法ではなく、力技であるという理解をするとよい。

まず、一つの情報(ON OFF)を受け取る場合、

0 1
のどちらかしか情報のパターンはない。

これに対して、出力できるパターンは、

0 1 の情報に対して、

0 0
0 1
1 0
1 1
である。

最初の0 0の意味は、
0 の入力で 0 を返し、
1 の入力で 0を返すものという意味。

入力が変化したにもかかわらず出力が変化しないものは、意味がないので
省略する。

0 1の入力に対して、

0 1
1 0

を考慮する。

0 1 は入力と変わっていない。
これはマイクラでいうところのリピーターという部品
ケーブルを延長するために使われるが、回路としての意味はない。

論理回路の名前はない。

1 0

これは入力に対して、違う出力をする。

これを便宜上、否定するという意味で論理回路では、NOTという命名をしている。

二つの入力の場合、パターンは多くなる。

00 01 10 11について、

0 0 0 0
0 0 0 1
,
,
,

1 1 1 1

をすべていったん考慮する。

先ほどと同様、入力に対して変化のない出力をする回路は無視する。

いったん、仕分けする。

4つの状態に対して、

0、1、2、3、4個のONを持つ回路で分離する。

0,4個は、すべて同じなので見ない。

1,2,3を見る。
1個、3個は、逆にしただけなので、1個、2個を考慮する。

そうすると、

0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

1 1 0 0
0 1 1 0
0 0 1 1
1 0 0 1
0 1 1 0
1 0 1 0
0 1 0 1

を考慮すればよさそう。

0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

は、
00
01
10
11に対応した出力を返すので、
同一のものとみなせる。

便宜上、
0001を参照し、
二つの入力がどちらもONの場合にONとなる論理回路に

ANDと命名する。

00 01 10 11を入力とし、

0 0 1 1 を返す論理回路は、
そもそも、一つ目の入力を参照しているだけとみることができるので、
一つの入力の論理回路で代替できる。

そう考えると、
0 1 1 0

が重要そうだ。

00 01 10 11に対して、
0 1 1 0
と返すわけだ。

これは、XORと呼ばれる。

XOR
はORの派生なのだが、これは、
二つとも0の場合に1を返す回路の逆のことで、

二つの入力のうちどちらかONの場合に、ONになる回路と言い換えることも可能。

00 01 10 11 に対して、
0 1 1 1 を返すものをOR回路とする。

足し算回路を作成する。

足し算は、力業で解決する

二つの入力i1 i2 について、0 1 の入力を羅列すると、
0 0
0 1
1 0
1 1
になる。

数を二つのスイッチで表すとし、
0 0
0 1
1 0
1 1を
0123に対応させるとすると、

入力 出力
00 00
01 01
10 01
11 10

を返すことになる。

一つの論理回路で返せる情報は、0 1だけなので、
各出力を別々の論理回路で構築する。

00 00
01 01
10 01
11 10

出力の一行目は、AND回路で
二つ目は、XOR回路で構築できる。

これは、不完全ではあるが、加算が可能な回路なので、
半加算器という。

あとはこれを連結すればいい。

そうすれば全加算器である。

繰り上がり、入力1、入力2の
全入力パターンを網羅して、
どういった出力を返すかを決定する。

繰り上がりなし

00 00
01 01
10 01
11 10

繰り上がりあり

00 01
01 10
10 10
11 11

ORとXORの逆で実装できる。

三つの入力でも、
01 + 01 + 01 の
11

が最大なので、出力は、2つにとどまる。

これが加算をする回路の仕組みである。

001
010
(1 + 2)
の足し算をしてみる。

先頭は命令用なので無視する。

一番下の桁から計算する。

加算器は、二つの出力を持つ。

一桁目は、XORで
00 01 10 11 に対して、
0 1 1 0
を返すもの。

1 0を入力すると、
1が返ってくる。

二桁目は、ANDなので、二つとも1ではないので、0

桁上りは考慮しないので、同様の計算を二桁目でもする

0 1を入力すると、
1が返ってくる。

二桁目は、ANDなので、二つとも1ではないので、0

なので答えは、11となる。

これが加算器。

いったんここまでとし、引き算はまた追記する。

Discussion