プログラミングを始める前に　〜コンピュータとは〜

**コンピュータ**という言葉を聞いて最初に思い浮かべるものはどんなものでしょうか。
おそらくほとんどの人が**ノートパソコン**もしくは**デスクトップパソコン**を思い浮かべるかと思います。

![kaden_PC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/58472107-9924-2d43-f3eb-9dc416696e7d.png)

パソコンは「パーソナル**コンピュータ**」の略ですのでそのイメージで間違っておりませんが、**コンピュータ**そのものを説明するにはちょっと物足りないですね。
そこで、今回は**コンピュータというものが一体どのようなものなのか**を簡単に説明していこうと思います。

プログラミングを始めたばかりの方や、これから始めたいと思っている方の役に立てれば幸いです。

#コンピュータとは
ざっくりいうと・・・

**電子演算装置。高速度で計算やデータ処理、また、情報の記憶保存・検索などができる装置。**

です。

**ごめんなさい、まだブラウザバックしないでください。**
もう少し噛み砕いて説明していきます。

##コンピュータは計算機
先の説明でもありました通り、**コンピュータは計算機**です。
昨今のパソコンというものを想像すると、**「ゲームができるもの」「エクセルが使えるもの」「インターネットにつながるもの」**などであり**計算機**という印象は少ないかもしれません。
しかし、それらすべての機能のもとになっているのは「**計算機として成り立たせるための構造**」です。

##最初のコンピュータ
人類史上最初のコンピュータは、**ENIAC（エニアック）**だと言われています。

ENIACは17000本以上の**真空管**を使い、床面積は100m<sup>2</sup>、重量30トン、消費電力150kWという容易に想像もできないような規模の超大型コンピュータでした。デカすぎてドン引き。
最近のPCは大きくても70cm<sup>2</sup>、重くて2Kg、消費電力30Wほどですので、ENIACの規模の大きさがわかりますね。
https://ja.wikipedia.org/wiki/ENIAC

ENIACは**第二次世界大戦中**に複雑な計算（**弾道計算**）を行うために開発されたみたいです。
もともとアメリカの砲兵隊は、ほぼ手計算で弾道を計算していたようで、「**さすがにこれじゃあ正確に砲弾を打つまでに時間かかるよね**」ということで、とにかく**早く正確に計算できるもの**が必要になりました。
ということで、ENIACが誕生したわけです。

自動で計算してくれる計算機として開発をしているうちに、**ワープロやらゲームやらにも使えんじゃね？**となって今日のパソコンになっていったわけです。（スティーブ・ジョブズ様様ですよ）

つまり、コンピュータは『**手動で計算していたものを自動で機械に処理させよう**』という目的から生まれた**計算機**であると言えます。

めっちゃ余談ですが、ENIACで大量に使われていた**真空管**というものは、今日ではあまり聞かないものですよね。
なんでENIACを作るために大量に必要だったものが今は使われていないの？というと、**トランジスタ**というものに取って代わられてしまったからです。
トランジスタは真空管よりも**サイズも発熱量も価格も優れている完全上位互換**ですので、真空管くんは淘汰されてしまいました。（今でもオーディオ業界では使われていたりします。アンプとかね）
トランジスタについてもいつかメモを残していこうと思います。

##ノイマン型コンピュータ
今日用いられているコンピュータは、**ノイマン型コンピュータ**と呼ばれるものです。
これは**ジョン・フォン・ノイマン**という、**[半端ない数学者](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A9%E3%83%B3%E3%83%BB%E3%83%8E%E3%82%A4%E3%83%9E%E3%83%B3)**が考案したものです。

ノイマン型コンピュータは、以下の五つの構成要素からなるという特徴があります。
**1.演算装置**
**2.制御装置**
**3.記憶装置**
**4.入力装置**
**5.出力装置**

また、ちょっとややこしい特徴として、**プログラム内蔵方式**であるという特徴もあります。
かつてのノイマン型ではないコンピュータでは、ある処理を実行して他の処理を実行しようとしたときに、**コンピュータの配線をつなぎなおす必要**がありました。
イメージとして、「**エクセルをやるためのコンピュータ**」にしようと思ってコンピュータの配線を行なった後に、パワポを使いたいと思った時は「**パワポを使うためのコンピュータ**」にするために配線をし直す必要があります。
めんどくさ！

ということで、ノイマン型コンピュータでは、**主なプログラムの処理手順を主記憶装置にあらかじめ書き込んでおき、それを他の筐体に付け替えるだけで同様の機能を実現できる**ような、汎用的なコンピュータの仕組みを実現しています。
これでいちいち配線をつなぎなおす必要もありません。
やったー🙃

#コンピュータの構成要素
ノイマン型コンピュータの構成を知ることで、**今使っているパソコンがどんなもので構成されているのか**を知ることができます。
**コンピュータってなに？**と聞かれれば、**この五大構成要素を備えた電子計算機だよ**といえば格好がつくと思います。

