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の低レベル実装をして、泥沼にはまる読者もいるかもな)