スクリプト言語、例えばPerlやPHPやRubyでコードを書いて動かした場合はどうなるのでしょうか?
そもそも、「プログラム領域、静的領域、スタック領域、ヒープ領域」というのは、OS のネイティブコードを実行している時のプロセスのアドレスレイアウトの話なので、厳密に言うと「C 言語」というプログラミング言語に依存した話ではありません。コンパイルしてネイティブコードを生成できるものであれば、基本、このメモリレイアウトになります。
で、スクリプト言語であれば、OS 側から見ると、そのスクリプト言語の処理系であるプログラムが実行されているプロセスに過ぎません。Perl がスクリプトを読み込んで処理をしているのも、エディタがテキストファイルを読み込んで、画面に内容を表示しているのも、OS から見ると「あるプロセスがファイルを読み込んで処理している」という事に違いはありません。
つまり、スクリプトが書かれたファイルは、その処理系に対する入力データに過ぎません。
処理系に読み込まれたスクリプトの内容は、おそらくは、ヒープ領域上にロードされるでしょう。スクリプト上で確保している変数も、おおむね、ヒープ領域上に確保されるでしょう。でも、そこに書かれている内容を実際に処理しているのは処理系なので、スクリプトで書かれた内容が、プログラム領域に配置される事はありません。スクリプト中で自分が定義した定数も、処理系本体にとっては、与えられたデータの一部に過ぎないので、静的領域に配置されることもありません。
そもそも、プログラム領域、および、静的領域は、書き込み不可の領域としてプロセス起動時に OS から割り当てられるものなので、あとから読み込まれるスクリプトによって割り当てられる事はないです。
もし機会があれば、処理系のソースコードを読んでみると良いでしょう。と言っている私も、PHP の特定の処理の極々一部を眺めた事があるだけで、また、処理系全体を理解しようとすると、今時の処理系はかなり複雑な事をしているので、全部を理解する必要はないですが、スクリプト言語を実装する側に回ってみると、記述したスクリプトがどう扱われるのか、理解が深まると思います。
質問で挙げているスクリプト言語は、処理系(インタプリタ)がメモリ管理を行います。
たとえばPHPにはガベージコレクション(http://www.php.net/manual/ja/features.gc.php)という機能があって、PHP処理系がプログラマに意識させることなく動的にメモリ管理を行います。
プログラム領域、静的領域、スタック領域、ヒープ領域はC言語特有のメモリ管理方式で、ユーザー(プログラマ)がメモリ管理することを前提にしています。これに対し、他の高級言語はメモリ管理をユーザーに開放していません。
PHPを高級言語と呼ぶかどうかはさておき、メモリ管理はZend Engineに委ねられています。
ただ、C言語で書かれている言語であることもあり、メモリ管理のためのAPIやツールが用意されています。
詳しくは下記のサイトを呼んでください。
http://www.phppro.jp/phpmanual/php/internals2.memory.management.html
ありがとうございます!
こんなかんじでどうですか?
スクリプト | 割り当て先 |
---|---|
プログラム領域に相当するもの | スクリプトファイル |
プログラムカウンタに相当する物をスクリプトの各行と捉えれば…… | |
スクリプトを解釈した結果の構文木等をメモリ上に蓄えるところまで考えると実行環境内のヒープ | |
静的、スタック領域に相当するもの (グローバル変数や一時的なメモリ) | 実行環境内のヒープ |
スクリプト内のグローバル変数等は実行環境が確保したメモリ上に確保されるため | |
ヒープ領域に相当するもの (new ほにゃららしたときのメモリなど) | 実行環境内のヒープ |
ほほう、ほとんどヒープなのですね。
参考になります。
そもそも、「プログラム領域、静的領域、スタック領域、ヒープ領域」というのは、OS のネイティブコードを実行している時のプロセスのアドレスレイアウトの話なので、厳密に言うと「C 言語」というプログラミング言語に依存した話ではありません。コンパイルしてネイティブコードを生成できるものであれば、基本、このメモリレイアウトになります。
で、スクリプト言語であれば、OS 側から見ると、そのスクリプト言語の処理系であるプログラムが実行されているプロセスに過ぎません。Perl がスクリプトを読み込んで処理をしているのも、エディタがテキストファイルを読み込んで、画面に内容を表示しているのも、OS から見ると「あるプロセスがファイルを読み込んで処理している」という事に違いはありません。
つまり、スクリプトが書かれたファイルは、その処理系に対する入力データに過ぎません。
処理系に読み込まれたスクリプトの内容は、おそらくは、ヒープ領域上にロードされるでしょう。スクリプト上で確保している変数も、おおむね、ヒープ領域上に確保されるでしょう。でも、そこに書かれている内容を実際に処理しているのは処理系なので、スクリプトで書かれた内容が、プログラム領域に配置される事はありません。スクリプト中で自分が定義した定数も、処理系本体にとっては、与えられたデータの一部に過ぎないので、静的領域に配置されることもありません。
そもそも、プログラム領域、および、静的領域は、書き込み不可の領域としてプロセス起動時に OS から割り当てられるものなので、あとから読み込まれるスクリプトによって割り当てられる事はないです。
もし機会があれば、処理系のソースコードを読んでみると良いでしょう。と言っている私も、PHP の特定の処理の極々一部を眺めた事があるだけで、また、処理系全体を理解しようとすると、今時の処理系はかなり複雑な事をしているので、全部を理解する必要はないですが、スクリプト言語を実装する側に回ってみると、記述したスクリプトがどう扱われるのか、理解が深まると思います。
> 「プログラム領域、静的領域、スタック領域、ヒープ領域」というのは、OSがネイテ> ィブコードを実行している時のプロセスのアドレスレイアウトの話である。
なるほど、とても明快な回答で、もやもやしていた疑問がすっきりしたました。
ありがとうございました!
> 「プログラム領域、静的領域、スタック領域、ヒープ領域」というのは、OSがネイテ> ィブコードを実行している時のプロセスのアドレスレイアウトの話である。
2014/07/09 18:02:52なるほど、とても明快な回答で、もやもやしていた疑問がすっきりしたました。
ありがとうございました!