コールスタック 【call stack】 関数スタック / function stack / 実行スタック / execution stack / 制御スタック / control stack
概要
コールスタック(call stack)とは、コンピュータプログラムの実行時に用いられるメモリ領域の一つで、関数などを呼び出す際に呼び出し元の情報や引き渡す引数の値などを一時的に保管しておくためのもの。スタック(stack)は最も基本的なデータ構造の一種で、データを領域の末尾に追加していき、取り出すときは末尾から取り出すというルールで管理される。このルールは最も最後に追加されたデータが最初に取り出されるため、「LIFO」(Last-In, First-Out)とも呼ばれる。
プログラムが実行される際には一定のメモリ領域がコールスタック用に確保される。関数などの呼び出しが行われると、終了時に戻るべきメモリ上の実行位置(リターンアドレス)や、呼び出し側が保持していたレジスタなどの情報がスタックに追加される。この操作を「ワインド」(winding)あるいは「プッシュ」(push)という。
関数の実行が終わると、スタックの末尾のデータが取り出されて削除され、保管してあった内容に従ってレジスタの値などを呼び出し前の状態に復元し、リターンアドレスで指定された位置から実行を再開する。この操作を「アンワインド」(unwinding)あるいは「ポップ」(pop)という。
関数の中からさらに別の関数を呼び出す場合には、スタックの末尾にデータを追加して実行を開始し、終了したら末尾のデータをアンワインドする。複雑なプログラムでは何段階もスタックに情報が積み上がっていく。スタック用に確保した領域を使い果たし満杯状態でさらに関数呼び出しを行おうとすると「スタックオーバーフロー」という実行時エラーとなる。
一回の操作でスタックに積み上げるひとまとまりのデータの単位のことを「スタックフレーム」(stack frame)という。内容や形式はプログラミング言語やオペレーティングシステム(OS)、CPUの種類などによって異なる。リターン時に必要となる情報だけでなく、呼び出し側からの引数の引き渡しなどに用いる場合もある。