「コンピューターの世界は0と1だけ」をふわっと理解する

# これは何？
ざっくりとしたコンピューターの歴史と、コンピューターを構成する要素について学んで、よく言われる「コンピューターの世界は0と1だけ」という話が何となくわかるようになることを目指した記事です。

元々は別の記事の中の一節として書くつもりだったのですが、書き始めたら思いのほか筆が乗って長くなってしまったので、分けて公開することにしました。
わかりやすさ重視のため不正確な表現になってしまっている部分も多々あると思うので、気になったところがあれば是非コメントで教えてください。

# 注意事項
この記事の中でコンピューターと呼んでいるものは、身の回りで扱われているごくごく普通のコンピューター（スマートフォン、PC、ゲーム機など）のことを指しています。
広くコンピューター全般に対してこの記事に書かれていることが当てはまるわけではないので、その点ご了承ください。

# 目次
[計算機](#計算機)
[アナログとデジタル](#アナログとデジタル)
[論理回路](#論理回路)
[論理演算](#論理演算)
[ブール代数](#ブール代数)
[二進法](#二進法)
[ビット](#ビット)
[プログラム](#プログラム)

# 本編

## 計算機
今の日本でcomputerを日本語で言うと？と聞かれれば大抵の人はコンピューターでしょ？と答えますよね。しかし、大学のようなお堅い場所だとコンピューターサイエンスのことを計算機科学と呼ぶように、あえて訳語を当てるのであれば計算機という呼び方になります。
そして、このことからもわかるように、コンピューターのそもそもの出発点は計算をする機械でした。
暗号を解読したり、大砲の弾道計算をするのに使われていたんですね。

## アナログとデジタル
アナログとデジタルの違いを一言で言うなら、アナログは連続した値、デジタルは飛び飛び（離散的）な値を扱うということになります。
これだけだとなんのこっちゃという感じですが、例えば時計で考えてみると、アナログ時計の針は滑らかかつ連続的に動いていると思います。[^1]
[^1]: たまに針がカクカク動くものもありますが、あれはアナログ時計であってもデジタル的な表示をしていることになります。

なので普通の人は「今は9時30分45秒だな。」としか読み取れないところを、非常に目が良い人なら「今は9時30分45.897秒だ！」のようにより正確に値を読み取れます。

それに対してデジタル時計から読み取れる情報は時計がどの桁数まで表示しているかに完全に依存しています。例えば1秒刻みで表示されているデジタル時計ならばどう頑張っても小数点以下の秒数までは読み取れませんよね。[^2]
[^2]: 1秒と1秒の間隔から0.1秒単位くらいまで時間がわかる人もいるかもしれませんが、これは自分の中にある体内時計を使っているだけで、デジタル時計から読み取っているわけではないですね。

そんなわけで情報をより正確に表すことができるのはアナログなのですが、アナログには欠点があります。それは状況次第では必ずしも値を正確に読み取れないということです。
先ほどの話でいうと、秒針から秒数の小数点以下を読み取れる人がほとんどいないことはもちろんのこと、43秒なのか44秒なのかさえ、パッと見ただけではわからない人が大半でしょう。[^3]
[^3]: なんなら昨今ではそもそもアナログ時計を読むことさえできない人も増えているといいます。

一方のデジタルでは数字さえ知っていれば、誰の目から見ても同じように正確な値を読み取ることができますし、必要であればストップウォッチのように桁数を増やして、より詳細な値を表示することもできます。

前置きが長くなりましたが、実はコンピューターにもアナログとデジタルがあります。しかし、デジタルの方が扱いやすいよねということで[^4]、デジタルコンピューターが普及し、単にコンピューターというとデジタルコンピューターのことを指すようになりました。
[^4]: アナログ時計が今でも使われているように、アナログコンピューターも用途次第ではデジタルより優れていることがあるらしく、今でも研究を続けている人もいるようです。

意外に感じるかもしれませんが、アナログは人類には難しかったんですね。[^5]
[^5]: 理想的な環境が用意できればアナログはデジタルに勝る、という現象はオーディオの世界にもあります。デジタルで音楽を扱うと、本来連続的な情報である音を離散的に扱うことになるため、どうしても情報の欠損が生じてしまいます。（この欠損の程度はサンプリングレートという値に依存します。）しかしながら、レコードであればアナログな音の情報をアナログなまま扱うことができるため、最高の録音環境と再生環境を用意できればデジタルよりも音が良くなる！というマニアックなことをやっている人たちが世の中には存在します。

## 論理回路
コンピューターに限らず、電化製品は電気回路を持っています。
[豆電球に電池を繋いで光らすあれ](https://www.irasutoya.com/2019/04/blog-post_20.html)ですね。
さらに電気回路の中でも特に能動素子[^6]を利用した回路を電子回路と言います。
あの[緑色の基盤のやつ](https://www.irasutoya.com/2016/08/blog-post_69.html)です。
そして、実はこの電子回路にもアナログとデジタルがあるのですが、デジタル回路は論理演算を行う回路であることから論理回路とも呼ばれます。
[^6]: 小さな入力電流から大きな出力電流を得ることができる素子です。真空管や、あるいはトランジスタやダイオードに代表される半導体素子があります。楽器演奏や音響機器で使われるアンプにはこれが入っています。アンプはアンプリファイ（Amplify）という単語の略で、増幅させるという意味です。

## 論理演算
じゃあ論理演算ってなんなのかというと、論理を演算するから論理演算です。と言われてもさっぱりだと思うので順番に説明します。

まず論理というのは哲学で出てくるあれです。
例えば「我思う、ゆえに我あり」というのはデカルトの有名な命題ですが、この言葉は、仮にこの世の全てが偽物だったとしても「この世の全ては偽物なんじゃないか？」と考える自分が存在していることは否定できない、つまりそう考えること自体が自分自身の存在を証明している、みたいなことを言っていて、こういうAならばBだからCである、みたいに物事をつなげて考えることを論理と言います。

次に演算ですが、これは何かに何かをして、何かを作り出すことです。
具体的にいうと足し算とか引き算です。
なので、数字や記号を使って書けるのが演算の特徴ですね。

つまり論理演算というのは、「AならばBである」みたいな論理を、数字や記号を使ってあれこれしてやろう、というものです。

そして、こういう論理を数学的に扱ってやろうという学問のことを数理論理学と言います。

## 二進法
0,1,2,3,4,5,6,7,8,9と0から9までの10個の数字を使い、9までいくと、次は繰り上がって10と桁が一つ増える数の数え方を十進法と言います。

アラビア数字は10種類あるので、十進法を使うのになんの不便もないわけなのですが、もし数字が2つ、0と1しかない場合はどうやって数を数えれば良いのでしょう。

そこで二進法[^7]の出番です。0,1と数え、その次は10と桁が繰り上がります。
以降、11,100,101,110...と、0と1の二つの数字だけで数を数えることができます。
[^7]: 二進法の数え方自体は紀元前から存在していたようですが、数学的に二進法を確立させ、0と1で数を表すことにしたのは微分積分で有名なライプニッツさんです。

たぶん見慣れない数字の並びに気持ち悪さを覚えると思いますが、二進法の世界ではこれが普通です。法とはそういうものなのです。[^8]
しかし、十進法の世界に生きている私たちにそんなことを言われても困るので、10<sub>2</sub>のように、それが二進法であることを明示的に表記する優しい文化も存在します。

そして、このように二進法で表された数字のことを二進数と呼びます。
[^8]: 「悪法もまた法である」と言って毒を飲んで死んだソクラテスは有名ですね。また、ナチスドイツが行ったジェノサイドも当時の法に基づいて行われたことでした。

## ブール代数
代数というのは数字の代わりに文字を使う数学の一分野のことです。
x+1=3みたいなやつですね。

そしてブールさんが考えたブール代数というものがあります。
このブール代数は、0と1という二つの数字を使ってあれこれしてやろうぜというものだったのですが、二つしか値がないということは、YesとNo、真と偽のように論理と相性が良いわけです。

まあだから何なんだという感じですが、この理論が作られてからしばらく経った後、ブール代数と電気回路を合体させたいよーみたいなことを言い出す人たちが現れました。スイッチのONとOFF、電気が流れている流れてない、というように白黒はっきりさせられるところは確かにブール代数と相性が良さそうです。[^9]
[^9]: 実際には電圧の値のように一見0と1で表せられなさそうなものもあるのですが、こういうものに対しても、電圧が高いか低いかの二択で判断するといった手法を使ったりしています。そうすることで細かい値の変化（ノイズ）を無視することができ、より安定したシステムを作ることができるんですね。こういった特性のことを外乱の影響を受けづらいといい、デジタル回路の強みの一つです。

こうして、論理演算を行える回路、論理回路が生まれました。

そして、今日ではこのブール代数が組み込まれた論理回路を使うものが、コンピューターの主流となっています。

## ビット
前述の通りコンピューターもといブール代数を組み込んだ論理回路では、0と1という二つの数字しか扱えないので、数を数えるためには二進法を使い、そして二進数（binary）の一桁分（digit）のことを略してビット（bit）と呼んでいます。
ポケットモンスター、縮めてポケモン、みたいな感じですね。

これがコンピューターで扱われる情報の最小単位になります。

## プログラム
さて、ここまでコンピューターが二進法で数を扱うことを見てきましたが、それがなぜコンピューター上で様々なデータを扱えることに繋がるのかという疑問が残ります。
これを理解するためには、数字は必ずしも数字そのものとして解釈されないということを知る必要があります。

例えば、スパイ映画などではよく数字を使った暗号が出てきますよね。これはもちろん数字そのものに意味があるわけではなく、数字を使って、別の何かを表しているわけです。

あるいは身近なところでは、スーパーやファミレスなどで店員さんが「1番行きます」と言うと休憩に行くことを指していたりするそうです。

他にもモールス信号では-と・の二つの記号だけを使って、予め決められたルールに則って文字のやり取りをしています。これは0と1のみを扱うコンピューターとよく似ていますね。

このように予め決められた手順（プログラム）によって、様々な命令や、データを数字に対応させて扱うことで、コンピューターは物理的には0と1という二つの状態しか持っていないにも関わらず、まるで魔法のように様々なことを実現できるようになったのでした。

# おわりに
いかがだったでしょうか。

ふわっと理解すると書いた割には、色々な用語が出てきて話がわかりづらいと感じた方もいたかもしれません。
あるいは、ここに書いてあることは明らかに間違っている、と思った方もいるでしょう。

そのような方たちは、ぜひ目の前にあるコンピューターを使って、気になったキーワードについて調べてみてください。

あえてここで書くようなことではないかもしれませんが、人は何かを学ぶ時に一度で完璧に理解することはなかなか難しいです。特に、それが複雑なものであれば尚更です。

同じことに対して違った角度から説明しているさまざまな情報リソースに触れることで、少しずつ対象への理解が深まっていきます。
いうまでもなく、この記事を書いた私自身も未だ学びの途中です。

この記事がコンピューターについて学ぶきっかけの一つになってくれれば嬉しく思います。
ご精読ありがとうございました。