テールコールとは
コンピュータープログラミングでは、末尾呼び出しは、プログラムソースコード内の特定の状況であり、関数、サブルーチン、またはプロシージャは、戻り値を保持する変数を渡すだけでなく、別の関数を呼び出して期待値を返します。 名前自体は、返される値を計算するために呼び出される関数が、それを呼び出して戻り値を提供する関数の末尾、つまり末尾にあることを示しています。 特定の最適化またはコンパイラの動作により、メイン関数のコード位置を格納するために追加のスタックスペースが使用されないため、一部のプログラマにとってテールコールは興味深いものです。 代わりに、tail関数を使用して、元の関数が呼び出されたコールポイントに直接戻り値レポートを生成します。 末尾呼び出しの使用は、再帰呼び出しが非常に深くネストしている場合に呼び出し元アドレスを格納するために使用されるスタックスペースの量がすぐに不足し、プログラム実行を停止する可能性があるため、再帰が使用される状況で特に役立ちます。 テールコールを使用すると、プログラムの速度、メモリ使用量、効率が向上しますが、ソースコードが再構成されて、特に次のような場合にデバッグと追跡が困難になる方法でコールが使用される場合があります。再帰。
テールコールの存在は、ほとんどの場合、ほとんどのコンピュータープログラムおよびシステムアーキテクチャ内でコールスタックがどのように機能するかによるものです。 スタックは、プレートのスタックのようなもので、先入れ先出しのデータ構造です。 関数、サブルーチン、またはプロシージャが呼び出されると、スタックフレームと呼ばれる呼び出し元のアドレスがスタックに格納されます。 これは、関数Aを呼び出すプログラムが関数Bを呼び出すことを意味し、2つのスタックフレームがあります。1つは関数B、もう1つは関数Aです。関数Bの実行が完了すると、そのスタックフレームがスタックと実行は関数Aに戻ります。関数Aは、終了時にスタックからフレームがポップされ、最後に最初の関数が最初に呼び出されたポイントにプログラム制御を返します。
末尾呼び出しが使用される場合、関数のreturnステートメントは、別の関数の戻り値を呼び出しコードに送信されるデータとして直接使用します。 上記の例で、関数Aがreturnステートメントを使用して関数Bを直接呼び出す場合、末尾呼び出しが形成されています。 コールスタック内で、関数AとBの両方にスタックフレームを持たせる代わりに、関数Bは関数Aから戻りアドレスを受け取り、関数Aのスタックフレームはポップされて破棄されます。つまり、関数Bは戻り値を直接返します。最初に制御を関数Aに戻すことなく、関数Aを呼び出した場所に移動します。これにより、関数呼び出しの速度が向上し、スタック内の情報量を抑えることができます。
テールコールのプロパティは、再帰関数にとって非常に魅力的なオプションになります。 再帰関数とは、リストデータ構造を走査する場合のように、それ自体を繰り返し呼び出して値を計算する関数です。 ネストされた関数呼び出し用に追加のスタックフレームは作成されないため、スタックオーバーフローやプログラムの終了の差し迫った脅威なしに、非常に深いレベルの再帰を安全に実行できます。