プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

プログラミングの楽しさ: プログラムが動く仕組み


コンピュータはメモリに格納された機械語という命令を解釈して順番に実行します。コンピュータで実行可能な機械語を作るの作業をプログラミングと言います。プログラムの全てを機械語で作るのは大変なので、高級言語という人間に分かりやすい言語でプログラムを作成し、それを機械語に変換するというやり方が一般的です。

きっかけ


先日こんな記事を書きました。これからプログラミングを始める、あるいは興味がある人などへの参考になることが書けるといいなと。そう思って、プログラミングの楽しさを説明する記事を書こうと考えました。


これを見てプログラミングに興味を持ってもらえたら嬉しいですね。


すでにご存じの方には退屈な話ですので、読み飛ばしてくださって結構です。

プログラミングって、なあに?


WikiPediaより:
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29

プログラミング(Programming)とは、プログラミング言語を用いてプログラムを作成することである。コーディングとも言う。類義語としてスクリプティングがある。プログラミングを行う人(狭義には職業とする人)のことをプログラマと言う。
プログラミングの目的は、人間の意図をコンピュータの理解できる言語(機械語)に翻訳して伝えることである。


プログラムはコンピュータで何かをするための道具のようなものです。Webサイトを見る時に使うInternet Explorer、メイルを読み書きするOutlook、文章を作るWord、これらはみなプログラムです。このプログラムを作る作業のことをプログラミングと言います。


プログラミングについて説明する前に、まずコンピュータがどのようにしてプログラムを実行しているかを理解する必要があります。そこで、コンピュータの動作原理を自分なりに説明してみました。なるべく分かりやすく書いたつもりですが、もし分かりづらいところなどありましたら、連絡いただけると幸いです。

コンピュータの仕組み


コンピュータは大きく分けて以下の3つの部分から構成されています。

  1. 機械語や演算結果を格納するメモリ
  2. メモリに格納された機械語を順番に実行する中央演算ユニット(CPU)
  3. キーボード・モニタ・ハードディスクなどを制御するための入出力装置(I/Oユニット)
メモリ


メモリは機械語やその実行結果を格納しておくための領域です。


メモリはバイトと呼ばれる、8ビットを一つの単位として各種データを格納します。ビットはメモリの状態を表す単位で、0または1の値を取ります。メモリの用途は基本的にプログラムが自由に決められます。それは機械語であったり、数値であったり、文字であったり。この構造によって、プログラムは状況に応じて柔軟に作ることができるようになっているのです。


バイトにはそれぞれにアドレスと呼ばれる場所を表す番地が付けられています。アドレスは機械語やデータの位置を示すために使われます。メモリの状態は0か1なのですが、そのままでは非常に見づらいので、4ビットを1文字に割り当てる16進数という表記法でメモリを表すのが一般的です。

アドレス    メモリ内のバイト(16進数)
0000        0010 1010 (2A)
0001        0101 0100 (54)
0002        1110 1011 (EB)
0003        0111 0101 (75)
CPU


CPUはメモリから機械語を読み込み、順番に実行する機能を持っています。


メモリから値を取り出し、計算をして、結果をメモリに格納する。その一連の処理を繰り返すことでコンピュータは動いているのです。

入出力装置(I/Oユニット)


入出力装置はコンピュータに接続された周辺機器を制御する装置です。


周辺装置には、キーボード・マウス・ディスプレイ・ハードディスク、などがあります。これらはプログラムから特別な命令などを使うことによって、情報を読みとったり出力したりします。

プログラミング言語

機械語


機械語はCPUが直接理解して実行することができる命令群です。命令は数バイトを一つの単位としてメモリ上に格納し、CPUが指定されたアドレスの命令を順番に実行していきます。命令にはいろいろな種類がありますが、以下のようなものが用意されています。

  1. メモリから値を取り出す
  2. 四則演算などの演算を行う
  3. 値をメモリに格納する
  4. 条件によって読み込むアドレスを変更する

例えばZilog社のZ80というCPUには、以下のような命令があります。

アドレス    機械語(16進数)    意味
0000        3A 00 10            1000番地の2バイトをAレジスタへ
0003        B7                  0かどうかテスト
0004        C2 0D 00            0でなければへ000D
0007        CD 00 01            0100番地をコール
000A        C3 10 00            0010番地へジャンプ
000D        CD 00 02            0200番地をコール
0010        ...

機械語は利用するCPUによって命令が違います。相互に互換性はありません。Windows用ソフト、Mac用ソフト、ゲームソフト、コンピュータソフト。そのCPU用に作られたプログラムは対象となるCPUでしか動かすことができないのです。

アセンブラ言語


機械語は、人間には理解しづらい数字の羅列です。それではプログラミングするのは大変なので、機械語を人間が見やすい形にしたアセンブラ言語という言語から機械語に変換するのが一般的です。前述の機械語に対するアセンブラ言語は、以下のようになります。

        LD      A,(1000H)
        OR      A
        JP      NZ,NOT_ZERO
        CALL    Do_Something
        JMP     END_IF
NOT_ZERO:
        CALL    Do_Anything
END_IF:
高級言語


アセンブラ言語は機械語よりは読みやすいものの、人間の論理思考を反映させるには、かなりの労力を必要とします。加えて機械語はコンピュータのCPUごとに違うので、プログラムを他のCPUへ持っていこうとすると、全て書き直さなければなりません。


そこで、人間の思考に近い形でプログラムを作ることが出来て、CPUごとに文法があまり変わらない言語が開発されました。これを高級言語と呼んでいます。代表的な高級言語としてはC/C++,VisualBasic,Java,などがあります。前述のアセンブラC言語では以下のようになるでしょう。

        if (a == 0)
                Do_something();
        else
                Do_Anything();

今日ではコンピュータのプログラミングの多くは、これら高級言語を使って行われます。アセンブラはほとんど使われませんが、メモリや性能の制約が厳しいコンピュータや特別な処理などには今でも使われています。

次回はプログラミング


説明が長くなってしまいました。次回は実際にプログラムを作る方法について説明したいと思います。