計算機は、よく言われるように、ソフトウェア(プログラム(と、関連デー タ))をインストールして実行しなければ何もできません。逆に考えると、プ ログラムとは、計算機が何か役に立つような仕事をするための手順(段取り) を計算機にわかるように記述されたもの、というとらえかたもできます。
では、プログラミングって何?ということになるわけですが、これは計算機にな んらかの仕事をさせるための手順を 計算機がわかるように書いてあげる、と言う ことができるでしょう。この『計算機がわかるように』 というのがミソです。つまり、計算機は人間の言葉 (自然言語とい うことがあります) が理解できませんし、仕事の仕方も(手足や口もな く)限られてますから、計算機がわかるような言葉、すなわち プログラミ ング言語 で 計算機が実行できる 形で書いてあげる、というこ とになるわけです。
この『 実行できる形で 』というのもミソで、C言語のようなものは、 実は計算機では『直接は』実行が出来なくって、実行できる形に 変 換 するか、 そのプログラミング言語を実行できるプログラムを介して実行 しないといけないわけです。
前者については後に述べるように、最終的には 機械語=ビットの並 び になっています。これをつくる方法としては、プログラム言語を 「 コンパイル(+リンク) 」して実行イメージを作る方法がありま す。後者の実行方法としては、プログラム言語を1ステップ(行)ずつ読みだ しては解釈して実行することのできるプログラム (インタープリタ) を介して実行するやりかた等があります。
厳密にいうと、組み込み等を除くと、今日の計算機環境では生の機械語で直接 処理する(させる)というのは、(ライブラリ、ミドルウェアを含んだ広い意 味での)OS (Operation System, MS 的に言うと「基本ソフト」) 自体を除いてほぼありません。OSのサポートなしでは動けないほどソ フトウェアの規模は大きくなっています。とはいえ、OS自体は機械語レベル で動いている、というのもまたまぎれもない真実です。
CPU は、所詮は状態機械です。状態機械というのは聞きなれない
かもしれませんが、要するに状態(データ)を内部に持っていて、その状態に
応じて挙動(動作、データ入出力も挙動のうち)が変わるような機械
(メカとは限らない)です。CPUの構成は、組み合わせ回路+順
序回路(=論理回路+メモリ)です。例えば、1ビットの足し算(!?)
は、以下のように、AND (論理積)、OR (論理和)、NOT (論理否定)を組み
合わせた回路(半加算器, Half Adder (HA))になっています。
![]() |
|
さらに、これを組み合わせて、繰り上がりに対応したものが全加算器
(Full Adder, FA) と呼ばれています。3ビットを足した結果を
出力します。
![]() |
|
以下の演習で、ちょっと馴染んでください。
さらに、上の論理回路がどう組み合わされば CPU になるかを真剣に知りたい人 には 「CPUの創りかた」 がお勧めです。CPU内のレジスタを含め、メモリ=(補助記憶を含む)記憶装置に計算の処 理手順(プログラム)と処理対象(データ)がどちらも置かれ る (von Neumann type) というのが、今日のコンピュータの基本です。別の言 い方をすると、所詮はビット列なので、全く同じビット列をデータとして読む か命令(プログラムの一部)として読むかは状況次第、というわけです。ちなみに以下が、その回路図の抜粋(単純なゲートだけじゃなくロジックIC まるごとも使われている)です。
![]()
*これを理解できているかどうかがこれから先の分かれ目ですんで、よくみて おいてください。要するに、(最近のほとんどの)計算機の動作原理は
例でみてみましょう。ここで は 学研の「大人の科学」 No.24 ふろく4ビットマイコン (命令だけなら このペー ジ が見やすいかも)の動きにしたがうとします。
たとえ話も参照してください。この仮想計算機は4bitが1ワードです。機械語命令(オペコード)は1ワード で、オペランド(引数)は命令に応じて0〜2ワードをとります。レジスタは A,B,X,Y (と、その補助となる A', B', X', Y') を持っています。またフラグ が1つだけあります。(下図参照)
00:8 01:1 02:9 03:2 04:1 05:F 06:0 07:5
と並んでいたとします。
と言われてもぴんとこないかもしれませんが、CPUの内部で、このような動 作をするように、論理回路(と、順序回路・メモリ)が組みあわさっている、 ということなのです。また、ここで注意してもらいたいことは、このように原始的な部分では 計算機への命令とデータに本質的な差はなく、どちらも所詮はメモリ上の1と 0の並びであり、それをどう解釈するかはその時点での計算機の状態次第であ る、ということです。
この命令はかならず実行フラグを1にするのですが、ここでは説明は略します。 さらに、つぎに演算部は5番地の F を読み込みます。 これは、「続く2ワード(8bit) の値(この場合は 05)をアドレスとして、実行 フラグが1の場合、指定されたアドレスに制御を移す」ということで、前の命 令で実行フラグは1になったのでこの命令を実行する、ということは、自分自 身を再度実行せよ、ということになります。つまりここで無限ループに入るこ とになります。この計算機は終了することを知らないので、終わりたいときは 無限ループにする、ということなのですが、ここではそういうものだ、くらい に考えていてください。つまり、上の 4bit の 8 つの並びで、「1+2を計算し、その結果を表示しろ」 というプログラムだった、というわけです。