コンピュータサイエンスを基本からまとめてみた【コンピュータの仕組み】

## 1. 数学と論理学

##### 0と1の電気で計算ができるまで
- アラビア数字  ⇨  大量の数を表現
- 論理学  ⇨  論理を数式で表す
- 工学  ⇨  電気のON/OFFで計算可能に 

(1) アラビア数字(数学)

 - コンピュータの歴史は計算の歴史　⇨　内部で0と1の計算をしているに過ぎない 
 - コンピュータは元々、職業(計算手)を指していた
 compute : 計算をする
 er : 〜する人

数 : モノの集合を表す概念
数字 : 数を表す記号

- 数(概念)を簡単に表せる数字(手段)が発明されたから<br>⇨ アラビア数字は計算しやすく、大きな数を表しやすい

- コンピュータも数を数えることで絶大な力を発揮(内部で高速に計算をしている機械)

(2) ブールの論理演算(論理学)

- 論理学とは？　⇨　正しい推論とは何か？
※すでに知っていることから、知らないことを導く

- 論理演算とは？　⇨　数学と論理学をミックスさせた計算方法

- 命題 : 真か偽を判定できる文章のこと　⇨　命題の審議の結果を計算として扱う
- AND, OR, NOTの３種類の演算

AND演算(✖️)　:命題が２つとも真なら、真

| 命題X | 命題Y | 結果 |
| :---: | :---: | :---: |
| 真 | 真 | 真 (真 × 真 = 真) |
| 真 | 偽 | 偽 (真 × 偽 = 偽) |
| 偽 | 真 | 偽 (偽 × 真 = 偽) |
| 偽 | 偽 | 偽 (偽 × 偽 = 偽) |

※ 真『1』偽『0』へ ⇨ 裏で真偽の計算を行なっている
| 命題X | 命題Y | 結果 |
| :---: | :---: | :---: |
| 1 | 1 | 1 (1 × 1 = 1) |
| 1 | 0 | 0 (1 × 0 = 0) |
| 0 | 1 | 0 (0 × 1 = 0) |
| 0 | 0 | 0 (0 × 0 = 0) |

OR演算(➕)　:どちらか一方が真なら、真

| 命題X | 命題Y | 結果 |
| :---: | :---: | :---: |
| 真 | 真 | 真 (真 + 真 = 真) |
| 真 | 偽 | 偽 (真 + 偽 = 偽) |
| 偽 | 真 | 偽 (偽 + 真 = 偽) |
| 偽 | 偽 | 偽 (偽 + 偽 = 偽) |

※ 真『1』偽『0』へ
| 命題X | 命題Y | 結果 |
| :---: | :---: | :---: |
| 1 | 1 | 1 (1 + 1 = 1) |
| 1 | 0 | 1 (1 + 0 = 0) |
| 0 | 1 | 1 (0 + 1 = 0) |
| 0 | 0 | 0 (0 + 0 = 0) |

NOT演算(➖)　:１つの命題を対象とし、真と偽を逆に

| 命題X | 結果 |
| :---: | :---: |
| 真 | 偽 | 
| 偽 | 真 | 

『人間の思考を数学で表そう』という取り組みは、最終的には１と０だけの表になった

## 2. 電気回路,２進数

(1) 電気を使って論理演算を実現
- AND, OR, NOT演算を電気回路に置き換えると<br>⇨ 電気が流れている時を１(ON)<br>電気が流れていない時を０(OFF)

AND演算
| 命題X | 命題Y | 結果 |
| :---: | :---: | :---: |
| 1 | 1 | 1 (1 × 1 = 1) |
| 1 | 0 | 0 (1 × 0 = 0) |
| 0 | 1 | 0 (0 × 1 = 0) |
| 0 | 0 | 0 (0 × 0 = 0) |

すごいこと
- 電気を『情報を表すモノ』として用いた
- 工学の世界に論理学をミックスさせた

電気は『エネルギー』に利用される
身の回りの電化製品は電気を動力源として動く
⇨ 電気のON/OFFを『情報』として発送を転換

XOR回路を電気回路で実現
- AND, OR, NOT回路だけでなく、２進数で計算をするときに使われる回路<br>⇨ どちらか一方が真の時だけ、結果も真

(2)論理演算を使って、四則演算を実現

 - 加算回路(加算 = 足し算)

 ① 半加算器 : half adder 一桁同士の足し算(1 + 1 = 10)

半加算器で出来る計算の組み合わせ

例)
- 1 + 1 = 10
- 1 + 0 = 1
- 0 + 1 = 1
- 0 + 0 = 0

⇨ 実際に電気回路を作って、計算の答えた合うか確認

 ② 全加算器 : full adder 二桁同士の足し算(10 + 1 = 11)

 ⇨ CP内部では010101001を計算している。実際に使われるのが多いのは全加算器

