GOTO論争

C言語やその類似のプログラミング言語では度々問題になるひとつがGOTOである。もうこれは散々にいたるところで語り尽くされているはずと思っていたが、ちょっと違う切り口の記事を見つけた。tanakh氏の記事id:tanakh:20041002である。これはGOTOそのものの良し悪しを言ったものではなく、GOTOを使わざるを得ない状況が発生してしまうC言語の問題点を指摘しているようだ。私はこれにあえて反論したいと思う。まず私自身の見解を言えば「例外処理を除いてGOTOは必要ない」である。それというのもC言語はその自由度ゆえに様々な「トリック」が使えるからだ。(使わなければ解決できない、という否定的な視点を無視するわけではない。)私自身が今までC言語を使ってきた上でGOTOが必須であるような事態は一件もなかった。GOTOを使っている場合は単に手抜きである。例に挙げられている多重ループから抜ける場合に関しても至極簡単にGOTOを取り除ける。

int x;
for (int y=0; y<HEIGHT; y++) {
 for (x=0; x<WIDTH && mat[y][x]==0; x++);
 if(x!=WIDTH) {
  found=true;  y=HEIGHT;
 }
}

複雑になるどころか比較回数もネストレベルも減り、なおかつ新たなフラグも導入していない。さらにループが深くなったらそう簡単にはいかないと言われそうな気がするが、そもそもそのような状況があれば設計の段階でのミスである。他の言語流の表現ができないのは必ずしもC言語が劣るわけではない。C言語にはC言語流の表現方法があるのだ。その表現方法が時代にそぐわないというのならばそれは全くその通りだとしか言いようがないのは悲しいかな事実だったり。
近代的な意味論の中でのC言語の能力はかなり劣る。