読者です 読者をやめる 読者になる 読者になる

突き進めればgotoは使わない機能になる

使ってはならないのは「goto」ではない

go to文は 有害である

みねこあさん経由。
自分なりの視点で書きます。


最近書いているプロジェクトは二十万行程度の規模ですが、
gotoは一度も出現しません。

しかし、
ifやfor、while、switch、returnなどは惜しみなく登場するし、
doも登場します。
なのになぜgotoは出現しないのでしょうか?
(組み込んだライブラリの中には存在するけどね)

それは、多分普通に使わないから。
小難しい事を無視して語るのならば「gotoを使わなければ綺麗に書けない」という状況がほぼ存在しないと考えます。
for の多重ネストから抜けたりエラー処理をするのには勿論使われるでしょうが、
せいぜいがその程度で、これらを綺麗に書くことはgotoを使わなくても可能。

で、自分が考えたのは、

非常に局所的で必要最小限のジャンプだけをgotoが行うとしたとき、
実はgotoはいらない機能になるのではないか?

みねこあさんがいわれるように、

もちろんgoto が役に立つケースや、goto を上手に使った方がコードがスッキリするケースは ありますが、それは極々限られた頻度であり、「規則は単純な方がよい」の規則により、原則禁止とする チームが多いのだと、わたしは理解しています。許可するのであれば、「ごく限られたパターン」への適用に限り例外とする、イディオムでの運用に限るべきであり、それは 一見 goto の字面をした、けれども gotoではない制限された制御構造である、と認識すべきと考えます。

http://d.hatena.ne.jp/minekoa/20090712/1247398356

極々限られたパタンでだけ出現するgotoは結局はいらない子になるのではないか、
と感じます。

要するにifだろうとforだろうとwhileだろうとswitchだろうと、
JPです。(JMPです、でもいいです)
ジャンプします。そうです、飛んでるんです。
コンピュータの中で起きていることは一緒です。
これらはgotoと同じジャンプをする命令なんです。
アセンブリに落ちたとき、ほぼ必ずジャンプしているんです。
ひどいことを言えば
returnもRETでジャンプです。関数呼び出しもCALLもでジャンプです。

なのに、なぜgotoだけが嫌われるのか?
なぜgotoだけが使ってはいけないのか?

C言語で、「ポインタ」を濫用すると危険だからといって「ポインタを使用禁止」にしないように、「goto」だけを使用禁止にするのはおかしな話です。

http://www.kijineko.co.jp/node/536

ポインタの代替は存在しませんが(参照でも無理)、
gotoのより適切な代替記法は殆どの場合必ず存在します。
なので、gotoを使うのならばより適切な意味を持つJP(RET、CALL)にしなさい。
それが「本当にないならば」gotoを使いなさい。
となるのではないかと思います。

僕自身、ここはgotoかな?
と思う事は幾度とあっても、なんだかんだいって業務のコードでgotoを書いたことがここ二年で一度もありません。
gotoを失っても特に困らない自分がいます。
(既存のコードが通らなくなるのは困りますが)

と、ここまで書いて、
minekoaさんの「蛇足」と「コメント欄」で決着がついているように思いました。

主旨にあまり影響しない重箱つつきの揚げ足取りでアレですが、C に限れば この論は破綻しています。なぜなら、goto なしでCのプログラムを「現実的なコスト」&「読みやすさ」を犠牲にせずに書くことは出来ますが、ポインタ無しでこれらをクリアするのは多分ムリだからです。従って ポインタを免罪符に goto を許すという論理は通りません。
一方 C に限らない話であれば、ポインタは排除される方向にあり、Java はもちろん C++ でさえ、プリミティブすぎる「ポインタ」は そうでないより抽象的な「参照」や「(外部)イテレータ」に姿を変えています。そう言う意味で「ポインタは許されるのにgotoは許されないなんて納得イカン」は理にかなってるなぁ、と思いました。

http://www.kijineko.co.jp/node/536

Python などでswitchがないのも、
より適切でないジャンプする制御命令は消えていこうとしているからではないかなーなんてことを思います。
gotoやポインタが消えていったように、やがてはすべて消えるのかもしれません。