- 掛け算：足し算の繰り返しで実現<br>⇨ 2×3 は 2を3回加算する
- 割り算：引き算の繰り返しで実現<br>⇨ 10×2 は 10から2を何回引けるかカウント

(3) シャノンの情報理論(工学)

- コード化：情報を短縮させる
- 0と1が情報の最小単位である！<br>⇨ どんなに長い情報でも、0と1でコード化すれば簡単に表せる

①なぜ0と1が情報の最小単位？

- 0と1の『2通りの変化』より、単純にすることはできない

②なぜ画像や動画、音声などたくさんのデータが扱えるのか？

- 全ての情報を『0と1』に対応させる

※ ビット(bit) ⇨ 二進数の一桁 = 『0か1』のこと ⇨  2通りの情報を表すことができる

- １を捨てると、0だけでは何もできない ⇨ 0と1を組み合わせば無限に対応ができる

※ 情報の基本単位: バイト bite:一口、一噛み <br>⇨ コンピータが一口で齧れるデータ量

1バイト = ８バイト ⇨ アルファベット１文字が８ビットだから

- 16進数　⇨ 『2進数の4桁』と『16進数の1桁』はピッタリ一致する

1~15を表す方法

| 10進数 | 16進数 | 10進数 | 16進数 | 
| ---- | ---- |---- | ---- |
| 1 | 1 | 16 | 10 |
| 2 | 2 | 17 | 11 |
| 3 | 3 | 18 | 12 |
| 4 | 4 | 19 | 13 |
| 5 | 5 | 20 | 14 |
| 6 | 6 | 21 | 15 |
| 7 | 7 | 22 | 16 |
| 8 | 8 | 23 | 17 |
| 9 | 9 | 24 | 18 |
| 10 | A | 25 | 19 |
| 11 | B | 26 | 1A |
| 12 | C | 27 | 1B |
| 13 | D | 28 | 1C |
| 14 | E | 29 | 1D |
| 15 | F | 30 | 1E |
|  |  | 31 | 1F |
|  |  | 32 | 20 |
|  |  | 33 | 21 |

- 16進数を使うメリット

| 10進数 | 2進数 | 16進数 | 
| ---- | ---- | ---- |
| 1 | 1 | 1 |
| 2 | 10 | 2 |
| 4 | 100 | 4 |
| 8 | 1000 | 8 |
| 16 | 10000 | 10 |
| 32 | 100000 | 20 |
| 64 | 1000000 | 40 |
| 128 | 10000000 | 80 |
| 256 | 100000000 | 100 |

※2進数が4桁上がると、16進数は１桁上がる！

- n進法 : n種類の数字を使って数を表す方法
- n進数 : n進法を使って表された数字

(4) 二進数を使ったデータの表現方法

- アナログとは？ ⇨ 流れつづける現実の情報をそのままの形で表したもの
- デジタルとは？ ⇨ 流れつづける現実の情報を区切って、飛び飛びで表したもの 

- コード化(符号化) ⇨　本来数値でない情報を数値に置き換える 

## 3. CPU, メモリ, I/O

(1)コンピュータの5大装置

CPにできることは5つだけ
５つの機能を組み合わせて目的のプログラムを作っている

- 入力 ⇨ 外部からデータを入力(キーボードやマウス)
- 出力 ⇨ 処理したデータを出力(ディスプレイ、プリンター)
- 演算 ⇨ 演算装置は計算しかできない
- 記憶 ⇨ メモリのこと<br>※演算装置で計算をするには記憶装置に入ったデータを持ってこないと行けない
- 制御 ⇨ 制御装置が全体の動きをコントロール

(2)ICUの仕組み
- IC ⇨ 電子部品で作られた論理回路や演算回路<br>※ ICがたくさん集まることによってCPU:演算・制御装置、メモリ:記憶装置を実現

(3)CPUの4つの機能
- CPU ⇨ 全てのデータを処理し、全体の動きをコントロール
- CPU : 4つの部品 ⇨『演算＋制御』　①演算装置　②レジスタ　③制御装置　④クロック

①演算装置 ⇨　0と1の数字を計算して情報を処理する<br>※ 計算の対象となるデータはやり取りできない

②レジスタ ⇨　『CPUの中で』命令やデータを記憶する役割<br>※ レジスタにあるデータしかCPUは処理できない
- レジスタの特徴
1.必要なデータへ一瞬でアクセスできる
2.メモリに比べて保存量は少ない

③制御装置 ⇨　データのやり取り、演算装置への指示
- 制御 ⇨　データのやり取り メモリ、CPU、レジスタ間でデータをやり取り

④クロック ⇨　一定の間隔で信号を出して、作業のタイミングを合わせる　CPUにおいて異なる処理を同期させるための信号

