ソフトウェア工学をつつく5-構造化プログラミング誕生。GOTOは有害?
1つの入り口と1つの出口を持つようなプログラムは、「順次・反復・分岐」の3つの基本的な論理構造によって記述できる-構造化定理
『Go to文は有害だと考えられる』("Go to statement considered harmful") - GOTO有害論
このころから既にスパゲッティプログラムの問題が認識されていた事がわかるよね。でも理屈だけじゃわかりにくいのでプログラムを書いてみた。
#include
int main(void)
{
char i = 0, x = 0;
char str[6];
str[0] = 'H', str[1] = 'e', str[2] = 'l', str[3] = 'l',
str[4] = 'o', str[5] = '\n';
HELLO:
goto CHAROUT;
HELLOSUB:
x += 1;
if ( x < 6 ) goto HELLO;
goto NUMBEROUT;
COUNT:
goto NUMBEROUT;
COUNTSUB:
i += 1;
if ( i < 10 ) goto COUNT;
printf("good-by \n");
goto END;
CHAROUT:
printf("%c", str[x]);
goto HELLOSUB;
NUMBEROUT:
printf("%d \t", i);
goto COUNTSUB;
END:
return 0;
}
//元のプログラム
#include
int main(void) {
char i;
char str[6];
str[0] = 'H', str[1] = 'e', str[2] = 'l', str[3] = 'l',
str[4] = '0', str[5] = '\n';
for ( i = 0; i < 6; i++ ) printf( "%c", str[i] );
for ( i = 0; i < 10; i++ ) printf( "%d ", i );
printf( "\n" );
printf( "good-by\n" );
}
┐(´ー`)┌ヤレヤレ
うーん。こりゃすごい。この調子で何万行も書くんだから彼らの言い分がわかるよね。 確かにGTOTの多用は有害以外のなにものでもないし、根源は機械語だから全てのプログラムは「順次・反復・分岐」でかけるピヨ。生産性が悪いけどね。
しかしダイクストラは、アセンブラな人達から「GOTOは必要だ!」と猛抗議を受けたんだ。まぁ、確かにOSとか作る時は必要性を感じるピヨ。ダイクストラも言い方が悪かったのかもしれないね。 この議論の結果、今日当たり前となったbreak、continue、continue、switch・・・などの限定版GOTOが登場したんだ。これらはアセンブラレベルではGOTOそのものピヨ。だけど、人間にとってはGOTOは読みにくいよね。だからGOTOに意味を持たせたこれらの文が考案されたんだ。猛抗議の中主張し続けた勇者ダイクストラに感謝しよう!