「末尾再帰最適化」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
'''末尾再帰最適化'''(まつびさいきさいてきか)とは、賢い[[コンパイラ]]が[[末尾再帰]]を検出すると、[[最適化]]時に[[再帰]]を展開し、消し去ってくれる機能のことである。 | '''末尾再帰最適化'''(まつびさいきさいてきか)とは、賢い[[コンパイラ]]が[[末尾再帰]]を検出すると、[[最適化]]時に[[再帰]]を展開し、消し去ってくれる機能のことである。 | ||
− | |||
[[末尾呼び出し最適化]]([[Tail Call Optimization]]、[[TCO]])の一種で、[[再帰]]だとその効果が絶大だという話であり、やっていることは同じである。 | [[末尾呼び出し最適化]]([[Tail Call Optimization]]、[[TCO]])の一種で、[[再帰]]だとその効果が絶大だという話であり、やっていることは同じである。 | ||
− | [[末尾再帰]]([[末尾呼び出し]])であれば後に続く処理はないので、その関数内で使われている変数などは破棄でき(末尾呼び出しされる関数の引数は除く)、途中経過を保持する[[変数]]を用意することで、[[プログラマー]]が手で書くとボロクソに言われる[[goto文]]や[[アセンブリ言語]]のjmp命令などを用いて[[再帰]] | + | [[末尾再帰]]([[末尾呼び出し]])であれば後に続く処理はないので、その関数内で使われている変数などは破棄でき(末尾呼び出しされる関数の引数は除く)、途中経過を保持する[[変数]]を用意することで、[[プログラマー]]が手で書くとボロクソに言われる[[goto文]]や[[アセンブリ言語]]のjmp命令などを用いて[[再帰]]を無くす(展開する)ことができる。 |
− | 末尾再帰最適化はこの[[末尾再帰]]([[末尾呼び出し]])の特性を利用し、[[再帰]](関数呼び出し)は[[リソース]]馬鹿食いで[[スタックオーバーフロー]]の危険性があり、何よりクソ重い、かといって[[プログラマー]]が手動で[[再帰]](関数)を展開しておくと9割方[[ソースコード]] | + | 末尾再帰最適化はこの[[末尾再帰]]([[末尾呼び出し]])の特性を利用し、[[再帰]](関数呼び出し)は[[リソース]]馬鹿食いで[[スタックオーバーフロー]]の危険性があり、何よりクソ重い、かといって[[プログラマー]]が手動で[[再帰]](関数)を展開しておくと9割方[[ソースコード]]がクソ読みにくくなり、偉いプログラマーにボロクソ言われる、という問題を[[ソースコード]]の書き方を気を付けておくことで[[コンパイラ]]が[[最適化]]時に半自動で解決してくれる優れものである。 |
== 末尾再帰最適化に対応した主なプログラミング言語 == | == 末尾再帰最適化に対応した主なプログラミング言語 == | ||
− | [[末尾再帰最適化]]([[末尾呼び出し最適化]])が行われるかは[[コンパイラ]] | + | [[末尾再帰最適化]]([[末尾呼び出し最適化]])が行われるかは[[コンパイラ]]の気分次第であり、どうなるかわからない諸刃の剣。実際に末尾呼び出し最適化をサポートしているコンパイラであっても100%発動するとは限らない場合もあるので過信しすぎには注意する必要がある。 |
=== C# === | === C# === |