パソコン>基礎の基礎>プログラムの「ぷ」

 数値を0/1で表現するのはもちろんのことですが、演算の手順や条件判断などのお仕事も符号化して記憶しておき、これを順次取り出して処理することにより一連の作業をすることが出来ます。
 これがすなわちプログラムということですね。

 この章では、簡単なプログラムをサンプルにしてプログラムとはなんぞやという話をしたいと思います。 取りあえずは下のプログラムを見てください。

1  int m = 0;
2  for(int n = 0; n < 10; n++)
3  {
4    m++;
5  }
※1

 いきなり「なんじゃいこりゃ」的なモノで申し訳ないですが、これは「C言語」と言う非常に歴史の古いプログラム言語で書かれた繰り返し演算をするためのプログラムです。 左端には便宜上行番号を付けていますが、本来「C言語」には文章で言うところの行という概念はありません。

 では、プログラムを説明していきましょう。
  1行目 整数(int)型の変数「m」を、初期値「0」として確保します。
  2行目 整数型の変数「n」を、初期値「0」として確保します。
     nの中身が10未満(<10)であることを監視し、
        10未満であれば「n」をインクリメント(1増加)、
        そうでなくなった場合「for」を終了する。
  3行目 「for」文の適用範囲の始まり。
  4行目 「for」文は条件付きの繰り返し処理を行う命令で、「{}」に囲まれた部分の処理を
     条件が成立している間繰り返します。
  5行目 「for」文の適用範囲の末尾。
     「n < 10」の条件が不成立となったら、記号「}」の次に制御を移す。

 文章で言う「行」の概念がないのですが「C言語」の行というのは「;」で区切られているものや「for」文のような定型文、複数の行をまとめて1行に見せる「{}」などがあり、「for」文は「(;;)の次の行を条件が成立している間繰り返す」と言う命令ですから、{}を使用して複数行の複雑な処理もfor文には1行に見せかける、と言うことをしています。
 でも、上記サンプルでは単純に変数「m」をインクリメントしているだけですので、

1 for(int n = 0; n < 10; n++)
2   m++;
 

 と書くことも、

 for(int n = 0; n < 10; n++) m++;
 

 更に、

 for(int n = 0; n < 10; n++, m++); ※2

 と書くことも可能で、全く同じ動きをします。

 ざっとこんな感じですが、これをテキストエディタ(notepadとか?)で書いて、なんか呪文でも唱えれば動くのかと言えば そんなことはない訳で、プログラム言語というのは「C言語」に限らず、その目的はひたすら人間(プログラマ)が理解しやすいようにするためにあるので、コンピュータにとってはそのままでは理解できないシロモノなのです。
 これを実際に処理させるためには、前処理や後処理を追加してコンパイラという謎のプログラムを使用して機械語に翻訳し、上の5行の処理をする実行可能なファイルを作る必要があります。

 実際に実行可能なファイルをプログラムと言い、上のような処理内容を記述したものをプログラムソースと言います。 「コンパイラというプログラム」と書きました、これも何らかの処理を行う実行可能なファイルなんですが、このコンパイラは誰が実行形式に翻訳したの?と言う疑問が湧きませんか?
 コンパイラは実に複雑な処理を自動で実行してくれるのですが、コンパイラ以前の時代には「C言語」のような人間にわかりやすい・人間に優しい言語(高級言語という)などなく、「アセンブリ言語(=以降アセンブラと記述)」と言う より機械に近い(CPUの動作そのもの)言語を使用していました。 下が、上の「C言語」によるプログラムを「アセンブラ」で記述したものです。(実際には、「C言語」で記述したものを実行形式のバイナリ(数値の羅列)にコンパイルしこれを逆アセンブルという手法を使って「アセンブラ」に起こしたもので、左には実際に配置されているメモリのアドレスが記述されています。)

 int m = 0;
00DB13BE mov dword ptr [m],0
 for(int n = 0; n < 10; n++)
00DB13C5 mov dword ptr [n],0
00DB13CC jmp wmain+37h (0DB13D7h)
00DB13CE mov eax,dword ptr [n]
00DB13D1 add eax,1
00DB13D4 mov dword ptr [n],eax
00DB13D7 cmp dword ptr [n],0Ah
00DB13DB jge wmain+48h (0DB13E8h)
 m++;
00DB13DD mov eax,dword ptr [m]
00DB13E0 add eax,1
00DB13E3 mov dword ptr [m],eax
00DB13E6 jmp wmain+2Eh (0DB13CEh)

 

 これも軽く解説しておきますと、ソースコード内の赤字の部分が命令語で
  「mov」移動、持ってくる、代入
  「add」加算
  「jmp」ジャンプ
  「cmp」比較
など、単純な命令が羅列されています。

 ご覧のように、「アセンブラ」では より人間に優しくなく 一見して何の処理をしているのかわかりづらくなります。
 「C言語」のような高級言語には『人間にわかりやすくする』と言う役割があり、実際にプログラムを考案した人以外の人が見てもその処理内容が容易に理解できると言う利点があります。 「アセンブラ」のような言語で記述したものでは、そのソースを見ただけでは処理が容易に想像できず、別の方法で処理内容を解説する必要があります。

 ですから、高級言語を使用する限りは「※1」のような記述をするように心がけ、同じだからと言っても「※2」のような記述は避けなければいけません。
 プログラミングを習得して間もない方や、経験の浅い天狗さんなどはわざと難解なソースコードを書いて『どうだ!判んないだろう』みたいなことになってたりしますが、よゐこは決して真似をしてはいけません。 特に「C言語」においてはポインタという万能かつ最悪な構造があり、これを多用して無間地獄に落ちるプログラマがたくさんいます。 また「C言語」には、結構無責任なところがあってプログラマ自身がちゃんと管理しないと動作に問題を起こしたりするのです。 有害なコンピュータウィルスなどもこの構造的脆弱性を突いているものも少なくありません。

 プログラミングの基本とされながらも、いろいろな問題を抱える中途半端な高級言語「C言語」は私的にはお勧めしない言語といえます。(昔々、CPUの能力がそれほど高くなかった時代に作られた言語なので、プログラミングする側でいろいろと気を遣ってあげないといけないのは仕方ないと言えばそうなんですがね。)