人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語でプログラムを作って動かした場合、プログラム領域、静的領域、スタック領域、ヒープ領域などと4つの領域が使われるそうですが、
これは何の仕様でそう決まっているのでしょうか。

C言語の仕様?OSの仕様?コンパイラの仕様?

(ちなみにK&Rを見てみましたが、そのようなことは記述されていませんでした)

●質問者: DQNEO
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● 師匠
●67ポイント

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

回答になっていないですが、C99にも書いてなさそう?ですね。stackやheapで検索してもひっかからないです。


2 ● 井戸端さん
●67ポイント

ノイマン型に由来するCPUを使っているからよ。
ノイマン型 - Wikipedia

アドレス付けされた記憶装置とそれらをつなぐバスを要素に構成され、命令(プログラム)とデータを区別せず記憶装置に記憶する。


「区別せず」は、コンピュータはどこに何が書かれているかなんて知らないから、どのアドレスをどのように使うかをプログラマが決めなければならないってことなのよ。

最初に必要なのはプログラムを書いておく領域よね。そのつぎに静的なデータを書く領域、ルーチン呼び出しで局所変数を退避したりする場所としてのスタック、最後にプログラマが自由に使えるヒープと大まかに4つに分けたの。

プログラムを書き始めるアドレスはCPUによって決まっているからプログラム領域はおのずと定まってくるわ。スタックもマシン語レベルで用意されているものよ。それらにたいして静的領域とヒープの境は実はあいまいなの。ふたつをまとめてデータ領域と呼ぶ場合もあったりするほどにね。
8bitCPUのハンドアセンブルを少しかじれば理解しやすくなるわ。今さら8bitが必要かはわからないけど64bitCPUでハンドアセンブルなんて考えたくないもの。必要だと思うならZ80で探せばいまもたくさんの情報があるわよ。


DQNEOさんのコメント
むむ・・ ただ、別にヒープ領域にプログラムを置いてもいいわけですよね。(スクリプト言語ならスクリプトはヒープ領域に展開されると聞きました。)

井戸端さんさんのコメント
>> スクリプト言語ならスクリプトはヒープ領域に展開される << プログラム本体からみたらスクリプトファイルは手続きの書かれているデータにすぎないの。 データを展開するなら自由に使えるヒープ領域を使うのは当然の流れでなくて? http://q.hatena.ne.jp/1404552223 でJULYさんに教わったこともうお忘れかしら? >> スクリプトが書かれたファイルは、その処理系に対する入力データに過ぎません。 <<

DQNEOさんのコメント
それはわかるのですが、私の質問は「何の仕様でそれが決まっているのか?」です。

3 ● snow0214
●66ポイント

最初にC言語が主に動いていたCPU「PDP-8」と、そこから派生した32ビット機械語命令セットのVAXが大きく影響しています。K&RはVAXがあることが当たり前の人たちなので、あえてテキストには出てきません。

遅れて勃興したIntelのCPUを参考にしていたら、プログラム領域とスタック領域で十分だったはずです。

結局、VAX系にヒープの概念があったことが、後の仮想記憶にスムーズに繋がりました。
今でこそWindowsは仮想記憶が利用できますが、Intelのアーキテクチャは、そもそもヒープや仮想記憶を想定していませんでした。Intelの32ビット命令は、VAXより10年以上後に登場したにもかかわらず、まったく美しくありませんでした。Pentiumが登場するまで、常に物理メモリでやりくりせざるを得ませんでした。

結局、メモリ管理はVAX方式が王道であることが、いまのWindowsやLinuxで証明されています。
ゆえに、そのメモリ管理をプリミティブに実現しているC言語は、いまでもプログラミング言語の基礎として学ばれているのです。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