これは何の仕様でそう決まっているのでしょうか。
C言語の仕様?OSの仕様?コンパイラの仕様?
(ちなみにK&Rを見てみましたが、そのようなことは記述されていませんでした)
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
回答になっていないですが、C99にも書いてなさそう?ですね。stackやheapで検索してもひっかからないです。
ノイマン型に由来するCPUを使っているからよ。
ノイマン型 - Wikipedia
アドレス付けされた記憶装置とそれらをつなぐバスを要素に構成され、命令(プログラム)とデータを区別せず記憶装置に記憶する。
「区別せず」は、コンピュータはどこに何が書かれているかなんて知らないから、どのアドレスをどのように使うかをプログラマが決めなければならないってことなのよ。
最初に必要なのはプログラムを書いておく領域よね。そのつぎに静的なデータを書く領域、ルーチン呼び出しで局所変数を退避したりする場所としてのスタック、最後にプログラマが自由に使えるヒープと大まかに4つに分けたの。
プログラムを書き始めるアドレスはCPUによって決まっているからプログラム領域はおのずと定まってくるわ。スタックもマシン語レベルで用意されているものよ。それらにたいして静的領域とヒープの境は実はあいまいなの。ふたつをまとめてデータ領域と呼ぶ場合もあったりするほどにね。
8bitCPUのハンドアセンブルを少しかじれば理解しやすくなるわ。今さら8bitが必要かはわからないけど64bitCPUでハンドアセンブルなんて考えたくないもの。必要だと思うならZ80で探せばいまもたくさんの情報があるわよ。
最初にC言語が主に動いていたCPU「PDP-8」と、そこから派生した32ビット機械語命令セットのVAXが大きく影響しています。K&RはVAXがあることが当たり前の人たちなので、あえてテキストには出てきません。
遅れて勃興したIntelのCPUを参考にしていたら、プログラム領域とスタック領域で十分だったはずです。
結局、VAX系にヒープの概念があったことが、後の仮想記憶にスムーズに繋がりました。
今でこそWindowsは仮想記憶が利用できますが、Intelのアーキテクチャは、そもそもヒープや仮想記憶を想定していませんでした。Intelの32ビット命令は、VAXより10年以上後に登場したにもかかわらず、まったく美しくありませんでした。Pentiumが登場するまで、常に物理メモリでやりくりせざるを得ませんでした。
結局、メモリ管理はVAX方式が王道であることが、いまのWindowsやLinuxで証明されています。
ゆえに、そのメモリ管理をプリミティブに実現しているC言語は、いまでもプログラミング言語の基礎として学ばれているのです。
プログラム本体からみたらスクリプトファイルは手続きの書かれているデータにすぎないの。
2014/07/13 23:34:00データを展開するなら自由に使えるヒープ領域を使うのは当然の流れでなくて?
http://q.hatena.ne.jp/1404552223 でJULYさんに教わったこともうお忘れかしら?
それはわかるのですが、私の質問は「何の仕様でそれが決まっているのか?」です。
2014/07/18 06:57:55