2017-03-26 8 views
2

私は、スタック/ヒープメモリモデルの使用がプログラマのための決定であるのか、それがOSに依存しているのか、そしてプログラマがそれに取り組むべきかどうかを理解できません。スタック/ヒープメモリモデルはオプションですか?

例えば、Fortran77のようなスタックレス言語は、スタックレスのアレイベースのメモリモデルを使用している現代のプラットフォームで動作できますか?代わりに、現代のFortranコンパイラは、配列メモリモデルをスタック/ヒープメモリモデルに変換する必要がありますか? (私はFortranのメモリ管理に関する多くのドキュメントを見つけることができません)

メモリモデルがプログラマのための決定である場合、私が遭遇するすべてのことが、スタック/ヒープモデルが唯一のオプションであると暗黙に仮定しているように見えますか?たとえば、LLVMはスタックフレームを使用して動作しますが、他の方法ではメモリの管理に関するドキュメントが見つかりません。 LLVM上に構築されたすべての言語、たとえ関数言語であっても、代替モデルがより適している場合は、スタック/ヒープモデルを採用する必要があります。

メモリモデルがOSの決定である場合、カスタムメモリモデルを使用するプログラムを作成するにはカスタムOSを作成する必要がありますか?たとえば、Fortranが設計されたアレイベースのメモリモデルを使用するFortranプログラムを実行する場合、カスタムOSが必要ですか?

答えがOSに依存する場合は、異なるOS間でいくつか比較してください。

+1

ソフトウェアエンジニアリングのスタックエクスチェンジサイトは、この質問のためのより良い場所かもしれません。 – jdigital

+0

@jdigital他のサイトを参照しているときは、[cross-posting frowned at](https://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

を指摘しておくと役立つことがよくあります。どのようにスタックレスですか?それは確実にプログラムスタックを持ち、スタックにメモリを割り当てることができます。動的メモリ割り当て(ヒープ)は使用できません(少なくとも私が正しく覚えている場合)。あなたはその質問のより具体的な例を挙げることができますか? – linuxuser27

答えて

4

スタックとヒープには何もありません直接とFortranとの間には、標準では何も言及されていません。同様にC、少なくともC89まで、私の知識はあまり良くありません。むしろコンパイラは、標準で定義されている言語機能を基礎となるメモリモデルに変換する必要があります。そのメモリモデルはコンパイラの実装者の選択ですが、通常、ターゲットOSが提供する機能を使用するのが最も便利です。したがって、スタックやヒープが頻繁に見られますが、少なくともFortranとCが関係する限り、プログラミング言語とは関係ありません。

0

あなたにはいくつかの誤解があるようです。まず第一に、FORTRANの実装は一般的に(常に実際には?)スタックを使います。 Classic FORTRANはスタックに変数を割り当てることはできませんが、スタックを使用してプロシージャを呼び出す必要があります。静的引数フレームを使用するFORTRAN実装でも、スタックフレームが作成されます。

ヒープは、ランダムな割り当てとメモリの割り当て解除を管理するメモリです。いくつかのプログラミング言語は、ダイナミックな文字列や配列(BASICなど)を管理するなど、ヒープを暗黙的に使用します。他のプログラミング言語では、プログラマはヒープを使用することができるが、それを必要としない(例えばC)。いくつかのプログラミング言語は、一般に、プログラマーがアクセス可能な構成要素(例えば、Cobol、classic FORTRAN)のためにヒープを全く使用しない。

関連する問題