プログラミング講座 第一回  

はじめに

 コンピュータの性能は日に日に良くなり、もはや個人用として行き過ぎではないかといった性能のパソコンが昔の半額以下で売られています。このような状況の中、もっとも苦し思いをしているのは言うまでも無くコンピュータプログラマです。コンピュータの性能が上がったことによっていままで実現できなかったような複雑なアプリケーション(ソフトウェア)を動作させることが可能になりました。当然そのようなアプリケーションの需要がでてきます。しかし、コンピュータで実行できる事と実際に完成させることが可能な事は違います。その複雑なアプリケーションは人手で作成されるわけですから、それを完成させるための技術と労力が必要です。昔は数千行で完成できたプログラムも、今では数十万行にもなることがあります。そういった状況をなんとかしようとして新しいソフトウェア開発の技術が投入されています。例えば、オブジェクト指向などが挙げられます。

 しかし、どんな新技術を用いても基本が分かっていないと壁にぶち当たります。数学の公式を幾ら覚えてもそれだけでは数学者にはなれません。数学を理解し、新たな問題をどのように解決していくかを考えていかなければなりません。プログラムも最初からパターンで覚えて行くのは正しいやり方ではありません。プログラムを理解し、目的のプログラムを完成させるのにはどうしたらいいかを考えうる事がとても大切です。僕は頭の中でプログラムを完成させることが大切だと思っています。とりあえず頭の中でどうしたらいいかを考えて、ノートに概略図を書いたり、実際にプログラムしたりしてその方法を試して見ます。ダメだったら何故ダメだったのか、どうしたらいいのかをもう一度考えます。そうすればプログラミング能力はどんどんついていくし、バグが起こっても何故起こったのかを考える事が出来ます。

 そこで、自分の考えに確信を持てるという事が大切です。例えば、いまいち理解していないものに対して自分の理論を当てはめた場合、その理論を確信することはできません。確信の無い理論は問題が発生した場合にパニックです。何処が間違っていたのかを考えた時に、基本となる理論が正しくない可能性を秘めているので、その理論で組みあがった理論は全く見当違いなところにミスがある可能性があります。何でできないの!って怒りたくなります。基本となる理論さえしっかりしていれば間違ったのは自分が作った新たな理論にミスがあるわけで、きちんと考えれば必ず原因を突き止めることが出来ます。

 プログラミングにおいてその最も基本となる理論はどのようにしてプログラムがマシンで動いていくのかという事になります。簡単にその概略を説明すると、

プログラムを書く。

プログラムを機械語に変換(コンパイル)する

リンカーでプログラムを結合したり、OSで実行するのに必要な物を付け足したりする。

OSがそのプログラムをロードする

ロードされたプログラムは機械語単位で実行されていく

となります。つまり、プログラムを理解する為には、この全てのフェーズの詳細を知っておかなければならないのです。

 そんな事をしなくてもプログラムは出来るよという意見もあります。しかし、僕が知っている限りではこのような基本的なことを理解していないにも関わらず素晴らしいプログラムを組んでいける人は見たことがありません。前述の話からも分かる通り、基本を理解しておく事は、様々な難しい問題に対応する為に必要です。この講座は本気でプログラムをマスターしたい人を対象にしています。

プログラミングとは

 プログラミングとは何でしょう。それは名前のとおりプログラム(計画)することで、具体的にはコンピューターにやらせたい仕事をコンピュータに分かるように文章化することです。コンピュータは人間ではありませんから人の言葉は通じません。コンピュータに通じるのは機械語と呼ばれる数字の列で表される言語だけです。数字の列で表される言語というのもいまいちピンと来ないかもしれません。簡単に説明すると、我々人間は字を使ってその組み合わせで単語を構成させているけれどコンピュータは数字を使って単語を構成させているという感じです。

例えば、人間は1たす2を命令するときは

  1 と 2 を 加えろ

となります。これを機械に命令する場合は機械語で

  124(足せ) 1, 2 (1と2を)

