プログラミングのための生の計算機イメージ

プログラミングについて根本的なところから学ぼうとする場合、(最低限の) 生の計算機のイメージがないとピンとこないんじゃないかと思っています。そ こで、この資料で出来るだけ直感的に(?)理解できるように説明を試みます。 (成功するかは謎ですが)

目次

そもそも、プログラムって何?

すでにプログラミングを学んでいる人の復習もかねて、最初に「プログラム」と は何かを再確認しておきます。

コンピュータは、よく言われるように、ソフトウェア(プログラム(と、関連デー タ))をインストールして実行しなければ何もできません。逆に考えると、プ ログラムとは、コンピュータが何か役に立つような仕事をするための手順(段取り) をコンピュータにわかるように記述されたもの、というとらえかたもできます。

では、プログラミングって何?ということになるわけですが、これはコンピュー タになんらかの仕事をさせるための手順を コンピュータがわかるよう に書いてあげる、と言うことができるでしょう。この『コンピュー タがわかるように』 というのがミソです。つまり、コンピュータは人間の言葉 (自然言語とい うことがあります) が理解できませんし、仕事の仕方も(手足や口もな く)限られてますから、コンピュータがわかるような言葉、すなわち プログラミ ング言語 コンピュータが実行できる 形で書いてあげる、というこ とになるわけです。

この『 実行できる形で 』というのもミソで、C言語のようなものは、 実はコンピュータでは『直接は』実行が出来なくって、実行できる形に 変 換 するか、そのプログラミング言語を実行できるプログラムを介し て実行しないといけないわけです。

前者については後に述べるように、最終的には 機械語=ビットの並 び になっています。これをつくる方法としては、プログラム言語を 「 コンパイル(+リンク) 」して実行イメージを作る方法がありま す。後者の実行方法としては、プログラム言語を1ステップ(行)ずつ読みだ しては解釈して実行することのできるプログラム (インタープリタ) を介して実行するやりかた等があります。

厳密にいうと、組み込み等を除くと、今日のコンピュータ環境では生の機械語で直接 処理する(させる)というのは、(ライブラリ、ミドルウェアを含んだ広い意 味での)OS (Operation System, MS 的に言うと「基本ソフト」) 自体を除いてほぼありません。OSのサポートなしでは動けないほどソ フトウェアの規模は大きくなっています。とはいえ、OS自体は機械語レベル で動いている、というのもまたまぎれもない真実です。

小まとめ

まとめると、プログラミングとは(デバッグ工程とかを除くと);
  1. まずどんなプログラムが必要かを考え[設計]
  2. 編集用プログラム(エディタ)でプログラムを書き[コーディング]
  3. 実行できる形に変換し[コンパイル…インタープリタ言語の場合は不用]
  4. メモリにロードして実行する。
という手順をふみます。詳細は述べませんが、この編集用プログラムやコンパ イラ、インタープリタ、あるいはメモリにロードして実行させるもの自体もそ れぞれが (事前に書かれた)プログラム であることに注意しておい てください。

じゃ、コンピュータって何物?

繰り返しになりますが、要するに、何か入力して、何かその入力に対 して処理をして、何かその結果を出力するもの、です。こ の「何か」がいろんな場合があるわけですが、基本は同じです。例えば入力が マウスのイベント(クリックした、等)で、処理が「アプリケーションの終了」 で、出力がウィンドウを閉じる、ということだったりします。

構成は?

良く言われる説明ではありますが、(von Neumann タイプの)コンピュータの場合、 構成要素は3つ、メモリ演算部 (CPU) 入出力 (Input/Output)です。で、メモリはプログラム(処理手順自体)とデータ (処理対象)をおいておくところです。メモリには番地がふってあっ て、0、1、2…と順に並んでいます。この番地のことをアドレスと いいます。最近はほとんど8ビット(=1バイト)単位ですが、ここで例とし て利用する GMC-4 では4ビット単位でアドレスをふっています(後述)。 また、CPUには(処理の際の手もとのメモ書き用として)レジスタと いうメモリを(すこしだけ?)持っているものが多いです。

CPU は、所詮は状態機械です。状態機械というのは聞きなれない かもしれませんが、要するに状態(データ)を内部に持っていて、その状態に 応じて挙動(動作、データ入出力も挙動のうち)が変わるような機械 (メカとは限らない)です。CPUの構成は、組み合わせ回路順 序回路(=論理回路+メモリ)です。例えば、1ビットの足し算(!?) は、以下のように、AND (論理積)、OR (論理和)、NOT (論理否定)を組み 合わせた回路(半加算器, Half Adder (HA))になっています。
Half ADDER  
 
 
 
 
 
 
 
 
 
A B C(arry) S(elect) 2進数
000000
100101
010101
111010

さらに、これを組み合わせて、繰り上がりに対応したものが全加算器 (Full Adder, FA) と呼ばれています。3ビットを足した結果を 出力します。
Full ADDER
INA INB INX C(arry) S(um)
00000
10001
01001
11010
00101
10110
01110
11111
そして、半加算器1つと、全加算器 n-1 個を組み合わせると、n ビットの加算 器が出来あがります。例として4ビットの加算器を示します。
Four ADDER

以下の演習で、ちょっと馴染んでください。

論理演算の演習
2進数演算の演習

さらに、上の論理回路がどう組み合わされば CPU になるかを真剣に知りたい人 には 「CPUの創りかた」 がお勧めです。

ちなみに以下が、その回路図の抜粋(単純なゲートだけじゃなくロジックIC まるごとも使われている)です。

CPU内のレジスタを含め、メモリ=(補助記憶を含む)記憶装置に計算の処 理手順(プログラム)処理対象(データ)がどちらも置かれ る (von Neumann type) というのが、今日のコンピュータの基本です。別の言 い方をすると、所詮はビット列なので、全く同じビット列をデータとして読む か命令(プログラムの一部)として読むかは状況次第、というわけです。

メモリにプログラムとデータがおいてるって、どーゆーこと?

*これを理解できているかどうかがこれから先の分かれ目ですんで、よくみて おいてください。
要するに、(最近のほとんどの)CPU の動作原理は
  1. まずメモリからデータを取り込み (fetch)
  2. それを機械語として解釈し (decode)
  3. 解釈したように実行する (execute)
の連続です。そのデータは最初にどないしてメモリにおくんや[モニタ、OS、 等と呼ばれるプログラムの担当]とか、割り込みはどうなるんや、とかは別の 機会とします。

ということで、まずは たとえ話を参照 してください。 これは上 で紹介している「CPUの創りかた」の CPU (TD4 と呼びます)をターゲットとし ています。


次は、アセンブリ言語

講義用スタイル
印刷用スタイル