それぞれ詳細は説明していきますが、ざっくりとしたイメージは以下の図の通りです。
赤い矢印が、処理装置から送られる制御命令で、自分以外の装置に「あぁしろ」「こうしろ」と命令をします。
オレンジの矢印はデータの流れを示しており、主に入力装置から入力されたものをみんなで加工して、欲しい形になったら出力装置に渡します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/df33642e-7a66-f33c-5fc4-7c40d40b7641.png)

それでは、それぞれの装置のざっくりとした説明をしていきます。

##入力装置
**外部から情報（データ）を取り込むための装置が入力装置**です。

文字を入力するならキーボード。
音情報を入力するならマイクロフォン。
映像情報を入力するならカメラとなります。

入力装置がいろんなデータを取得して、演算装置や記憶装置へと引き渡し、次の処理に進みます。

##記憶装置
記憶装置は、情報を保存しておくための装置です。
記憶装置は記憶しておく期間や目的によってさらに二つに分けることが出来ます。
###主記憶装置
主記憶装置は、後述するCPUとよばれる**コンピュータの脳みそ**と**直接やりとりをするため**に情報を一時保存しておくための記憶装置です。

ちょっとした計算結果や単純命令の一次保存等のメモ帳的な役割が主な用途になりますので、**容量自体はあまり大きくなく高速に応答する必要がある**という特徴があります。
※CPUという装置はとにかくせっかちで早く作業をしようとしますので、主記憶装置は高速で動作する必要があります。

人間に例えると、**メモ帳**や**ポストイット的**な役割です。
それらは**面積よりも携帯性やすぐに使えること**が求められますよね。

代表的な主記憶装置としては、**メモリ**が挙げられます。
こんなかんじの見た目↓
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/e773f434-8109-825e-38ba-2ebc2b7a50f5.png)

###補助記憶装置
補助記憶装置は主記憶装置とは異なり**CPUと直接やりとりはしません**。
従って、CPUが行う高速な仕事には直接関わりませんので、そこまできびきびと応答する必要がありませんが、**長期的にたくさんのデータを保存しておく**という役割があります。

例えば**写真や動画、アプリ等のデータは補助記憶装置に保存**されていきます。
代表的な補助記憶装置としては、ハードディスクやSSDといったものがあります。

↓これハードディスク
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/4fe18291-028f-a093-6ea5-26c9a951e361.png)


ちなみに、よく混同されがちな主記憶装置と補助記憶装置は度々**その人のリテラシー**を試してきます。
というのも、スマートフォンなどのスペックをみるときに「**メモリ8GB搭載**」と表記されているのを見て、

「**え？！　8GBしか保存できないの？**」

とか言ってしまうと、**僕みたいなキモオタに早口でつっこまれます**のでお気をつけください。
一般的に**メモリは主記憶装置**で、**ストレージというと補助記憶**のことを指します。

**メモリは一時保存が目的なので比較的に低容量(4GB~)**で、**補助記憶装置は長期保存が目的なので大容量(256GB~)**となります。

##処理装置 （演算装置＋処理装置）
処理装置は、**演算装置と制御装置をまとめた装置**のことで、コンピュータ全体に指示を出しながら管理統制を行う**脳みそ**のような装置です。これが所謂CPUです。

CPUはCentral Processing Unitの頭文字を取ったもので、日本語訳すると『**中央処理装置**』という意味になります。これは「**コンピュータの中心になって、全体の管理統制をするもの**」という機能をよく表した名称だなぁと感心しています。
↓見た目はこんな感じ
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255713/3fa75724-56a9-770c-aa2e-d5bd6377c058.png)


**制御装置は他装置とのやりとり/命令系統**を担い、**演算装置はとにかく計算をしまくり**ます。
プログラムを実行する時は制御装置が主記憶装置から情報や命令を取り出し、演算装置がそれらを計算・処理するという流れになります。

そのため、とにかく**CPUが高速に動いてメモリが大容量**であれば、高性能なコンピュータと言ってしまっていいでしょう。

この辺の流れはプログラミングをする上でも大変重要になってきますので、本格的にコンピュータアーキテクチャを学ばれたいという方は更に踏み込んで学ばれることをオススメいたします。
個人的なお勧めはO'Reillyの[コンピュータシステムの理論と実装](https://www.oreilly.co.jp/books/9784873117126/)です。（アフィリエイトリンクじゃないです）

##出力装置
最後は出力装置です。
入力装置から処理装置などの装置を通ってきたデータは、この出力装置で**使用者に認識できる形で出力**されます。

代表的なものは、ディスプレイ、スピーカー、モーターなどです。

#まとめ
ということで、ざっくりとコンピュータについてまとめてみました。

コンピュータ（特にノイマン型）は、**入力装置・演算装置・制御装置・記憶装置・出力装置からなる電子計算機のこと**だと説明すれば一応間違ってはいない説明になるかと思います。

個人的には今回みたいなコンピュータアーキテクチャとか、組み込みプログラミングとかが好きなので、もっとこれらの良さを伝えられるようなことができればと思っています。