みたいな感じになるということです。結構似ています。
ここで、人の言葉と機械語との最大の違いは言い回しの量です。機械語は言い回しの数がとても少なくなっています。コンピュータが理解できる言葉は、足せ、引け、かけろ、割れ、比べろなどの計算に関する命令が殆どです。つまり出来る仕事が限られているということです。何故そのようになっているのかというと、言い回し(以下命令)の数が大きくなればなるほどコンピュータは複雑になり、ひとつの命令を処理するのに時間が掛かるようになってしまうからです。コンピュータで処理するのに最も効率が良いと思われる命令数が今のCPUではサポートされている訳です。そこで、我々プログラマーの仕事は如何にして複雑な処理を限られた命令で表現するかという事になります。「げげっ、そんな基本的な命令だけを組み合わせてあんな凄いものが出来るわけ無いじゃないか!」って思うかもしれません。大丈夫です。プログラムは一度書いてしまえば何度でも使えます。例えば数字を2乗するプログラムを書いたとします。これは新しい命令ができた事と同じです。次からはこのプログラムを使うことで数字を2乗する事が出来ます。このようにプログラムは基本的な命令の他に、既にあるプログラムを用いて、簡単になります。

コンピュータの構成

 コンピュータに命令する前に、コンピュータの事をよく知っておく必要があります。コンピュータが我々の命令をどのように処理していくのかを把握することは、命令の処理の副作用を予測したり、より効率的な命令の仕方を考えつくためには欠かせない事です。また、どのような言語にも共通する基本的な事項も多く含んでいます。議論や解説書ではこのような事は知っているものとして扱われることが多いので知っておかないとダメです。余談かも知れませんが、個人的な見解では知っているとコンピュータが可愛く見えてきます。実社会で、見知らぬ隣の人が部屋でうるさいと腹が立ちますが、よく知っているのならば、「ああまたやってるのか、仕方ないなあ。」と許したくなってしまう事と似ているかもしれません。そんな訳で最初はプログラミングの対象となるコンピュータ自体の事を簡単に説明します。

コンピュータの構成は大まかに以下のようになっています。

 
図1、コンピュータの構成の概略図

これを見ると分かると思いますが、案外コンピュータの構成というのは簡単なものです。CPUにメモリーやCD、ハードディスクなどの周辺機器が2つの線で繋がっているだけです。やや簡略化してはいますがこのイメージでとらえて構いません。この2つの線はそれぞれ全ての部品に繋がっています。この線を用いてCPUと各部品とがデータをやり取りするわけですが、このように全てが同じ線を共有するような方法をバス方式といい、この線をバスといいます。バスという名前が付いているのはみんなで使用する公共のものという意味からです。しかし、実際のバスとコンピュータのバスでは全く実体が異なります。同じなのは共有されているという事だけです。コンピュータのバスというのは黒板のようなものです。教室のなかで彼かが黒板に書いたら、誰でもそれを見ることができます。それと同じようなものです。2人同時にデータを書くと混ざってしまって駄目なので一度に一人しかデータを書く事ができません。データを受け渡しする場合は、このバスにデータを書くことで渡します。複数の部品が同じバスを利用するわけですから、誰か一人にデータを渡したい場合はあて先を与えてあげなければいけません。そこで、コンピュータが取った方法はもうひとつバスを用意してそちらは行き先を知らせる係りにするという物です。行き先は殆どの場合、CPUが書いて、全ての部品が読みます。行き先を知らせるバスをアドレスバス、データの内容を知らせるバスをデータバスといいます。例としてCPUからメモリーにデータを読み込み或いは書き込みする場合を示します。

 メモリーへの書き込み

  1、CPUがアドレスバスにメモリーを示す数字を書き込む。同時に書き込みたいデータをデータバスに書き込む。

  2、メモリーはアドレスバスに自分のアドレスが指定されたのでデータバスを読み込み、読み込んだ値を記憶する

 
 メモリーからの読み込み

  1、CPUがアドレスバスにメモリーを示す数字を書き込む。

  2、メモリーはアドレスバスに自分のアドレスが指定されたので記憶されているデータをデータバスに書き込む。

  3、CPUはメモリーが書き込んだデータをデータバスから読み込む。

といった様になります。通常はこのようにCPUからのデータ読み書きなのでアドレスバスに書き込みをするのはCPUになります。実際には、バスの他に読み書きどっちなのかを示す制御線などもあります。

 CPUやメモリーの説明をする前にその接続を説明してしまいました。難しくて分からなかったという人もいるかもしれませんが、とりあえずこんな感じで繋がっているとイメージを得られれば大丈夫です。次に各部品を分かりやすく簡単に説明します。とりあえず動作的なコンピュータのイメージを以下に示します。

