ITエンジニアが修めるべきコンピュータサイエンスの基礎（ハードウェア編）

## 0.はじめに
本記事では、3つのコア技術（ハードウェア・ソフトウェア・コミュニケーション）に関するトピックで構成しました。
「IT技術者が修めるべき」といったタイトルにしていますが、内容としては非常に基礎的で、基本的なアイデアをまとめたものです、というのも現在のシステムは、今から10年後には陳腐化してしまっているでしょうが、基本的なアイデアを理解しておけば、未来のシステムも同様に理解できるからです。
それでは、始めて行きます。


## 目次
[1.コンピュータの論理的構造](#1コンピュータの論理的構造)
[2.情報の表現](#2情報の表現)
[3.おわりに](#3おわりに)

## 1.コンピュータの論理的構造

### 1-1.アーキテクチャ
以下の図はコンピュータの基本的なアーキテクチャです。
1個のプロセッサー(**CPU**)と一次記憶(**RAM**)と二次記憶(**HDD, SSD**)、その他のコンポーネントがデータバスと呼ばれる線で接続されており、データバスの中では情報が行き来しています。
この構造は1940年代からそれほど変わっていませんが、物理的な構造は大きく変わったため、コンピュータの性能は段違いに高くなっています。
具体的には、個々のコンポーネントのサイズが小さくなり、一つのチップの上に多くのデバイスを載せられるようになったことが挙げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/c7db75d3-6e30-061b-10ae-9fa69ec49abd.png)

### 1-2.CPU
プロセッサー(CPU)は脳に相当します。
CPUは計算・データの移動・コンポーネントの動作の制御を行います。
CPUの性能を図る指標として、コア数、スレッド数、クロック周波数というものがあります。それぞれ値が大きいほど高性能となります。
- コア数：はCPUの殻の中に入っているCPUの数です。2コアなら実際に2つのCPUが入っているし、4コアなら4つのCPUが入っているという意味になります。
- スレッド数：搭載されているCPU1つあたり、同時にこなせる仕事の数のことです。1コアあたり2スレッドなら、最大で2つの仕事を同時に処理できるという意味になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/c9018f77-d856-be2a-586d-9aa960371f95.png)
- クロック周波数：回路の処理歩調を合わせる信号(クロック信号)が1秒間に何回発生するかを示した値のことで、GHz単位で表されます。

### 1-3.RAM
一次記憶(ランダムアクセスメモリー：RAM)はプロセッサーやコンピュータの他の部分から使用される情報を保存します。
RAMには処理しているデータだけでなく、データの処理方法を指示するための命令も格納されます。
ウェブの閲覧、電子メールの送受信、音楽の再生やOSの命令を適切のRAMに組み込むことによって実行されます。
ほとんどのRAMは**揮発性**です。つまり、電源が切られればその中のアクティブな情報は全て失われてしまいます。
PCのスペックとして、「メモリーとは、作業スペースの広さのようなもの」と表現されることもあり、メモリーが大きければ大きいほど多くのソフトウェアを同時に扱うことが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/9ad9330d-b8f1-3495-876c-b64aff0c33bf.png)


### 1-3.二次記憶(HDD, SSD)
RAMで情報を格納できる容量はそれなりに大きいものですが、限定的で、電源がオフになるとその内容は消えてしまいます。
これに対して二次記憶は、電源がオフになっても情報を保持し続ける**不揮発性**なのです。
- HDD：ハード・ディスク・ドライブの略で、PCのデータ保存やテレビの録画などに使われている磁気ディスク。
- SSD：ソリッド・ステート・ドライブの略で、HDDと同じように使える記憶装置。HDDと比べ、より速く、より軽く、より信頼性が高い。

## 2.情報の表現
コンピュータはデジタルプロセッサーです。塊に分かれて、個別の値になっている情報を、保存して処理します。
これに対し、アナログ情報は連続的に変化する値を意味しています。

### 2-1.アナログ vs. デジタル
まずはアナログとデジタルを区別しましょう。
車の方向を少し変えたい時は、ハンドルを少し回します。(好きなだけ細かい調整を行えます)
これを方向指示器(ウィンカー)と比べてみましょう。方向指示器はオンまたはオフであり、その中間の状態はありません。アナログデバイスでは、何か別のものが変化した割合に比例して、何かが滑らかにかつ連続的に変化します。

時計についても考えてみましょう。
アナログ時計には、時針、分針、秒針があり、秒針は1分で1回転します。時針と分針は時間の経過とともに滑らかに移動し、通ることのできるあらゆる場所を通過していきます。
これとは対照的に、デジタル時計は時間を数字で表示するため、1秒に満たない中間的な値が表示されることはありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/9c6a05fd-a807-e226-0664-9c05b75994be.png)

私たちの現実世界の情報はアナログであるのに対し、多くの現代技術はコンピュータにとって処理しやすいデジタルデータを扱います。
デジタルがコンピュータにとって都合のいい理由は以下の通りです。
- 元の形式に関係なく、保管・輸送・処理が可能
- 冗長、または重要でない情報を切り捨て圧縮することが出来る
- 暗号化を施すことが出来る
- 正確なコピーが可能

