2進数の理解が必要なわけ

2進数がはじまり

 電子的なマシンと情報交換をするためには電子的信号を送る必要があります。

 その最も基本となる信号はオン(on)かオフ(off)かで表現します。これは0と1で表現され、2進数(binary number)とよびます。

 個々の数字は略して「ビット(bit)」といいます。正式には「バイナリ・ディジット(binary digit)」です。

 電子的信号は、電圧で表現されます。例えば0Vをオフ、5Vをオンとして表現します。1度に2つの状態(1ビット)を送れます。

4進数ではダメなのか?

 これを0Vを0、2Vを1、4Vを2、6Vを3とすれば、一度に4つの状態を持つことができるので効率が良さそうです。

 では、なぜそうなっていないのでしょうか?

 それには二つの理由があります。

 一つ目は、真空管やトランジスタといった電子部品は、スイッチのオン・オフを切り替えるのが得意で1bitを表現するコストが安かったことです。

 2bit単位で状態を持つには電圧をみて値を判別する処理が必要となります。この処理にかかるコスト(処理時間、構造上の複雑さ)を考えると1bitの方が安かったということです。

 二つ目は、オン・オフの2つの状態で状態を表すのは論理演算(ブール代数)との相性が良かったことです。

 コンピュータ内部は、トランジスタの固まりになっているのでスイッチとしても論理演算としても2進数を用いるのが安くて合理的だったのです。

4進数を用いた例

 SDカードのMLC(Multi Level Cell)では4進数でデータを記録しています。これは安く多くのデータを記録したいという要望に応えるために開発されました。しかし、複雑さゆえに、長く使っていると電圧が不安定となりデータが読み出せなくなったりすることが多くなります。そのため、音楽データや写真の一時保管といった大容量が求められるけれども、データ破損に対してはある程度許容できる場合に使われています。

 下の図で示すとおりそれぞれのデータを表す電圧の範囲が狭くなって正確な電圧制御が必要になります。

4進数信号の電圧許容範囲

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

 下図で示したように、電圧もあり/なしに近い形で制御できるので信頼性が高まります。

2進数の信号の電圧許容範囲

 このように適材適所で使われています。

コンピュータは2進数(機械語)で動いている

 コンピュータは「命令(instruction)」と呼ばれる「指示」で動きます。この「指示」も数字で表現され2進数で与えられます。たとえば「2つの数字を足す」命令を「1000110010100000」のように2進数で表現します。これを「機械語(マシン語)」と言います。

 その昔は、これを読んだり書いたりできる職人エンジニアがいたそうです。

機械語からアセンブリ言語へ

 「機械語」は、特殊な職人エンジニアはわかったとしても、非常にわかりにくいです。そのため2進数を翻訳するプログラムが開発され「アセンブラ(assembler)」と名付けられました。

 先の「2つの数を足す」という命令を「add A, B」と表現し、2進数に翻訳することにしました。これを「アセンブリ言語(assembly language)」と言います。これを「低水準言語」と呼びます。

アセンブリ言語から機械語へ

アセンブリ言語から高水準プログラミング言語へ

 「アセンブリ言語」が出ると「機械語」に比べて、人間が認識しやすくなりました。しかし、これでも「機械語」に1対1に対応させないといけないためプログラムを書くのは大変な作業でした。そこで考えられたのがより水準の高い表記法によって記述されたプログラムです。

 この「機械語」を「アセンブリ言語」に翻訳するプログラムを「コンパイラ(compiler)」と呼び、プログラミング言語を「高水準プログラミング言語(high-level programming language)」と言いました。「コンパイラ」でアセンブラに翻訳する作業を「コンパイル(complie)」と言います。

 これによって「add A, B」は「A + B」と書けるようになりました。

 「A + B」と書けば「add A, B」に翻訳され「1000110010100000」の機械語に翻訳されます。

高水準プログラミング言語をコンパイル(翻訳)してアセンブリ言語へそして機械語へ

高水準プログラミング言語の開発とその利点

 初期には「C言語」が用いられましたが、科学技術計算用には「FORTRAN」が、事務処理用には「COBOL」が開発され、記号処理用には「LISP」が開発されました。

 この第Ⅰの利点は、英語と代数式を用いるため、プログラマは自然言語に近い言語で思考でき、得られる結果も意味のわかりにくい記号の羅列ではなくテキストに近いものになりました。

 第2の利点は、プログラマの生産性が向上することです。機械語を用いるより処理内容を表す行数が減り簡単・明瞭に書くことができます。

 第3の利点は、プログラムをコンピュータから独立させることができる点です。機械語やアセンブラはコンピュータに依存したため、他の「アーキテクチャ」のコンピュータで同じ処理をさせようとしてもすべて新たに書く必要がありました。しかし、「高水準プログラミング言語」で記述されたプログラムは他のアーキテクチャのコンピュータでも動かしやすいものとなりました。(これについては別に詳しく解説します)