goto文は悪か?
私は、goto文は必要だと思っている。
なぜなら、機械語レベルであれば、普通にgoto文に近い命令が沢山あるのだ。 なんなら、if文とgoto文のような組み合わせで作られているのが機械語、と言っても過言ではないのだから。
C#での、例えばこんな命令は、こう書き換えられる
こういう処理は、C#の初心者プログラマでも見たことはあるでしょう。 コンソールアプリでこのような Program.cs を書いてみてください。
void Hello()
{
Console.WriteLine("Hello, Moriyaki.");
}
for (int i = 0; i < 10; i++)
{
Hello();
}
まあ、これで、10回私もりゃきに挨拶を繰り返すことになります。
さて、これは極論すると「糖衣構文」なのです。
for 文の部分をこう書き換えてみてください。
int i = 0;
Start:
if (!(i < 10))
{
goto End;
}
Hello();
i++;
goto Start;
End:
;
全く同じ動きをするはずです(私の環境でもちゃんと確認しています)。
これは、決して偶然ではなく、極論するとですが、先ほど申し上げた「糖衣構文」の糖衣を剥ぎ取ったコードなんです。
もちろん、こんな書き方をした方が「速い」という意味では一切ありません。
JITコンパイラが、きちんと最適化するので、きちんとfor文を使ってください。
もちろんwhile文や、foreach文についても、if文とgoto文で書けるかと思いますので、余裕のある読者様は是非挑戦してみてください。
今のコンパイラ言語の糖衣構文は、もはや最適化手段!
今回はC#を例に挙げましたが、goto構文がある言語であれば同様のことができます。
しかし、原則このような行いをしてはいけません。
特にC#のJITコンパイラですと、単純なgoto文にするだけでなく、もっと繊細な最適化をしている可能性が高いのです。
そうでなくとも、保守を考慮すると「読みやすいコード」こそが最適化の一つの手段と呼べるのです!
考えてみてください?ほんの数コンマ秒の最適化を施した「つもり」になって、そのバグ修正で何時間もかかっていたら? 人の時間という、最も高いコストを支払わなければならなくなるのです。
ですから、教養として「基本こういう原理だ」と知った上で、各言語で推奨された方法で記述する、 それが総合的に最も最適化されたコードになり得るのです。
(……ふふふ、これでforeachの低レベル実装をして、泥沼にはまる読者もいるかもな)