Dividing By Zero

ソフトウェアをはじめとする技術に関する備忘録と日々のメモ書き。

コンピュータとプログラム

はじめに

 Googleなどで「プログラミング 入門」と入力するといきなりプログラムを書く記事が出てきたりするが、初心者には敷居が高い。物事を理解するには「なぜ」それが存在し、「どう」それが役立つのかという背景から説明からしたほうが良いのではないか。プログラミングが義務教育に組み込まれるという話も出てきているため、この記事では「プログラムとは何か」という事を説明し、知識のない方でも理解できるように解説を行いたい。

コンピュータとプログラムの始まり

f:id:na-777:20160816002548j:plain

ENIAC - Wikipedia

 この写真はアメリカ陸軍で開発されたElectronic Numerical Integrator and Computer (ENIAC:エニアック)という機械で「世界最初の汎用電子式コンピュータ」と言われている。このコンピュータは弾道研究室での砲撃射表の計算で使用されていた。計算? それ以前は計算はすべて紙に書いたり、そろばんなどを使って計算したのか?  というと、そうではない。

f:id:na-777:20160816002829j:plain

 計算機の歴史 - Wikipedia

  ENIAC以前にも計算機はあった。ダイヤルや歯車を使用し、レバーを回すことによって四則演算を行う機械式計算機などがそれだ。(電子式アナログコンピュータなどもあったがこれは省略する) しかしこれらの計算機は、加算、減算、乗算、除算などの計算のみであったり、特定用途の計算(測量や天体観測など)に特化したものが多かった。以前の計算機とどう違うかを知るために、ENIACの機能を見て行こう。

ENIACが持つ機能の概要

  • [入出力] 必要な数値の入力、計算結果の出力などを行う
  • [記録処理] 入力された数値を記憶する
  • [計算処理] 記憶した数値を使って加減算を行う
  • [分岐処理] 特定の条件によって実行する機能を変更する
  • [反復処理] 特定の条件になるまで特定の機能を繰り返し実行する
  • [実行順序] 各機能を好きな順番に並べて実行する機能

 なるほど。何がどう便利なのかよくわからない。 ENIACに問題を解かせるとき、これらの機能をどう使うのか?

簡単な問題を解かせる

問題

 積載量1トン(1000Kg)のトラックが存在する。それに対して荷物が複数存在する。ここでは10Kgの荷物Aが30個、20Kgの荷物Bが20個、30Kgの荷物Cが10個あるとする。すべての荷物を1台のトラックに載せきれるか否かのチェックと、載せきれない場合、何台のトラックが必要になるか計算したい。

  非常に簡単な問題だ。ENIACで解く前に自分で解いてみよう。この問題は「1台のトラックに荷物をすべて載せきれるか否か」と「もし載せきれない場合トラックが何台必要になるか」を計算するものだ。まず次の計算をする必要があるだろう。

  • 荷物Aの総重量 = 荷物Aの重量×荷物Aの個数
  • 荷物Bの総重量 = 荷物Bの重量×荷物Bの個数
  • 荷物Cの総重量 = 荷物Cの重量×荷物Cの個数

さてそれぞれの計算ができたので次は荷物の総重量を計算しよう。

  • 荷物の総重量 = 荷物Aの総重量 + 荷物Bの総重量 + 荷物Cの総重量

総重量を求めることができた。総重量が1トンを越えなければ終わりだ。だが1トンを超えている場合は、次の計算を行うだろう。

  • 必要トラック台数 =  切り上げ(荷物の総重量 ÷ 1000kg)

 よし、解き終えた。さて次はENIACに・・・おや?  聡明な皆さんならお気づきであろう。ENIACが持つ[入出力処理]、[記録処理]、[計算処理]、[分岐処理]、[反復処理]などの機能は人が何等かの計算問題を解くときに必要な要素である。適切な[実行順序]によってより様々な問題を解くことが可能だ。(乗算、除算がないのではと思われるかもしれないが、これは[反復処理]と、[計算処理]の加減算を用いて計算できる)

 ENIACでは先ほどの問題を[実行順序]と問題を解くのに必要な数値(ここでの数値は荷物の数量や重量を指す)を[入力]しておけば計算を行える。また[実行順序]を変えることで機械に対し、人間が今まで説いていた問題を幅広く行わせることができる。 

 論理回路の登場

これらの計算は機械の中でどう行われるのだろうか。仕組みを簡単に見て行こう。

f:id:na-777:20160816003143p:plain

論理回路 - Wikipedia

 ENIACの中は論理回路と呼ばれるもので構成されている。詳しい内容は長くなるのと筆者が解説しきれる自信がちょっとないので、端的に言うと入力する電圧の強弱で出力の内容が変化する回路である。電圧がしきい値と呼ばれる値より大きい場合は1を用い、電圧がしきい値より小さい場合は0を用いて表現する。

 論理回路にはAND、OR、NOT、XORなどの種類があり、種類によって出力内容が異なる。各回路の特性はリンク先を見てほしい。

 実はこの論理回路の組み合わせによって、先ほどのENIACが持つ各機能を表現することができる。例えば[計算処理]は加算器と呼ばれる回路、[記憶処理]はフリップフロップと呼ばれる回路などといった具合である。

 ただこれらの回路は0もしくは1(電圧の異なる電気信号)を用いないと計算ができないため、通常の計算で使用される10進数ではなく、0と1のみを使った2進数を使用する。つまり[入出力]や[実行順序]はすべて2進数を使って記述される。これを機械語という。

 プログラムの実態とは

 さて[入出力]や[実行順序]が機械語で記述されるのが分かったが・・・正直これは人には扱いづらい。0と1の羅列を表す電気信号をひたすら入力し続けるのは酷だ。そこでこの機械語を分かり易い文字列として表現することにした。

f:id:na-777:20160622215024p:plain

マイコンという名のLSIを知る ―― ディジタル機器に不可欠なデバイスの利点と仕組み|Tech Village (テックビレッジ) / CQ出版株式会社

  そう、これがプログラムだ。ENIACを作った科学者たちはおそらくこう思ったはずだ。「これで面倒な計算から解放されて、研究に集中できる」。またこれを発展させノイマン型コンピュータを作ったジョン・フォン・ノイマンは「これで世界に2番目に計算の早い奴ができた」とか言ったとか言わなかったとか。

 どちらにせよ人がすべき仕事、解決すべき問題を機械にやらせるためにコンピュータとプログラムは発明された。

 まとめ

  • コンピュータとプログラムは人の代わりに問題を解かせるために生まれた
  • コンピュータは論理回路に電気信号を流すことによって計算を行える
  • 電気信号(電圧の強弱)を表すのに0と1で表現される機械語を用いる
  • 機械語は人が扱いづらいため、プログラムという形で記述できるようにした
  • プログラムとはコンピュータへ与える仕事の[実行順序]である