植物 植物
初心者講座:機械語

AOBA's Information Processing Education



1997/12/28

注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。

注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。


 第3回目の講座で、「プログラムなんてみんなが考えるより、ずっと単純なものですよ。」と言いました。ところが前回(第8回目の講座)、「...プログラムがそれに比較して強烈に複雑なため...」とも言いましたね。
 おいおい、言っていることが違うんじゃないか、と思った方も多いと思います。

 プログラムは単純なのか、複雑なのか。
 それを答える前にまず、プログラムとは何かを簡単に整理します。

 次の流れ図を見てください。これは、変数Aの値と変数Bの値の合計を変数Cに求める流れ図です。

図2

 これをプログラムにしましょう。
 とは言ったものの、実は(皆さんも知っているとは思いますが)この流れ図の処理を行うプログラムは、一つだけではありません。プログラム(言語)の文法の違いにより、いくつかの書式があるのです。例えば情報処理試験で出題されるプログラム言語だけでも、COBOL,FORTRAN,C,CASLの4種類があり、世の中には、まだまだたくさんの言語が存在します。
 ここでは、情報処理試験で出題される言語の代表として、C言語でプログラムを書いてみます。

static int A, B, C ;
void add( ) {
  C = A + B ;
  return ;
}

図 C言語による合計を求めるプログラム

 どうです、何となく分かりますね。流れ図で”A+B→C”となっている処理が、C言語では”C=A+B”になっているだけです(後は無視)。簡単簡単。
 では次に、情報処理試験で出題されない言語の、Lispでプログラムを書いてみます。

(defun add ( )
  (setq C ( + A B ))
)

図 Lisp言語による合計を求めるプログラム

 C言語よりは直感で分かりずらいかもしれませんが、それでも雰囲気だけは掴めます。

 ところが(これが重要)、これらのプログラムは人間にとって理解し易い(?)のですが、コンピュータにとっては大変理解しずらいのです。というか、コンピュータにとってはこれらは単なる文字の羅列であり、まったく理解できません。つまり、コンピュータにとってはプログラムではないのです。

 コンピュータ用のプログラムを書いたのに、プログラムでないってどういうこと?

 実は、コンピュータが理解できる唯一のプログラムは、機械語と呼ばれる形式のプログラムだけです。だから、機械語以外で書いたすべてのプログラム(ここで書いたプログラムもそう)は、必ず機械語に変換しなければなりません。そしてコンピュータは、機械語に変換された後のプログラムを実行するのです。

(注)Java等の一部の言語は機械語に変換せずに実行しますが、話が発散するので、それには触れません。

 じゃあ、最初から機械語でプログラムを作ればいいじゃないか、という考えもあるでしょう。
 確かにそうです。実際に、機械語でプログラムを作成した時代もありました。では先の合計を求める流れ図の処理を、機械語で書いてみましょう。

0111 0000 0000 0001 0000 0000 0000 0000
0001 0000 0001 0000 0000 0000 0000 1100
0010 0000 0001 0000 0000 0000 0000 1110
0001 0001 0001 0000 0000 0000 0001 0000
0111 0001 0001 0000 0000 0000 0000 0000
1000 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

図 機械語(COMP−X)による合計を求めるプログラム

 どうです。何が何やらさっぱり分からないでしょう。でもこれは、コンピュータにとって大変都合がいいんです。なんせ2進数ですからね。
 機械語とそれ以外の言語で書いたプログラムの違いは、単なる書式の違いにとどまらず多くの点で異なっています。その一つに、機械語のプログラム(およびアセンブラ言語で作成したプログラム)にはコンピュータの各装置を直接操作する命令が表れる、という点があります。

 私たちが一般に作成するプログラムは、コンピュータの各装置を意識して作成する必要はほとんどありません(ある場合もある)。先の例で言えば、流れ図で表れる変数が記憶装置のどこに存在して、それがどの装置を経由して加算を実行するか、等はまったく意識する必要はありません。
 ところが機械語ではそれをきちんと書いてあげなければならないのです。つまり一旦機械語になったプログラムには、コンピュータの各装置に対する命令が、1から10まですべて表れます。だからコンピュータ(ハードウェア)は、それを忠実に実行するだけでよいのです。

 本講座の最初の方で、”プログラムは単純なのか、複雑なのか”という”問い”がありましたが、答えはこうです。
 「私たちが作成する一般のプログラムは単純だけど、機械語は複雑だ」です(でも機械語が分かると、コンピュータがよく理解できますよ)。

 なお、機械語に変換する作業は手作業で行うのではなく、アセンブラコンパイラと呼ばれる特殊なプログラムが行いますので、ご安心のほどを。今では機械語でプログラムを作成する人は、まずいないでしょう(たぶん)。

 ところで機械語は、世界中のコンピュータの共通の言語ではありません。
 例えば、DOS/Vマシンで動作するアプリケーションプログラム(ワープロや表計算ソフト)は、(そのままでは)Macで動作しないですよね。もちろん搭載されているOSも違うからですが、それ以上に、両者の機械語の違いが大きいんですよ。
 逆に、DOS/Vマシンで動作するプログラムは、メーカが異なっても大抵は動作しますよね。これは、DOS/Vマシンの機械語が同じだから可能なのです。
 機械語が同じかどうかは、コンピュータのCPUに依存します。CPUが同じならば機械語も同じですが、CPUが異なれば機械語も異なります(知っての通り、DOS/Vマシンはすべてインテル社製のCPUです)。
 なお、先の合計を求める機械語のプログラムは、COMP−Xと呼ばれる仮想コンピュータ上のCPUにおける機械語プログラムでした。

「演習」

 次に示す各装置は、コンピュータの五大装置の何に当たるかを答えよ。

 a CPU   b メモリ   c キーボード   d ディスプレイ


演習の解答

 a−制御装置と演算装置  b−記憶装置  c−入力装置  d−出力装置

 「あれ、これは先週分の演習じゃないのか」と思った方も多いでしょう。
 そうです、これは先週に行った講座の演習です。
 でも、この演習を先週行えば100%正解でしょう。暗記ものは時間が経ってから演習を行いますので、今週分のは来週以降まで覚えておくように。

 特に解説はいらないと思いますが、補足を一つだけ。
 bのメモリ(メモリーと伸ばさない)は記憶装置です。実は記憶装置はさらに、主記憶装置補助記憶装置に分けることができ、メモリは主記憶装置に当たります。
 主記憶装置はCPUが直接アクセスする記憶装置であり、ここに今実行中のプログラムやデータが格納されます。
 対して補助記憶装置はその名の通り主記憶装置を補助する記憶装置であり、CPUは補助記憶装置に対して直接はアクセスしません。
 補助記憶装置の代表例は(パソコンでは)ハードディスクです。一般にハードディスク内には、たくさんのプログラムが格納されていますが、これらは常に主記憶装置内に存在している必要はありません。ユーザがアイコンをダブルクリックする等して当該プログラムを起動したとき、はじめてそれが主記憶装置に格納されて実行に移るのです。

 今週はここまで。では皆さんよいお年を。