どもバスクリンです(‘ω’)
前回は、コンピュータの決まり事や仕組みを知っていると面白いアイデアが生まれるかもしれないという話をしました。
そもそもコンピュータの「決まり事」や「仕組み」は誰がどうやって作ったんでしょう?
ビル・ゲイツ?
スティーブ・ジョブズ?
WindowsならMicrosoftが仕様を決めていますし、MacならAppleが決まり事を作っています。ただし、それだけでは今のこのコンピュータの発展はありませんでした。今回はのコンピュータ業界の発展に大きく貢献した「決まり事」を見ていきたいと思います。
「2進数」の概念
パソコンは0と1で動いています。
2進数の歴史は古く、紀元前のインドで使われていたという文献があります。電気や、磁気は2値として扱うことができるので2進数と相性が良いので現在のコンピュータで使用されています。8進数、16進数は2進数を人間さんがわかりやすく表記するために便宜上使っている表現です。基本は2進数です。
「N進数」ってなんか難しいと思っている方がいたら安心してください。
普段の生活で、皆さんは色々なN進数を使っています。
- 60秒で1分、60分で1時間の「60進数」
- 7日で1週間という「7進数」
- 24時間で1日の「24進数」、PM1時と表記すれば「12進数」
- 「22時は午後10時」の「12進数と24進数の変換」
なども自然に使っています。極めつけは、28日、30日、31日で「1カ月」、4年に1度は29日で1カ月なんていうよくわからない「N進数」も平気で使っています。
直接2進数を、仕事で使う場面はあまりないと思いますが基本的なことなのでぜひ覚えておいてください。
「ブール代数」の登場
1854年、プログラムを作る時に必要な概念「ブール代数」がジョージ・ブールによって発明されます。プログラム言語ではboolean, bool, BOOLとか言われる「true(真)」か「false(偽)」を表すアレです。
それまでのコンピュータは、文字通り「計算機」として数値を扱っていました。この「ブール代数」の登場によって計算機から複雑な「制御」ができるコンピュータの基礎の概念ができました。
ブールの功績は「True」と「False」を定義したことではなく、複雑な命題論理も「ブール代数」で表現可能だと証明したことです。単項演算子のNOT、論理積のANDや論理和のOR、排他的ORも「ブール代数」の中で考えられました。
ブール以前にも真偽の概念はありましたが、ブールはそれを体系化しました。ブール代数は「2値倫理」として現在のコンピュータの基礎となりました。
「2値倫理」と「3値倫理」
余談ですが真と偽の2値倫理の話をしたので、3値倫理の話もしておきます。「NULL値」等の「真、偽以外の値」を考慮したものを「3値倫理」と言います。SQLのNULLやC言語で使われるNULL等です。
これは1度の真偽比較だけでは判断できないため「NULLチェック」や「NVL処理」が必要になってきます。この処理を忘れていることが非常に多く、プログラムのバグの多くや脆弱性の多くはこの3値倫理の考慮漏れが占めています。
NULL参照(ヌルポ)を発明したアントニー・ホーアは2009年に「NULL参照は過去40年間で10億ドル相当の苦痛と損害を引き起こした」と言っています。1965年にALGOL 60のコンパイラを開発していたホーアは「未初期化の参照」を安全に扱うためにNULL参照を発明してしまいました。この決断が今日のコンピュータ業界に大きな影響を与えてしまいます。
ホーアは苦痛と損失が出た言っていますが、NULL参照を適切に扱えないプログラマやうっかりミスしてしまったプログラマが多すぎただけです。良いシステムはこのブール代数と3値倫理の扱い、NULL参照の有効な利用ができていると思います。
ホーアはNULL参照の他にもクイックソートの発明やプログラムの正当性を推論するためのホーア論理、平行プロセス間通信のCSPの開発など現在のコンピュータ業界にはなくてはならない技術を発明しています。
NULL参照は生まれて50年ちょっとくらいです。こうやって考えると今のコンピュータの世界ってまだまだ生まれて間もないですね。Windowsでさえ20年ちょっとです。
「チューリングマシン」の概念
1936年 アラン・チューリングが「計算可能数について」の論文で「チューリングマシン」の概念を提唱しました。この概念を簡単に説明すると「計算可能かどうかを証明する理論」です。
チューリングマシンという仮想のマシンの構成は以下の通りです。
- 無限に長いテープ(補助記憶装置)
- テープからデータを読み書きするヘッド
- マシンの「状態」を保持するメモリ(主記憶装置)
これらの装置で以下の動作を行います。
- ヘッドからデータを読み込む
- 1のデータと「状態」の組み合わせで次のいずれかの動作を決定します
・ヘッドの位置にデータを書き込む
・メモリの状態を変更する
・ヘッド位置を前後どちらかに移動する - 1~2の動作を「状態」が「停止」になるまで繰り返す
この処理だけで解ける問題を定義できたことです。
たったこれだけですが、この仮想マシンは現在のCPU、メモリ、HDDなどコンピュータの考え方のベースになっています。コンピュータができる前にコンピュータの仕組みと限界を証明したチューリングは、現在のコンピュータの生みの親と言っても過言ではありません。現在のコンピュータと呼ばれているプログラム内蔵方式(メモリに読み込まれたプログラムを実行する方式)や、コンパイラ(状態の遷移を決定する有限オートマトン)の基礎になりました。
チューリングマシンを使って以下のように命題は分類することができます。
- チューリング可
チューリングマシンで計算可能な問題はすべてコンピュータで解ける - チューリング不可
チューリングマシンで計算できない問題は、現在のコンピュータを使っても計算できません - チューリング困難
時間をかければチューリング可だが、現実的な有限時間で解くことができない問題
チューリング困難な問題領域を解くために量子コンピュータなどが注目されています。
「ノイマン型コンピュータ」の登場
1945年にジョン・フォン・ノイマンが「ノイマン式コンピュータ」を発表しました。チューリングの発表したチューリングマシンは無限のテープや論理的なもので実用的な物ではありませんでした。また、その当時の計算機は配線を変えてプログラムを変更するタイプでした。ノイマンは、2進数、ブール代数、チューリングマシンの概念をCPUや主記憶装置、補助記憶装置などを使って形にしました。
主な特徴としては、
- 2進数を扱う
- CPUが主記憶装置に書かれたプログラムを実行する
- 主記憶装置の位置を覚えておく「プログラムカウンター」を内蔵している
- テープの位置やメモリの場所は「アドレス」を指定してアクセスする
- プログラムやデータは補助記憶装置に保存して永続化する
- CPUとメモリのデータ転送には「バス」と呼ばれる転送装置を使用する
などがあります。
現在のコンピュータは、殆どがこのノイマン型コンピュータです。
プログラム内蔵方式のアイデアは世界で初めてのコンピュータと言われるENIACで既に考えられていました。ノイマンはこのENIACの後継機であるEDVACの開発を行い、プログラム内蔵方式を論理的にまとめて自分の名前で発表しました。ノイマンとチューリングはプリンストン高等研究所で親交もあったことから、この二人の功績は大きく伝えられています。
ノイマン型の良い点は、ハードウェアの進歩によりチューリング可能な計算領域の可能性を広げることができる点でした。しかし現在では、ノイマン型のコンピュータは「バス」を通してメモリにアクセスするためバスの転送速度が遅いというボトルネックを抱えているため、チューリング可能な計算領域に限界が見えてきています。
ノイマン型のボトルネックの解決策として、ニューロコンピュータや量子コンピュータが研究・開発されていますが、実用化まではもう少し時間がかかりそうです。量子コンピュータでできることは、現在のコンピュータと何も変わりません。今まで有限時間内ではチューリング不可能とされてきたような膨大な計算が短時間でできるようになるだけです。またFPGAも非ノイマン型のコンピュータとして実用化され注目を集めています。
まとめ
今回は現在のコンピュータが登場するまでの重要な「決まり事」な部分を簡単にまとめてみました。
まだコンピュータの登場から100年も経っていなく、現在のコンピュータの形になったのはつい最近です。私が高校生くらいの時はまだWindowsもなく、真っ黒い画面に白い英語を打ち込んでいました。「海外ではC++というオブジェクト指向言語ができたらしい」と聞いたのも高校生くらいでした。
まだまだコンピュータの世界は発展していきます。現在のデバイスやアプリケーションもこれから、どんどん進化していくのでとても楽しみです。