Go To Statement Considered Harmful (1968)
August 26, 2023Go To Statement Considered HarmfulでEdger Dijkstraは機械語以外でのGO TO文の使用を批判した。 ソースコードは機械語にコンパイルされ、プログラムとして実行される。 ソースコードは静的な成果物であるが、プログラムは時間とともに変化する。 プログラマが理解しやすいのは、動的に変化する実行中のプログラムよりも静的なソースコードの方である。 したがって、ソースコードからプログラムの実行状態を予測できることがのぞましい。
ソースコードからプログラムの実行状態を把握することを、プログラムが実行している処理を実装したソースコードのステップを特定することとみなす。 このとき、if文以外の制御構文もプロシージャもないソースコードであれば、ひとつのインデックスのみでプログラムの実行状態を特定できる。 プロシージャが加わると、呼び出し中のプロシージャの順に並んだ複数のインデックスが必要になる。
whileも導入するとインデックスだけで実行状態を一意に指定できなくなり、while文の反復回数を記録するカウンタが必要になる。 カウンタの値は、ソースコードに現れることなく、プログラムの実行によって変化する。 ソースコードに現れる静的なインデックスとプログラムの実行によって変化する動的なカウンタ、この2種類の独立座標でプログラムの実行状態を特定するようになる。 ここにGOTO文があると、実行状態を特定するためのインデックスとカウンタの集合をみつけにくくなり、プログラムの実行状態を追うことが難しくなる。
雑記
今日、Go To Statement Considered HarmfulはGO TO文への批判の参考文献として知られているが、参考文献のセクションには論文の発表時点で既にGOTOに対する批判が新しいものではないと書かれている。