もしそういう条件ならば

コンピュータは人間が書いた命令文を1/0のコードに変換しておき、メモリに読み込んで実行します。でも、そのプログラムも紙テープのように順番に進んでいくだけでは、結局あらかじめ定められたことしかできません。いろんな条件をこなす秘訣とは?

だいたい、世の中はじめから結末が分かっているなんてことはそう沢山はありません。物事が進むにつれて、いろいろな選択が行われ、一つのストーリーが生まれるのです。例えば、ゲームだって、得点が1000点を越えたら次のステージに進み、そうでなければゲームオーバーになるというような場面がありますよね。だから、プログラムを多様な目的のために使えるようにするためには、「条件に応じて」働きを変える仕組が必要です。

プログラムの実行を考える前に、メモリについておさらいをしておきましょう。メモリは例えていうと小さな箱がたくさん集まったもので、箱1つが1バイトの情報を格納します。それぞれの箱には通し番号が振られ、その番号によって特定の箱の内容を読み出したり、そこにデータを書き込んだりすることができるのです。

この番号のことをアドレス(番地)と呼び、8MBならば約800万番までのアドレスがあらかじめ与えられています。普通のメモリに使われるRAMとはRandom Access Memoryの略ですが、これはどんな番地からでも自由にデータを取り出すことができるという意味です。紙テープのように端から順番に読む必要がない。これがメモリの重要な特徴です。

メモリにプログラムを格納すると、CPUはそこから命令を読みとって実行していくということを前回お話ししました。CPUの中には、次にどの番地の命令を実行するかを記録しておくカウンターが用意されています。一つの命令を実行すると、このカウンターが自動的に繰り上がり、それに従って次の命令を読みとって実行するというサイクルが繰り返されているのです。ですから、普通の状態では、CPUは紙テープの命令と同じくメモリ中の命令を順番に実行していくことになります。

では、このカウンターの番号を任意に変更できれば、プログラムの流れも思うように変えることができるのでしょうか? そう、実はCPUは足したり引いたりする算術計算のほかに、命令カウンターの番号を変更する(つまりアドレスを指定する)ための命令を持っています(RAMならばどんな番地が要求されても平気ですね)。これを使って、命令の実行順序を変えたり、ほかのプログラムに主導権を渡したりすることが可能なのです。

さて、これだけではまだ「条件に応じて」命令を変更することはできません。そのためには、データの大小を比べたりする比較命令に登場してもらう必要があります。比較とアドレス指定を組み合わせることで、いろいろな条件に応じて異なる命令を実行させることがはじめて可能になるのです。

最初のゲームの例を考えてみましょう。1000点なければ終了という場面です。ゲームがここまで進んだら、プログラムはメモリに記録されている得点データと1000という数字を比較します。そして、次にアドレス指定命令を使って、得点が1000点以上であれば命令カウンターをXXX番地にし、そうでなければYYY番地に設定するわけです。ここで、XXX番地には次のステージをプレイするためのプログラムを置き、YYY番地には「残念でした」と表示してゲームを終了するプログラムを置いておけば、狙い通りのゲームになりますね。

(a program image)

もちろん、ここでXXXやYYYの具体的なアドレス指定を自分で行う必要はありません。例えばハイパーカードの言語であるHyperTalkならば、

    if YourScore > 1000
    then NextStage
    else GameOver

というようなスクリプト(人間に分かるプログラム言語)を記述するだけで、アドレスの設定などはコンピュータが行ってくれます。

比較とアドレスの指定は強力な仕組みです。これを使えば、条件が満たされるまで同じ作業を何万回も繰り返すようなプログラムを作ることができますし、プログラムをある特定の作業を行う小さなグループに分けておき、便利な道具箱のように必要なときに取り出して使うこともできます。これらを組み合わせることで、さまざまな目的に利用可能な汎用プログラムが作られるようになり、多彩なアプリケーション(応用)プログラムが誕生したのです。

(Beginners' Mac 1996/9号)