閑話:PCと論理回路

前回:https://qiita.com/New_enpitsu_15/items/cf3993ddc1a5b748f6d4
次回:https://qiita.com/New_enpitsu_15/items/1813d05e4671ea99f6fc
目次:https://qiita.com/New_enpitsu_15/private/479c69897780cabd01f4

閑話。
今回はPythonはやりませんし、関係もありません。
なので読み飛ばしても構いませんよ。

さて、今回はPCの仕組みについて軽く触れます。

Pythonなどの__高級言語__(より人に近い言語)は、コンピュータの仕組みについて意識せずともプログラミングができるかもしれませんが、

C言語などの__低級言語__(より機会に近い言語)は、コンピュータについて知っていたほうが何かと便利…だそうです。
まだPythonしか扱えないので何とも言えませんが。

#低級言語と高級言語

まーたなにかよくわからない単語が出てきましたね。でも大丈夫。
これそんなに難解なことではありません。

本当に上に書いた通りで、

 - __高級言語__ほど人の言語に近い、すなわち__理解しやすい__、可読性がよい。ただし、基本的に__実行速度__は低級言語と比べ__おそい__。
 - __低級言語__ほど機械の言語に近い、すなわち__理解しづらく__、可読性は高級言語に比べ悪くなる。が、より機械言語に近いため無駄なロジックがなく、__高速な実行__が可能となる。

(PythonとCを比べるとCのほうが圧倒的に速い)
といったようにプログラミング言語を分類した単語です。

翻訳？何のこと？なんで人に近いと時間かかるの？などの感想を抱いた人は
これからのPCの仕組みで理解してくれる…というか理解できるように書くので分からなかったらコメントください。

#PCのしくみ

PCは基本的に、

 - 入力装置
 - 記憶装置
 - 処理装置
 - 出力装置

によって構成されます。

##入出力装置

入力装置というと、 キーボード、マウス、ペンタブ、Webカメラ、マイク…などなど。
出力装置というと、 モニター、スピーカー。ほかにもプリンターなどもそうですね。

ここまでは簡単に理解できると思います。

