株式会社きじねこ株式会社きじねこは大阪のソフトウェア開発会社です。組込み系・業務系のプログラム開発から電子回路の設計までおまかせください。コンパイラが管理しているスタックのことです。多くのCPUでは、スタックを実現するための機能がハード的に備わっています。スタック専用のハードウェアがないことが多いのですが、その場合は、コンパイラによってソフト的に同じ機能を実現しています。言語で記述されたプログラムを動作させるには、スタックの仕組みが不可欠です*1。言語以外の大多数のプログラム言語についても同じことがいえます*2。標準規格ではスタックについてはまったく触れられていませんが、現実的にはスタックなしで実行処理系を作ることはまず無理です。スクリプト言語のようなインタプリタの場合、スタックはソフト的に実現されている場合があります。コンパイラが管理しているスタックについて解説するわけですが、スタックというデータ構造がわからないと話が進みません。そこで、簡単なプログラム片を使って、スタックの基礎について解説してみたいと思います。*sp++;}上のコードは、スタックを理解するためのコード片です。コンパイラが作り出している場合はアセンブリ言語のコードになるわけですが、ここでは概念を理解していただくためにC言語で記述してみました。sp)が現在の操作位置を示します。用いて行うことになります。言語で記述されたプログラムを動作させるために、実際にスタックがどのように使われているかを見ていきたいと思います。スタックを使う状況の中でも、もっとも典型的である、関数の呼び出しについてです。arg);そして、この関数を次のように呼び出すことにします。先頭アドレスに分岐します。func;というイメージになります。行います(実引数をスタックから取り除くことになります)。ra;戻り先アドレス:pop();となります。このように、スタックを使うことで、関数の中からまた別の関数を呼び出すことが可能になります。関数の呼び出しが何段階になっても、スタックの領域があふれない限りは問題なく動作します。再帰呼び出しなどでよくありますが、あまりにも関数の呼び出し階層が深くなると、そのうちスタックの領域が足りなくなって、動作がおかしくなってしまいます。)記憶クラス指定子を付けない限り、自動記憶域期間を持ちます。ここでは、そのような変数(正確にはオブジェクト)のことを自動変数と呼ぶことにします。実は自動変数も、大多数の処理系ではスタックを利用しています。よって操作しなければならないのですが、自動変数を実現する場合は、ちょっと反則気味な手法がとられています。繰り返すと、変数の管理も大変ですし、そのためのワーク領域としてのメモリが必要になりますし、実行効率も悪くなります。使わずに、スタックポインタからの相対位置などを用いて、直接アクセスするようになっていることがほとんどです。具体的な例を挙げて解説することにしましょう。宣言する場合について考えてみます。行ってもよいのですが、普通はそうではなく、スタックポインタから直接3を引く場合が多いようです。*/のようになります。よってスタックポインタを元に戻してやれば、自動変数を解放することができます。フレームポインタ先ほどは、自動変数へのアクセスはスタックポインタ(sp)からの相対位置を用いる例を取り上げました。多くの処理系では、自動変数や仮引数へのアクセスのために、フレームポインタという概念を取り入れています。添え字が必ずしも一定になるわけではなく、管理が面倒になりますし、何よりデバッグが大変になります。そのため、関数が呼び出された直後のスタックポインタの値をフレームポインタに保持しておき、自動変数はフレームポインタからの相対位置を使うわけです。sp;という擬似プログラムで表されるような操作が発生します。破壊しないようにするためです。*/のようになります。*/のようになります。アクセスするためのfpの添え字も変わってきます。このように、フレームポインタを使用する場合、添え字がプラスであれば実引数を、マイナスであれば自動変数を指すことになります。言語の規格で決まっているわけではないので、処理系ごとに異なるルールになっているかもしれませんが、大体こんなところだと考えてよいでしょう。言語の解説書では、「スタック」という言葉が普通に使われていることも少なくないのですが、スタックそのものについての解説は案外少ないように思います。コンパイラがどのようにスタックを利用しているかが分からなかったりします。言語で実際に開発を行うには、スタックについての理解が不可欠です。確かに知らなくても何とか動くものは作れますが、不具合が起きたときの解析力などは、スタックを理解しているのとそうでないのとでは、雲泥の差があります。第15期を迎えました。事務所を移転しました。新年あけましておめでとうございます。明日から使える徹底入門』をウェブ上に全文掲載しました。株式会社クローバーフィールドの公式ウェブサイトが移転しました。弊社または株式会社クローバーフィールドで受注いたします。組込みエンジニアを募集しています。Inc.リンクはご自由に。