「末尾再帰最適化」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
'''末尾再帰最適化'''(まつびさいきさいてきか)とは、賢い[[コンパイラ]]が[[末尾再帰]]を検出すると、[[最適化]]時に[[再帰]]を展開し、消し去ってくれる機能のことである。 | '''末尾再帰最適化'''(まつびさいきさいてきか)とは、賢い[[コンパイラ]]が[[末尾再帰]]を検出すると、[[最適化]]時に[[再帰]]を展開し、消し去ってくれる機能のことである。 | ||
− | + | [[末尾再帰]]であれば後に続く処理はないので、途中経過を保持する[[変数]]と、[[プログラマー]]が手で書くとボロクソに言われる[[goto文]]を用いて、[[再帰]]を無くす(展開する)ことができる。 | |
− | [[ | ||
− | [[末尾再帰]] | + | 末尾再帰最適化はこの[[末尾再帰]]の特性を利用し、[[再帰]]は[[リソース]]馬鹿食いで[[スタックオーバーフロー]]の危険性があり、何よりクソ重い、かといって[[プログラマー]]が手動で[[再帰]]を展開しておくと9割方[[ソースコード]]がクソ読みにくくなる、という問題を[[コンパイラ]]による[[最適化]]時に半自動で解決してくれる優れものである。 |
− | + | ただし、[[末尾再帰最適化]]が行われるかは[[コンパイラ]]の気分次第であり、どうなるかわからない諸刃の剣。たとえば[[C Sharp|C#]]であれば、[[マイクロソフト]]製の[[コンパイラ]]で、ターゲットが[[x64]]、かつリリースビルド(最適化が有効な状態)でのみ末尾再帰最適化が行われる。つまりデフォルトでは最適化が無効となっているデバッグビルド時には末尾最適化が行われないという。 | |
− | |||
− | |||
− | [[末尾再帰最適化]] | ||
− | |||
− | |||
− | [[C Sharp|C#]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== 関連項目 == | == 関連項目 == | ||
− | * [[ | + | * [[末尾最適化]] |
− | |||
− | |||
− | |||
== 参考文献 == | == 参考文献 == |