![外部装置.png](https://qiita-image-store.s3.amazonaws.com/0/283963/7337e19c-9ec6-a726-e64b-e518c6991753.png)

(LAN,WANはネットワークですね。)

これはいいのです。問題は__本体__。記憶装置と処理装置です。

##記憶装置

記憶装置は、
SSD、USBメモリ、HDDなどの"不揮発性メモリ(電源が切れても記憶を保持する)"と
一般にメモリと言われる"揮発性メモリ(電源が切れると記憶は消える)"に分類されます。

それぞれに特性はあるのですが、今は

 - 不揮発性メモリは低速、大容量、保持
 - 揮発性メモリは高速、低用量、消失

と覚えておきましょう。

__不揮発性メモリは補助記憶装置、__
__揮発性メモリは主記憶装置__と呼ばれるようです。この記事でも以降このように呼称しているのでちょっと頭の片隅に。

##処理装置

処理装置は、
CPU(中央処理装置)、ビデオカード、サウンドカードなどです。
処理装置は、__下された命令(機械語)__通りに処理します。
基本的に、

 - 四則演算
 - 論理演算
 - 複製
 - 分岐

処理を行います。
実はあんまり__難しいことはしてない__んですね。

興味がある方は、"アセンブリ言語"などと調べてみてください。
C言語よりも難解ですがね。

([BrainFu*k](https://ja.wikipedia.org/wiki/Brainfuck)よりはマシでしょうけど。)

##記憶処理装置

この二つは全く別の役割を持ちますが、互いに深くかかわっています。

まず、CPUで処理を行うためには、__命令__を主記憶装置に保持し、処理をしていきます。
この時の__命令__が機械語と呼ばれるものです。

さらに、その機械語と一句一句に対応している、容易に機械語に変換できる言語を先ほど出てきた"アセンブリ言語"と呼びます。

さらに、様々な処理を行うに際して変数や定数が必要になりますが、それらの情報も主記憶装置に保持されます。

![記憶装置と処理装置.png](https://qiita-image-store.s3.amazonaws.com/0/283963/6fc7ff7f-f4ac-d731-99f7-8288f7591f36.png)

※レジスタはCPUがメモリよりも高速にアクセスできる一時的な記憶領域です。メモリとレジスタの違いについてはこの記事では解説していませんので、各自調べてください。

ここではCPUを例に挙げていますが、ビデオカードも似たようなもの。
ただし、__ビデオカードは並列処理__に優れており、モニターの膨大なドットを書き換えています。

##低級言語のほうが速い理由

低級言語のほうが実行速度が速い理由。それは機械語への翻訳の容易さにあります。

ただ単純に翻訳しにくい。というわけではありません。それなら機械語にあらかじめ翻訳しておけばいいだけなのです。

しかし、高級言語は、扱いやすいように様々な機能を持っています。
その分、"__本当はいらない処理__"というものが存在するのです。

(ただし、その処理は一概に悪いものとは限りません。そのおかげで、コーディングが速くなったり、可読性が保たれたりするのです。)

その処理分のオーバーヘッド(本来やりたいこととは直接関わらない処理)が発生します。

加えてPythonはたいていの場合、コンパイル(あらかじめ機械語など実行しやすい形にしておく)をしませんから、実行時に毎度毎度機械語に翻訳しています。そりゃ遅くなるわけですね。

そんな時にCythonが使えたりするんですが、それはまた別の話。

#論理回路

CPUや揮発性メモリの仕組みを理解する上で欠かせないのが論理回路。
論理回路は、デジタル(断続的)な情報を処理する際に使われます。
基本的に0と1でありそれぞれ偽、真とも表現されます。

これがコンピュータが二進数、0と1と言われる所以です。

論理回路はNOT素子さえあれば(多分)計算機等、すべての回路を構成することができます。

NOT素子は名前の通りに、入力とは逆のことを出力します。

![NOT.gif](https://qiita-image-store.s3.amazonaws.com/0/283963/124b3b60-0dc7-efc3-a935-6bf0bccd80a4.gif)

※論理回路記号と真偽表

ちなみに、電気回路図では、

![NOT素子_e.gif](https://qiita-image-store.s3.amazonaws.com/0/283963/c8ec6f1a-3e30-f3ee-01f0-6d2a69b26ce2.gif)

となります。電圧の高低が表現に用いられていますね。

他にも、たくさんの素子がありますが、たとえばANDはすべての入力が1の時のみ1を出力します。

![AND素子.gif](https://qiita-image-store.s3.amazonaws.com/0/283963/720ee090-04e4-aeaf-e8fc-03026c94bfe8.gif)

#####NOT(論理否定)

|i|o|
|:-:|:-:|
|1|0|
|0|1|

#####AND(論理積)

|i1|i2|o|
|:-:|:-:|:-:|
|0|0|0|
|1|0|0|
|0|1|0|
|1|1|1|

#####NAND(否定論理積)

そしてこちらはANDの結果を反転したもの。

|i1|i2|0|
|:-:|:-:|:-:|
|0|0|1|
|1|0|1|
|0|1|1|
|1|1|0|

#####OR(論理和)

これは入力が一つでも1なら出力も1となるもの。

|i1|i2|o|
|:-:|:-:|:-:|
|0|0|0|
|1|0|1|
|0|1|1|
|1|1|1|

#####NOR(否定論理和)

これもORの結果を反転したもの。

|i1|i2|o|
|:-:|:-:|:-:|
|0|0|1|
|1|0|0|
|0|1|0|
|1|1|0|

#####XOR(排他的論理和)

すべての入力が同じでないときに1を出力するもの。

|i1|i2|o|
|:-:|:-:|:-:|
|0|0|0|
|1|0|1|
|0|1|1|
|1|1|0|

#####XNOR(否定排他的論理和)

XORの結果を反転したもの。

|i1|i2|o|
|:-:|:-:|:-:|
|0|0|1|
|1|0|0|
|0|1|0|
|1|1|1|

#####基本素子まとめ

| 00 | 01 | 11 | 演算 |
|:-:|:-:|:-:|:-:|
|0|0|0|絶縁|
|0|0|1|AND|
|0|1|0|XOR|
|0|1|1|OR|
|1|0|0|NOR|
|1|0|1|XNOR|
|1|1|0|NAND|
|1|1|1|電源|

#参考

https://qiita.com/shunsukekyuwa/items/fe4a9376518d6e4106a4
http://q.hatena.ne.jp/1326305700
http://www.crl.nitech.ac.jp/~ida/education/computer/project/computer020601.html
https://toshiba.semicon-storage.com/jp/design-support/faq/mosfet_bipoler-transistors/how-do-npn-and-pnp-transistors-operate.html
https://ja.wikipedia.org/wiki/Brainfuck

#閑話休題