C#のループ構文は糖衣構文だ!実はif文とgoto文で実装できる!
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の低レベル実装をして、泥沼にはまる読者もいるかもな) ...