「組み込み」ならではの基礎知識 ――スタートアップ・ルーチンからハードウェアまで
●プログラムはコード部と変数部に分けて格納される
プログラムがコンパイルされると,プログラムの基本となる制御部分はコードと呼ばれる機械語に変換されます.コードは通常,プログラムの実行中に書き換えられることはありません.CPUはこのコードを読みながらプログラムを実行していきます.
プログラムの実行には,通常,コード以外に定数と変数が必要になります.コンパイル時に初期値が決まっていてその後いっさい変更のないものが定数で,プログラムの実行中に値が変更されるものが変数です.定数はROM(read only memory)に格納しておけます.一方,変数のためにはRAM(random access memory)が必要になります.
つまり,プログラムは,その内容が変わることのないコードと定数(以下ではまとめてコード部と呼ぶ),そして実行中に値が変わる変数(同じく変数部と呼ぶ)から構成されています.
さて,ランタイム構造の話に戻りますが,fact(3)の計算過程を見ていると関数factのコピーが三つあるようでした.すると,factの計算では再帰呼び出しが起こるたびに,別々にコード部と変数部を動的に(その場その場で)作って実行しているのでしょうか?
残念ながらそうではありません.関数factは小さな関数なのでそのコード部をコピーしてもたいしたことはありませんが,一般にコード部のサイズが大きいと考えると,あまり効率的ではないからです.実際には,図1-2に示すように変数部のみを動的に作って実行しています.三つの変数部のメモリを確保する部分はスタックと呼ばれるRAM上の領域です.スタックは,組み込みソフトウェアを開発している間はずっとつきあうことになるものです.