こういった事情から、外部からのデータ(音、画像、動きなど)は、入力側でデジタルデータに変換され、出力側でアナログ形式に変換される必要があるのです。

### 2-2.アナログ/デジタル変換
アナログデータをデジタル形式に変換するにはどうすればよいでしょうか。基本的な例をいくつか見てみましょう。

#### 2-2-1.画像
画像の一要素は、赤・緑・青の光の量のセットであり、各セットはピクセル(画素)と呼ばれます。
もし、画像が3000*2000ピクセルで構成されているなら、それは600万画素ということになります。
ピクセルの色は赤・緑・青の強度を記録する3つの値で表されるため、600万画素の画像には、合計1800万個の光の強度を表す値があります。

#### 2-2-2.音
時間とともに空気圧がどのように変化するかをプロットすれば、音を視覚化することが出来ます。(アナログ信号)
縦軸は音の強度や大きさを、横軸は時間を表し、1秒当たりの波の数がピッチ、周波数を表します。
アナログ信号を一定時間ごとに測定し(サンプリング)、元の曲線を近似する一連の数値の列を得ることが出来ます。(デジタル信号)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/cddf2e4a-cf86-792d-e87a-5105d75a7704.png)

#### 2-2-3.動画
動画のデジタル表現は、音声及び画像要素を結合して同期させたものです。
音と画像は圧縮が可能です。音楽の場合、こうした圧縮はMP3やAACなどの技術を使用して行われます。
画像の場合、最も一般的な圧縮技術はJPEGと呼ばれています。
この技術は画像を1/10以下に縮小することも可能です。圧縮はデジタルデータに対して行える処理の一例ですが、アナログデータの圧縮は非常に困難なのです。

#### 2-2-4.文字
世界では、Unicodeという単一の標準にほぼ収束しています。
コンピュータは「0（ゼロ）」と「1（イチ）」しか扱うことが出来ない(後ほど解説します)ため、Unicodeという「『文字』と『文字に割り当てた番号』の対応表」を使ってデータを扱います。
例えば
|文字|文字に割り当てられた番号|
|-|-|
|あ|00000001|
|い|00000010|
|う|00000011|
|え|00000100|
|お|00000101|

人間が
「**あい**」
と入力した場合、コンピュータは
「**00000001** **00000010**」
と認識することで、文字データを扱うことが出来ます。

### 2-3.ビット、バイト、バイナリー
デジタルシステムは全ての種類の情報を数値で表していますが、内部では、私たちにとって馴染みのある10進数ではなく、2進数(「0」と「1」)が使われています。

#### 2-3-1.ビット
デジタル情報を表現する最小単位が「ビット(binary digitの頭文字)」です。すなわち1ビットは0または1のどちらかの値を取る数字になります。
(2進数の計算ロジックは次の記事を参照してみて下さい[「10進数と2進数の変換」](https://qiita.com/miriwo/items/8acdbe9879f9b1dc819d))

#### 2-3-2.バイト
現在の全てのコンピュータの中では、処理とメモリー構成の基本単位は8ビットになっていて、一塊のものとして扱われています。8ビットで作られるグループをバイトと呼びます。
1つのバイトは256個の異なる値をコード化することが出来ます。(2^8、長さ8の0と1の列のあらゆる組み合わせ)
2つのバイトは一緒にすることで、16ビットを提供し、0から2^16-1(=65,535)までの数を表すことが出来、また2バイトでUnicode文字セットの中の1文字を表すことが出来ます。

一方で、2進数は10進数と比べ長くて場所を取る表現形式のため、代わりに16進数がよく使われます。
16進数は16種類の文字を使います。(2進数が2種類の数字、10進数が10種類の数字を使うのと同じです)
使うのは0~9, A~Fの16文字で、各文字はそれぞれ4ビットを表現しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681113/8a382fbc-e577-07d9-9901-6ef05caa430d.png)

16進数を目にする機会はあまりありませんが、例えばWebページ上の色は一つの例です。
前述のように、色の表現には、各ピクセルに3バイトを使用します。(赤・緑・青の量)
これらのコンポーネントはそれぞれ1バイト(8ビット)に格納されるため、各ピクセルの赤の量には256種類(=2^8)の可能性があり、同様に緑、青にも256種類の可能性があります。それらを合わせると256\*256\*256色のカラーが存在することになるのです。
これらに16進数の値を対応させたものがカラーコードになります。
真っ赤なピクセルは「**FF0000**」として表されます。つまり、赤は最大値で10進数の255、緑、青はともに0です。
また、黄色は赤と緑を加えたものなので、最も明るい黄色は「**FFFF00**」で表されます。
黒と白はそれぞれ「**FFFFFF**」、「**000000**」です。

## 3.おわりに
以上、「ITエンジニアが修めるべきコンピュータサイエンスの基礎（ハードウェア編）」でした。
ITエンジニアだけでなく、教養としてコンピュータサイエンスを修めたい方向けに、内容は非常に基礎的かつ非常に重要な要素だけをまとめさせて頂きました。