GoTo トラベル ~ GoTo トラブル

goto文 論争


「 構造化プログラミング 」 を提唱していたコンピュータ科学者らの一人であったダイクストラは、
1968年に Go To Statement Considered Harmful *1 という刺激的な記事を 国際学会ACM の 学会誌 Communications of the ACM に投稿し*2
こんにちでは 構造化プログラミング に関して最も良くその名前だけが知られている論争となっている *3

  クヌースの言葉を借りるならば、 「 go to 文 除去 の 話の二番目の場面は,多くの人たちが第一幕だと思っている事実である.」 *4

また considered harmful というフレーズはその後、定番ネタとして、しばしば似たような深刻な、あるいは軽妙な論争に関して付けられるものとなっている *5

ダイクストラの主張

“Go To Statement Considered Harmful”[4]の趣旨は次の通りである。

人間が時間によって変化するプロセスを把握する能力は、プログラムの静的な関係を把握する能力に比べて劣っているため、静的なプログラムテキストの構造と時間によって変化するプロセスの構造をなるべく近づけるのが重要である。
そのためにはプロセスの進捗を表す簡潔な指標が必要である。指標とは例えば実行中の行番号・その時点でのスタックトレース・行番号とループを回った回数のペアなどである。
例えば、1人が部屋に入るごとにカウンタを増やしていくプログラムにおいて、カウンタが室内の人数-1である瞬間はどこにあるのかという問いに答える際に、簡潔な指標があればすぐ答えられるが、簡潔な指標がなければ正確な答えは難しくなる。
goto文を無条件に許してしまうと簡潔な指標は得られなくなってしまうため、高水準プログラミング言語においてはgoto文は廃止するべきである。
その一方でクヌースの指摘[5]によると、ダイクストラは“Structured Programming”[6]においてはgoto文には触れていない。実際に“Structured Programming ” においては “ sequencing should be controlled by alternative, condtional and repetitive clauses and procedure calls, rather than by statements transferring control to labelled points.”との1文があるのみでそれ以外では触れていない。

また、「 3つ の 基本構造 」 についても、 “ Go To Statement Considered Harmful ” においては “ I do not claim that the clauses mentioned (引用者註: 順次・分岐・手続き呼び出し・反復) are exhaustive in the sense that they will satisfy all needs”とし、
「 3つ の 基本構造 」 には固執していない。

「 構造化プログラミング の 観点 から goto文 を使うのは望ましくない」 ものの
「 単にgoto文 を使わなければ見通しが良くなる」という考えは
“ Go To Statement Considered Harmful ” でも否定されており、
goto文 の 有無のみに固執するのは不毛である。
構造化プログラミングの本質の一つは、状態遷移の適切な表現方法とタイミングを見極めることである。




*1:「Go To 文は有害(Harmful)とみなされる」

*2: ただし、本人が付けたタイトルは A Case Against the Goto Statement という穏便なもので、少なくとも タイトル の過 激さ と、レターとして発表を急いだことは、編集を担当していた ヴィルト によるものである

*3: その内実は言葉の有名さの割には全く知られていないし、そもそも内容や意味の理解は半世紀という時代の違いによって、かなり難しくなっていることも確かである

*4: という解説自体も 1974年に書かれたものである

*5: 英語版 en:Considered harmful の 記事などを参照