1. アナログとデジタル
私たちの身の回りの世界は、本来連続的に変化するアナログな性質を持っています。音の大きさ、光の明るさ、温度の変化など、自然界の現象は無限に細かな値をとることができます。
一方、コンピュータの世界はデジタルです。デジタルとは、連続的な情報を離散的な値に置き換えて表現する方法です。例えば、アナログの音声を録音する際には、一定の時間間隔で音の強さを測定し、その測定値を数値として記録します。
このデジタル化によって、情報を正確に保存・伝送・処理することが可能になりました。そして、このデジタル情報を表現するための最も基本的な方法が「2進数」なのです。
2. 2進数がはじまり
デジタル情報を情報交換をするためには電子的信号に変換して送る必要があります。
その最も基本となる信号はオン(on)かオフ(off)かで表現します。これは0と1で表現され、2進数(binary number)とよびます。
個々の数字は略して「ビット(bit)」といいます。正式には「バイナリ・ディジット(binary digit)」です。
電子的信号は、電圧で表現されます。例えば0Vをオフ、5Vをオンとして表現します。1度に2つの状態(1ビット)を送れます。スイッチのオン・オフだけなので簡単に思えます。
3. 4進数ではダメなのか?
スイッチのオン・オフだけで状態を送ろうとすると、一度にひとつの状態(オンかオフか)しか送れません。これを0Vを0、2Vを1、4Vを2、6Vを3とすれば、一度に4つの状態を持つことができるので効率が良さそうです。
さらに8つの状態、16の状態などとより細かくしていけば、アナログにより近くなりそうです。しかし、実際にはそうなっていません。なぜでしょうか?
それには二つの理由があります。
一つ目は、真空管やトランジスタといった電子部品は、スイッチのオン・オフを切り替えるのが得意で1bitを表現するコストが安かったことです。
2bit単位で状態を持つには電圧をみて値を判別する処理が必要となります。この処理にかかるコスト(処理時間、構造上の複雑さ)を考えると1bitの方が安かったということです。
二つ目は、オン・オフの2つの状態で状態を表すのは論理演算(ブール代数)との相性が良かったことです。
コンピュータ内部は、トランジスタの固まりになっているのでスイッチとしても論理演算としても2進数を用いるのが安くて合理的だったのです。
4. 4進数を用いた例
SDカードのMLC(Multi Level Cell)では4進数でデータを記録しています。これは安く多くのデータを記録したいという要望に応えるために開発されました。しかし、複雑さゆえに、長く使っていると電圧が不安定となりデータが読み出せなくなったりすることが多くなります。そのため、音楽データや写真の一時保管といった大容量が求められるけれども、データ破損に対してはある程度許容できる場合に使われています。
下の図で示すとおりそれぞれのデータを表す電圧の範囲が狭くなって正確な電圧制御が必要になります。

一方、2進数で記録しているSLC(Single Level Cell)方式のSDカードは、記録できるデータ量は少なくなりますが記録の信頼度は高くなります。また長期間の保存にもMLCより適しているので、ドライブレコーダーでの記録媒体などに使われています。
下図で示したように、電圧もあり/なしに近い形で制御できるので信頼性が高まります。

このように適材適所で使われています。
5. コンピュータは2進数(機械語)で動いている
コンピュータは「命令(instruction)」と呼ばれる「指示」で動きます。この「指示」も数字で表現され2進数で与えられます。たとえば「2つの数字を足す」命令を「1000110010100000」のように2進数で表現します。これを「機械語(マシン語)」と言います。
その昔は、これを読んだり書いたりできる職人エンジニアがいたそうです。
6. 機械語からアセンブリ言語へ
「機械語」は、特殊な職人エンジニアはわかったとしても、非常にわかりにくいです。そのため2進数を翻訳するプログラムが開発され「アセンブラ(assembler)」と名付けられました。
先の「2つの数を足す」という命令を「add A, B」と表現し、2進数に翻訳することにしました。これを「アセンブリ言語(assembly language)」と言います。これを「低水準言語」と呼びます。

7. アセンブリ言語から高水準プログラミング言語へ
「アセンブリ言語」が出ると「機械語」に比べて、人間が認識しやすくなりました。しかし、これでも「機械語」に1対1に対応させないといけないためプログラムを書くのは大変な作業でした。そこで考えられたのがより水準の高い表記法によって記述されたプログラムです。
この「機械語」を「アセンブリ言語」に翻訳するプログラムを「コンパイラ(compiler)」と呼び、プログラミング言語を「高水準プログラミング言語(high-level programming language)」と言いました。「コンパイラ」でアセンブラに翻訳する作業を「コンパイル(complie)」と言います。
これによって「add A, B」は「A + B」と書けるようになりました。
「A + B」と書けば「add A, B」に翻訳され「1000110010100000」の機械語に翻訳されます。

8. 高水準プログラミング言語の開発とその利点
初期には「C言語」が用いられましたが、科学技術計算用には「FORTRAN」が、事務処理用には「COBOL」が開発され、記号処理用には「LISP」が開発されました。
この第Ⅰの利点は、英語と代数式を用いるため、プログラマは自然言語に近い言語で思考でき、得られる結果も意味のわかりにくい記号の羅列ではなくテキストに近いものになりました。
第2の利点は、プログラマの生産性が向上することです。機械語を用いるより処理内容を表す行数が減り簡単・明瞭に書くことができます。
第3の利点は、プログラムをコンピュータから独立させることができる点です。機械語やアセンブラはコンピュータに依存したため、他の「アーキテクチャ」のコンピュータで同じ処理をさせようとしてもすべて新たに書く必要がありました。しかし、「高水準プログラミング言語」で記述されたプログラムは他のアーキテクチャのコンピュータでも動かしやすいものとなりました。
9. 参考情報
0と1のコンピュータ世界 バイナリで遊ぼう!(Amazonアソシエイトリンク)
※この記事にはAmazonアソシエイトのリンクが含まれています。購入された場合、収益の一部を得ることがあります。