- 動作周波数:Hz クロック信号が１秒間に何回出るか、何回電気信号ができたかを表す
※ 6Hz:１秒間に６回クロック＝１秒間に６回命令できる

⑤RAMとROM
- メモリ:データを保管する場所
- ROM:データを保存するだけで、それ以外の作業はできない(読み込み専用)
- RAM:データを読み書きするための作業机

⑥SRAMとDRAMの違い

- SRAM ⇨　電源がONなら時間がどれだけ経過してもデータを覚えていられる
※ 静的＝何もする必要がない
- DRAM ⇨　時間の経過とともにデータが消えてしまうので定期的に上書きする必要がある
コンピュータのメインメモリで使われる
※ データの上書き＝リフレッシュ

⑦マスクROMとPROM

- マスクROM ⇨　製造時にデータが書き込まれ、書き換えできないメモリ
- BIOS ⇨　コンピュータのハードウェアを制御するソフト
- PROM ⇨　ユーザがデータを書き込めるようにしたROM
※ 一度だけしか書き込めないタイプと何度でも消して書き込めるタイプの２種類ある

⑧メモリICの物理てきな仕組み

- メモリIC ⇨　メモリを形作っている小さな部品　メモリを構成する最小単位
※ メモリICに格納されたデータを扱うことがエンジニアの仕事だから
- 処理の対象となるデータはメモリに入っている ⇨　プログラムを書くことはメモリを操作しているのと同じこと

⑨メモリICの物理的な仕組み
- データ型 ⇨　どのような種類のデータを格納するかを示すもの
- データ型を使えばメモリーの特定領域を確保してくれる

```
char: 1バイト
short: 2バイト
long: 4バイト
```
⑩I/O
- I/O ⇨　Input,Outputの略　外部とデータをやり取りするための仕組み
- I/O ⇨　CP本体と周辺装置を繋ぐための装置

## 4. 処理の流れ

①メモリICへの記憶
- パス: CPUやメモリ、I/O同士をそれぞれ結ぶ役割

②CPUの処理の流れ

```
【3ステップ】１＋２＝３
メモリからデータを持ってくる ⇨ CPUがデータを処理する ⇨ 結果をメモリに返す
↓
１と２のデータを持ってくる ⇨ １＋２の計算を処理する ⇨ ３という結果を返す
```
CPUができる処理
- メモリの値をレジスタに記憶
- レジスタの値をメモリのアドレスに記憶
- レジスタの間で演算を行い、結果をレジスタに記憶

③レジスタの種類

- 汎用レジスタ ⇨ 計算に必要なデータを格納　色々なデータを保存することができる
- 命令レジスタ ⇨ 命令(どんな処理をすればいいか？)そのものを格納
- プログラムカウンタ ⇨ 次に実行する命令を管理するレジスタ CPUが１つの命令を実行するとプログラムカウンタが１つ増加
- フラグレジスタ ⇨ 直前に実行した演算の結果が＋、ー、０のいずれかになったかを記憶
- ベースレジスタ ⇨ データのメモリの領域の先頭のアドレスを確認 
- スタックレジスタ ⇨ 1次記憶に利用するメモリのアドレスを記憶 

## 5. コンパイラ

①コンパイラとは？ ⇨ CやJavaなどで書かれたプログラムを0と1の機械語に変換する作業
- コンパイル : 作業
- コンパイラ : ソフトウェア
- ソースコード : プログラミング言語で書かれた文章のこと
- オブジェクトコード : 翻訳された機械語の文章のこと

②機械語とは？ ⇨ コンピュータが直接理解して、実行できる言語
- 低水準言語 : 機械語に近いプログラミング言語
- 高水準言語 : 人間の目線に近いプログラミング言語
- アセンブリ言語 : 機械語に1対1で対応したプログラミング言語<br> ⇨ CPUが違えば、異なるアセンブリ言語が必要に  アセンブリはCPUに依存した言語

③高水準言語の特徴
- 人間にとってわかりやすいこと
- 同じ１つのプログラムをほぼ全てのCP上で動かせる
※ IntelやARMなどのCPUの種類が違っていても同じ1つのプログラムで動かすことができる
- コンパイラ、インタプリタ : 高水準言語の翻訳ソフトウェア<br> ⇨ 環境構築はコンパイラ、インタプリタの準備

④アセンブリ言語
- アセンブリ言語 : 機械語と1対1の関係にある低水準言語
- アセンブリ : 機械語と1対1で対応する言語
- アセンブラ : 機械語に変換するソフトウェア
- アセンブル : 機械語に翻訳する作業

⑤コンパイラ、インタプリタ
- コンパイラ : 1行ずつ翻訳<br> ⇨ 一括翻訳方式 : コードを全て機械語に翻訳<br> ⇨ 実行速度が速いできるが全体を読み込まなければいけない手間がかかりエラーを見つけにくい不便さ
- インタプリタ : 全体を翻訳<br> ⇨ 逐次翻訳方式 : コードを１行ずつ機械語に翻訳<br> ⇨ プログラムをすぐに実行できるが実行に時間がかかる

