全4120文字
PR

 これまでこのコラムでは、プログラミング言語やソフトウエア開発といったプログラミング周辺の話題を取り上げてきた。一方、プログラミングそのものについてはあまり解説してこなかった。というのは、具体的なプログラミングに関心がある読者は必ずしも多くないと考えられるからだ。

 もっとも、せっかくタイトルに「プログラミング」とついているコラム連載である。たまにはそうした話題を正面から取り上げてみたいと思う。

 さて、「プログラムには状態がある」と聞いてピンとくる人はどれくらいいるだろうか。おそらく、プログラムを書いたことのない人は、何のことかわからないはずだ。逆に、きちんとプログラミングに取り組んでいるなら、「ああ、あの話題か」とすぐにわかるのではないだろうか。

 日常的にプログラムを書いているのにピンとこないなら、自身のプログラミングのレベルを疑ったほうがいいかもしれない。「プログラムには状態があり、状態はなるべく排除したほうがいい」というのは、プログラミングの解説書でたびたび取り上げられるテーマだ。優秀なプログラマーがこうした考え方を披露することも多い。

 プログラムの状態を担うのが「変数」である。端的にいえば、変数の値が変わることでプログラムの状態が変わる。「状態」という言葉がわかりにくければ、「モード」と言い換えてもいい。変数の値が変わることで、プログラムが別のモードになってしまうのだ。

 プログラミング初心者だと、「変数の値を書き換えるのは普通のことではないか。なぜそんなことをいちいち意識しなければならないのか」と考えるかもしれない。そこで、変数の値が変わることでプログラムの状態が変わり、不都合が起こる例を具体的に見てみよう。

呼び出すごとに値が変わる関数

 学校の数学の授業では「関数」という概念を習う。「f(x)=2x+1」といった式に見覚えがある人は多いだろう。xの値が2のとき、この関数の値、すなわちf(2)は5だ。きまぐれで4になったり6になったりすることはない。必ず5である。xの値が決まれば、関数の値は一意に決まる。

 一方、プログラミングにも関数という概念がある。様々な処理をひとまとめにして名前をつけ、再利用しやすくするものだ。プログラミングの関数は引数(「ひきすう」と読む)として値をとり、それを適用した結果の値を返す。そうした意味で、数学の関数によく似ている。

 ただし、こうした関数は同じ引数に対して常に同じ値を返すとは限らない。場合によっては返す値が変わる可能性がある。その「場合」を左右するものこそがプログラムの状態だ。

 次のようなC言語のプログラムを考えてみよう。これを実行すると何が表示されるかわかるだろうか。

#include <stdio.h>

int state = 1;

int f(int x) {
  int result = 2 * x + state;
  state++;
  return result;
}

int main(void) {
  printf("f(2)の値は%dですn", f(2));
  printf("f(2)の値は%dですn", f(2));
  return 0;
}