スパゲティープログラムという言葉がある。たとえば、FORTRANやBASICなどのプログラミング言語には、GOTO文という構文がある。これを使えば、処理をプログラムの任意の場所へ飛ばすことができる。もちろん、アセンブラのジャンプ命令も同じだ。このような構文を持つ言語には共通の問題がある。無意識に使うと、プログラムの制御の流れを追うことが難しくなってしまうのだ。このように、あちこちへ飛びまくって追いかけられなくなってしまったプログラムのことを、からまったスパゲティーにたとえてスパゲティープログラムと呼ぶ。
プログラムのスパゲティー化は、保守性はもとより、プログラマーの生産性にも大きな影響を及ぼす。あらかじめきちんとロジックを詰めずに書きはじめても、前に書いたアセンブラの例のように、パッチワーク的に修正ができるので、なんとかプログラムを完成させられるからだ。もちろん、時間は余計にかかるし、プログラムはめちゃくちゃなものになるが、なんとか動く。しかし、これではその本人にしかわからない、いや、本人にすら時間がたてば解読が困難なプログラムが出来上がってしまう。処理をこまめにサブルーチン化するなどして、ある程度綺麗なプログラムにはできるが、それも人のスキルに大きく依存してしまう。サブルーチン化するということは、単に処理を分けることではなく、複数の場所で行われる類似の処理を共通化する作業が必要だからだ。これをしなければ、サブルーチン化する意味がない。
構造化プログラミングという考え方が出てきたのは、こうした現象を防いで生産性や保守性をよくすることが目的だった。基本的に、いかなるロジックも3種類の要素(詳細に言えば4種類だが)つまり、順次処理、条件付き処理、繰り返し処理(条件判断前置または後置)を使って記述できるというものだ。これには、GOTOのような飛び越しは含まれない。逆にいえば、この基本要素を使って作られたプログラムはかなりすっきりとしたものになる、というかならざるをえない。だから、まずは標準化の一環として構造化プログラミングを取り入れようとしたのだが、スパゲティーに味をしめたプログラマーには馬耳東風、なかなか根付かない。それもそのはずで、基本的な発想から変えなければいけないからだ。たとえば、昔風のBASICでは、よくプログラムの最後に、GOTO 10 という文が書かれる。つまり、プログラムの先頭に戻れ、ということなのだが、GOTO使用禁止を言い渡されたプログラマーがまず悩むのがこれだ。どうやったら処理をプログラムの先頭に戻せるのか。ここで発想を変える必要が生じる。プログラムの最後から先頭に戻す、ということは、つまり全体の処理を「繰り返す」ということだ。要するにプログラム全体をたとえば、WHILE や LOOP文のような、繰り返し構文で囲ってしまえばいいのだ。この発想の転換が案外難しい。だから、単に標準を決めただけでは、納期を理由にした標準破りが続出してしまう。
そこで登場したのが、GOTO文のない、いわゆる構造化プログラム言語だ。古くはALGOLや、その流れを汲むPASCAL、PL/1などの言語は、(例外的にGOTOを持つものもあるが)基本的に、GOTOを使えない。つまり、最初から構造化を考えて作らざるを得ないわけだ。人というのはある意味で弱いものである。いくら生産性が良くなる方法を頭で考えても、体がついていかないことが多いものだ。だから、仕組みとしてそれを組み込んでしまうことで、ルールからはずれたこと自体を出来なくしてしまおうという発想なのだ。この発想は、今日にいたるまで、形を変えながら受け継がれている。
(続く)
コメントする