⑥コンパイラの流れ

『ソースコード』 ⇨ 『字句解析』 ⇨ 『構文解析』 ⇨ 『中間コード』 ⇨ 『最適化』 <br>⇨ 『コード生成』 ⇨ 『機械語』

- 字句解析 : ソースコードをバラバラにする作業 ⇨ プログラムを構成するトークン(最小単位)に分割

- 構文解析 : バラバラにされた単語を分析してどのように構成されているか調べる ⇨ 構文木を用いてチェックを行う

- 中間コード : ソースコードから機械語へ変換される過程で一時的に作られるコード

## 6. OSの仕組み

①OSの位置付け
- OS : Operating System ⇨ CPを支える土台となるソフトウェア 基本ソフトウェア
- アプリケーション : 応用ソフトウェア
- ハードウェア : 電気回路や半導体、メモリICやキーボード、ディスプレイ
- ソフトウェア : 目に見えない、プログラムの部分　OSやアプリケーション、プログラムやソフトウェア 

②BIOS
- Basic Input Output System: 基本入出力システム<br> ⇨ 周辺装置とデータをやり取りするための機能　CPに接続されている周辺機器を制御するためのソフトウェア

| アプリケーション |
|---|
| OS |
| BIOS | 
| ハードウェア | 

③コンピュータが起動するまで

```
『電源ボタン』⇨『BIOSの起動』⇨『ブートストラップロードの起動』⇨『OSの起動』⇨『コンピュータの起動』
```
- BIOSとOSは起動する順番にも特徴がある
- BIOSはOSやアプリが起動するよりも早い
- BIOSの起動 : ハードウェアの正常動作をチェックする　BIOSの初期診断プログラム
- 起動時にチェックするハード : キーボードやメモリ、HDD、ディスプレイなど正常な状態であるかをチェック
- BIOSはマザーボードの中のROMに格納されている小さなプログラム
- マザーボード : コンピュータの中で部品同士を連携させている核となる部品
- ブートストラップロード : ハードディスクからメモリへとOSを移すプログラム
- OS : ハードディスク　CPUが処理できるにはハードディスクからメモリに移す必要がある

④OSとは何か？
- バッチ処理 = OSを象徴
- ハードとアプリの橋渡し ⇨ ハードの複雑な仕組みを知らなくてもCPを使えるようにしてくれる

| アプリケーション |
|---|
| OS |
| ハードウェア | 

```
『入出力管理』⇨『メモリ管理』⇨『ファイル管理』⇨『マルチタスク』⇨『プロセス管理』
```
⑤システムコール
- システムコール : OSが持つハードウェアを制御する機能をアプリケーションが利用する仕組み
- システム = OSのこと : OSの機能をコールする＝OSがハードを制御しているのと同じ　
- ライブラリ : アプリケーションに用意されている関数
- API : Application Programming Interface ⇨ アプリケーションとOSとの間で窓口となる機能

⑥入出力管理
- マルチタスキング : CPUと周辺装置が独立して処理を行えることがスピードアップのため１番必要
- バッファやキャッシュを利用する : 処理スピードを上げるためOSが提供する機能の1つ
- キャッシュ : よく使うデータを取り出しやすい場所に準備しておく仕組み
- ボトルネック : 全体の性能を落とす１つの原因
- スプール機能(スプーラ) : 処理したいデータを一時的に保存しておく仕組み

⑦メモリ管理
- メモリ管理 : マルチタスクの多重度を高めCPUを100％使用できる状態にすること

⑧仮想記憶

- 仮想記憶 : プログラムの一部をHDに対比させることで容量以上のデータを扱う仕組み ⇨<br>メモリとHDの間でデータの出し入れ　メモリの容量を超える大きなプログラムが扱える
- セグメント : プログラムに合わせて区切られた単位
- ページ : プログラムに関係なく一定のサイズに区切られた単位 

⑨ファイル管理

ファイルにデータを保存 = HDにデータを保存
- ファイル : 電源を切っても消えない ⇨ HDにデータが保存されているおかげ
- メモリ : 電源を切ると消える

⑩マルチタスク
- マルチタスク : OSが提供するいくつものプログラムを同時に処理できる仕組み ⇨ CPUは１度に1つのプログラムしか処理できない ⇨ OSがプログラムを切り替える
- プロセス : プログラムの一連の処理過程
- タスク : プログラムの処理の仕事、そのもの


## 参考サイト
[ゼロから分かるコンピュータの仕組み【ハードとソフトの動きをイメージできるようになろう！】](https://www.udemy.com/course/tobach_02/learn/lecture/25715302#overview)