Dijkstra の GOTO 文を使うのはよくなさそうという小論文を読んでみた

GOTO が悪いというわけではない


Posted on Sat, Jul 6, 2019
Tags dijkstra, goto, programming

Dijkstra の goto 文を使うのはよくなさそうという小論文を読んだ

Dijkstra はどうして goto は高級言語では使うべきじゃないと考えたのか

CleanArchitecture 本で Dijkstra の話が出てきた。 エドガー・ダイクストラ - Wikipedia はグラフ理論のダイクストラ法が有名だが、当時簡単には使えなかったコンピュータを理論から考えた強いプログラマという風に考えることができる。

Dijkstra68.pdf から小論文は読むことができ、わずか 1ページのため、興味がある方は実際に読んでみてほしい

Dijkstra の注目点 1

プログラマにとって、自身がつくる「プログラムの結果が期待通りになる」ことが重要である。 というのは、プログラムを作成するプログラマは「プログラムが動作する」という結果よりも「プログラムがどう動作するか考える」というプロセスを長い時間行うからである。

Dijkstra の注目点 2

静的に定義されたプログラムと動的な実際のプログラムの動作を一致させることが重要。

当時、実際のプログラムの動作を把握することは非常に難しかったのだろう。 そのため、ソースコードを読んで、そのプログラムの動作を頭でシミュレートできることがプログラムを作る上で大切だった。

今ではリッチなデバッガがあるため、Dijkstra も現在なら意見を変えているかもしれない。 とはいえ、個人的な経験でも、実際に本番で動いているアプリケーションの動作を把握することは難しいため、Dijkstra の主張は身にしみてわかる。

コードがどのように動いているか(進捗; progress)を静的なコードで把握できるようにした方がよい

1, 2 の注目点から、「静的に定義されたプログラム上で、どのように動的なプログラムの動作を定義する」かが課題となる。

そのために、GOTO ではなく、if や for, while を使った方がよい。その理由は下記のとおり。

if 文

条件分岐を GOTO で記載することはできるが、if 文を使えば「どういう条件分岐なのか」がプログラムを見て分かりやすい。 これはつまり、ソースコード上で、「いまはどんな条件下なのか」という進捗を把握できるということだ。

for 文

ループ処理も index という動的な状態をプログラム上に記載することで、どういう進捗なのかということが、プログラムから分かりやすい。

これらの構文は、プログラムの動作について、ある種の座標 (coordinate system) を与えるものであり、それゆえにどのような挙動をしているのか、ソースコードから理解する助けになる。

GOTO 文の乱用は unbridle (馬の勒 (頭につけて引っ張るやつ) を外すこと) 状態にする

まとめると、Dijkstra のこの小論文での主張は、GOTO を使いすぎるのは、プログラマにとって重要な「どのような動作をするかをプログラムを読んで理解する」ことを妨げる。 そのため、「GOTO 文はよくなさそう」と主張したのである。今から 51 年前に主張されて、その論旨は現在も変わらないと思う。

(considered harmful と言っているだけで、GOTO は何がなんでも駄目だという主張はしていない)

感想

自分の解釈では、プログラムの動作が分かりさえすればよいので、現在の状況で GOTO を反射的に拒否するというのは適切でないと思う。しかし、if, for で記述できるのであれば、その方がよいと思う。

そういう意味では、よりプログラムの動作が分かりやすい静的コードが作れるのであれば、if や for 文が適切でないこともある。 例えば、やたらとネストが深い if 文や連続した for, break ばかりの for は 動作が分かりやすいプログラムと言えるのだろうか

Dijkstra の主張は、そうした「動的な挙動が分かりづらいコード」はプログラマにとって良くないということを伝えていると思う。

過去の研究者の論文を読んでいると、その先見性に凄みを感じることがある。 個人的には、フォン・ノイマンやアラン・チューリング、ダイクストラが現在にいたら、どんなエンジニアになっていたのだろうかと考えたりする。

それほどまでに、現在のコンピューターは発展を遂げているし、これからも楽しみだったりする。