計算機は働き者

前回は、単純なスイッチを組み合わせることで、足し算やもっと複雑な計算が行われることをお話ししました。しかし、計算式ごとに別々の回路を作るのは大変です。いろんな仕事をこなせる、有能な計算機はどうやったら実現できるでしょうか?

世界最古の計算機は、ギリシャのサラミス島で発見された「アバカス」です。何本もの筋の入った大理石の上に小石を並べて算盤のように計算したといわれます。パスカルによる機械式計算機の発明などを経て、1936年にイギリスのアラン・チューリングは、XとOだけが書き込まれた紙テープと簡単な装置であらゆる記号操作が可能である(つまり計算ができる)ことを示す「チューリング・マシン」を発表しました。

最初のディジタル・コンピュータは、1946年にアメリカのペンシルバニア大学で誕生したENIACです。このプロジェクトに携わったフォン・ノイマンはこれを発展させて「プログラム内蔵方式」にもとづいた計算機EDVACを開発。今日のコンピュータはすべてこの方式にのっとって作られているので「ノイマン型」とも呼ばれます。

(number crunching illust) 突然歴史の話を持ち出したのは、前回とりあげた足し算の装置からコンピュータへの道のりを考えてみたかったからです。

論理回路を組み合わるといろいろな計算が実現できます。しかし、回路の特定の組み合わせは特定の計算手順に対応するので、いったん配線を行うとその装置はある決まった計算専用になってしまいますね。これを別の目的に使うためには、線を外して接続を変更しなければなりません。最初のコンピュータENIACは、まさにこのような方法で異なる計算をこなしていたので、計算そのものよりも配線スイッチの切り替えの方がはるかに大変な作業でした。

「ノイマン型」とは、この計算手順の組み替えを配線の変更で行うのではなく、記憶装置に蓄えた指示に従って電子的に行おうというもの。プログラムをメモリに蓄える(store)ところから「プログラム内蔵(stored program)方式」というわけです。この考え方は、外部から指示を与えて多様な動作を行わせるという点で、「チューリング・マシン」の延長線上にあるといえますね。この仕組みによって、コンピュータはあらゆる計算をこなせる、無限の可能性を持った現代の玉手箱となったのです。

プログラム、つまり計算の手順をメモリに内蔵するとはどういうことなのでしょうか。

「チューリング・マシン」がXとOの並んだ紙テープで指示を与えたように、コンピュータでは1/0の並びで特定の計算を表します。たとえば1101は足し算の指令だというように。すべての基本的な演算に対してこういう1/0からなる命令を用意し、CPU内部にはそれぞれの命令に対応する回路の組み合わせがあらかじめ設定されているのです。

CPUはメモリの内容を順番に(紙テープのように)読みとっていって、そこに記録されている指示に従い、やはりメモリのどこかにある数値を取り出し、それに対する計算を行い、その結果をまた次の指示に従って別の場所に納めたりします。このような手順を連ねたものがプログラムで、それは全て1/0で表されてメモリに「内蔵」されるのです。アプリケーションを起動するということは、このプログラムをディスクから読み出してメモリに格納し、開始位置から順番に命令を実行し始めることに他なりません。

ここで注目したいのは、命令(プログラム)も文字や数字(データ)も、同じく1/0で表現されメモリに納められるという点です(CPUは状況に応じてそれが命令かデータかを判断します)。とすると、うまい規則を考えれば、一連の文字データを処理し、その結果としてある命令に相当する1/0の組み合わせを得ることも可能なはずですね。これは、コンピュータが文を解析し、アウトプットとして自分自身のための命令(プログラム)そのものを生成できるということを意味します。

プログラミング言語は、まさにこのメカニズムを用いて、人間に理解できる文字で書かれた命令文を、コンピュータが実行可能な1/0のプログラムに翻訳しています。コンピュータがコンピュータのためのプログラムを作るというメタレベルへの飛躍によって、計算機に多様で複雑な仕事をさせることが容易になり、多くの人々がコンピュータの能力を利用できるようになったのです。

(Beginners' Mac 1996/8号)