経緯
今日もエラーの原因調査のために地道に関数を1個ずつ見てたりネットで調べてました。
いつまで経っても結果を報告しに来ない私に、無口な先輩が遠くから「順番追えば行けるやろ。コールスタック見ろ」と声がかかります。
何を言っているのか分からないので黙っていると、先輩がすっ飛んできました。
「スタックって分かる?」
メモリとスタックと再帰関数
スタックとは、後に入れたものが先に出る構造(FILO: First In, Last Out)になっている何かのこと。
スタックの説明でよくコップ上の絵が書いてありますよね。
先輩「メモリの中に変数や関数をスタックする領域がある。機械は人間が読めるような言語じゃなくて、機械語を読んでる。機械語からCPUが計算したあと、次にどこに戻ればいいかがスタックされてる。」
だから再帰関数の戻り値とか変数とか同じ関数内なのに、それぞれきれいに上へ戻して計算できるのはスタックからFILO順に結果を返しているからだそう!
スタックオーバーフロー
stack over flow エラーって見ますよね。
これはメモリのスタックで使用している領域が足りなくなると発生するエラーだそうです。
たしかに再帰関数で終了条件を間違えた時に見たことがあります。おそらくスタックの容量が不足したんでしょうね。
Visual Studioでも存在を確認
Visual Studioの「呼び出し履歴」はスタックを利用したものだそうです。
関数がどこから呼び出されているか順番に表示されます。
どこかにブレークを置いてデバッグ中に、[デバッグ] メニュー -> [ウィンドウ] -> [呼び出し履歴] で開きます。
英語名は "call stack window", つまり先輩が言っていた「コールスタック見ろ」が指すのは「呼び出し履歴」のことでした。
あとがき
Atcoderでデータ構造の一種としては学びましたが、実際にどう役に立ってるか意識してなかったので、知識と経験が繋がっていって驚きました!
スタックがメモリで使われていることで、エラー内容やvisual studioの機能といった目に見える形で現れているとは気づいていませんでした。
パソコンのことは本だけではなく、実践からも学べておもしろいですね。