figure-2.png
動作的に見たコンピュータのイメージ図

 まず、本棚には仕事の手順を書いた書類や、仕事に使う資料が入っています。これがメモリーに例えられます。次に仕事をする人は本棚から仕事を書いた書類を取り出し、内容を読みます。必要に応じて本棚から資料を取り出して読んだり、書き込んだりします。このとき、ひとつの仕事をするのにいちいち書類を本棚から出し入れしていたのでは時間の無駄です。そこで一度机の上に書類をまとめて置きます。そして仕事をする人(CPU)は机の上の書類を使って仕事をします。使い終わった書類は本棚に戻します。机に置ける書類の枚数は決まっているのでいつ資料を机に出すかで仕事の効率が変わってきます。したがって同じ仕事をするプログラムでも全然実行速度が違う事も良くあります。この机は実際にはレジスタの例えですが、レジスタというのはCPUの内に内蔵されているごく小容量の記憶領域です。前述のようにこれが有るとメモリーからデータを読み出したり書き込んだりする回数を減らせるのでその分実行速度が速くなります。そういったわけで現在殆どのCPUはこれを内蔵しています。最後に外へ繋がっているドアがあります。これはこの先に図書館(ハードディスク)や印刷所(プリンター)、テレビ局(モニター)があることを表しています。コンピュータはCPUとメモリーさえあれば一応動きます。基本はメモリーとCPU、その他はオプション(必要に応じて後付け)という事です。ただそれではパソコンとして不十分ですね。仕事を頼んだり、仕事の結果を受け取ったりする機能が無ければいけません。最低でもキーボードとハードディスクとモニターが必要です。これらの後付けの部品はデバイスと呼ばれます。パソコンのほかにもコンピュータはいろいろな場所で使われています。例えば自動販売機にもコンピュータは入っています。自動販売機はCPUとメモリーの他に、お金を入れたときにいくら入ったかを検知するセンサーや商品を選ぶ際に押すスイッチなどの入力を担当するデバイス、現在投入されている金額やつり切れを表示するディスプレイなどの出力を担当するデバイス、商品の温度を調整する入出力デバイスなどさまざまなデバイスが装備されています。

 次に、もう少し厳密にCPUやメモリーを見ていきましょう。メモリーは本棚に例えました。実際のメモリーは本棚と似ていますが、区画整理されて番号がふってあります。

figure-3.png - 10,035Bytes
実際のメモリーのイメージ図

 このように各番号にひとつずつ数字を格納する事ができます。この番号のことをアドレスと呼びます。メモリーに数字を書き込みしたり、読み込みしたりする時にはアドレスを指定して何処に対して書き込みや読み込みをするのかをメモリーに指示します。例えば0番地に147を書き込みする場合は命令として

  0番地に レジスタAから 書き込み

という感じで命令します。読み込みする場合は

  0番地から レジスタAに 読み込み

となります。読み込みや書き込みの対象は、先ほど机に例えたレジスタになります。レジスタも区画整理されています。従って番地がついている訳ですが、レジスタは番地が少なく、番地の代わりに名前が付いている事が多いです。

figure-4.png - 10,665Bytes
レジスタのイメージ図

  こうなると、CPUはこれらのレジスタの内容を用いて行う命令を備えている必要がありますね。CPUには足し算や引き算などの基本的な算術命令を必ず備えています。それらはレジスタ同士を足し算して結果をレジスタに保存したりする命令です。コンピュータは計算を自動的に行わせるために作られたのでこうなっているのです。

 最後に一連の動作を復習するという意味で日本語でプログラムを書いてもらう事にしましょう。

   メモリーの0番地に「1」、1番地に「2」が入っている
   レジスタはA〜Fという名前で分けられている。
   CPUには、

           「レジスタ〜とレジスタ〜を足してレジスタ〜に結果を保存する」
           「レジスタ〜にメモリの〜番地の内容を読み込む」
           「レジスタ〜の内容をメモリーの〜番地に書き込む」

   という命令がある。

1、この状況で1足す2の結果をメモリの2番地に格納するプログラムを日本語で書いてください。  模範解答

これが分かれば今日の講義は終わりです。次回はもうすこし具体的な話になりますが今日解説したコンピュータの挙動を理解していればすんなりと理解できると思います。それでは、次の講義で会いましょう。