質問

「プッシュ」という用語を使用する理由が不思議でした。および「ポップ」スタックからアイテムを追加/削除しますか?これらの用語が一般的になった物理的な隠metaはありますか?

私が持っている唯一の提案は、ハンドガン用のバネ付きマガジンのようなものです、ラウンドは「プッシュ」されます。それに「ポップ」することができます;出ますが、それは少しありそうもないようです。

第2のスタックトリビアの質問:なぜほとんどのCPUが、コールスタックをメモリ内で上向きではなく下向きに成長するように実装するのですか?

役に立ちましたか?

解決

PUSHおよびPOPという用語のソースとして、スプリング式のプレートスタックは正しいと思います。

特に、MITのイーストキャンパスコモンズカフェテリアでは、1957〜1967年の期間にスプリング式のプレートが積み重ねられていました。 PUSHおよびPOPという用語は、Tech Model Railroad Clubで使用されていました。これが起源だと思います。

Tech Model Railroad Clubは、間違いなくDigital Equipment Corporation(DEC)PDP-6の設計に影響を与えました。 PDP-6は、ハードウェアにスタック指向の命令を持つ最初のマシンの1つでした。指示は、PUSH、POP、PUSHJ、POPJでした。

http://ed-thelen.org/comp- hist / pdp-6.html#Special%20Features

他のヒント

2番目の質問について、ウィキペディアには、スタックを制御するCS哲学に関する記事があります。

http://en.wikipedia.org/wiki/LIFO

そして、最初はウィキペディアでも:

  

頻繁に使用される比phorはアイデアです   ばねのプレートのスタックの   ロードされたカフェテリアスタック。そのような   スタック、上部プレートのみが見える   他のすべてのユーザーがアクセスできます   プレートは隠されたままです。新しいプレートとして   追加され、それぞれの新しいプレートは   スタックの上部、各プレートを非表示   下、プレートのスタックを押す   ダウン。天板が   スタック、それらを使用することができ、   プレートが元に戻り、2番目の   プレートがスタックの最上部になります。   2つの重要な原則は   この比phorによって示される:最後   ファーストアウトの原則は1つです。その   2番目は、   スタックは非表示です。天板のみ   目に見えるので、上にあるものを見るために   3番目のプレート、1番目と2番目   プレートを取り外す必要があります。この   FILO-First Inと書くこともできます   Last Out、つまり挿入されたレコード   最初に最後にポップアウトされます。

2番目の質問:小さなシステムのアセンブラープログラマーは、メモリ内の低いアドレスから始まるコードを記述し、コードが追加されるにつれて高いアドレスに成長する傾向があります。

このため、スタックを下方に拡張すると、物理メモリの最上部からスタックを開始し、2つのメモリゾーンが互いに向かって拡張できるようになります。これにより、このような些細な環境でのメモリ管理が簡単になります。

ROM / RAMを分離した固定データ割り当てを使用するシステムでも、ボトムアップで構築するのが最も簡単であるため、上記の説明のコード部分を置き換えます。

このような些細なメモリスキームは非常にまれですが、ハードウェアのプラクティスは確立されたままです。

ペッツディスペンサーのように考えてください。新しいものを一番上にプッシュできます。そして上からポップします。

プッシュアンドポップを考えるとき、それは常に私が考えることです。 (おそらくあまり歴史的ではありません)

一体何がPEZであるかを自問していますか?コメントを参照してください。

読み書きは常に魅力的です(私がそこで行ったことを参照してください)。これらの言葉は短く、読み書きができ、暗示的です。古いBASICコマンドのpeekとpokeについても同じことが言えます。これらには、並列kの利点があります。

一般的な物理的メタファーは、食堂のプレートディスペンサーです。このプレートディスペンサーでは、プレートのバネ式の積み重ねにより、プレートを上から取り出すことができますが、次のプレートは同じ位置に上がります。

「第2の些細な質問」について:「アップ」を定義する際にかなりの矛盾が見られました。および「down」平均!初期の頃から、一部のメーカーと著者はページの上部に低いアドレスのメモリダイアグラムを描画し(おそらくページが読み取られる順序を模倣)、ページの上部に高いアドレスを配置します(おそらくグラフ用紙の座標を模倣します)または建物の床)。

もちろん、スタックの概念(およびアドレス可能なメモリの概念)は、このような視覚的なメタファーとは無関係です。 「成長」するスタックを実装できます。どちらの方向にも。実際、2つのスタック間でメモリの領域を共有するために使用される以下のトリック(ベアメタルレベルの実装)をよく見ました:

+---+---+--------   -------+--+--+--+
|   |   |   ->   ...   <-  |  |  |  |
+---+---+--------   -------+--+--+--+
^                                   ^
Stack 1      both stacks      Stack 2
base        "grow" toward        base
              the middle

だから私の答えは、概念的にスタックは「下へ」成長しない決してということです。または&quot; upward&quot;しかし、単に彼らの基盤から成長します。個々のスタックは、ガベージコレクションでリンクされた表現を使用している場合、どちらの方向にもどちらにも実装されない場合があります。その場合、要素はどこでもかまいませんノードスペース内)。

このページの回答は、スタック方向の質問。まとめると、古代のコンピューターとの一貫性を保つために下向きに行われたと言えます。

オリジナルのストーリーは、一部の開発者がプレートスタックを見ることが原因だと思います(ビュッフェレストランでよく見られるように)。新しいプレートをスタックの一番上にプッシュし、同様に一番上からポップしました。

メモリ内で下向きに成長するスタックについては、階層データ構造(ツリー)を扱う場合、ほとんどのプログラマーはページの上部にベース(またはトランク)があるページに喜んで描画することに注意してください...

このスレッドは本当に古いことは知っていますが、2番目の質問については考えています:

私の考えでは、メモリアドレスが減少してもスタックは成長します。紙にたくさんの数字を書く場合は、左上から始めて0から始めます。次に、数字を左から右に増やしてから、上から下に増やします。したがって、スタックは次のようになります。

000 001 002 003 004     000 001 002 003 004     000 001 002 003 004
005 006 007 008 009     005 006 007 008 009     005 006 007 008 009
010 011 012 013 014     010 011 012 013 014     010 011 012 013 014
015 016 017 018 019     015 016 017 018 019     015 016 017 018 019
020 021 022 023 024     020 021 022 023 024     020 021 022 023 024
025 026 027 028 029     025 026 027 028 029     025 026 027 028 029

太字の数字はスタックメモリを表し、太字でない数字はスタックが使用していないメモリアドレスを表します。同じ番号の各ブロックは、呼び出しスタックが成長したプログラムの段階を表します。

メモリアドレスが下に動いていても、スタックは上に向かって成長しています。

同様に、スプリング式プレートスタックを使用すると、
スタックの一番上からプレートを取り出した場合、最初のプレート(最小の番号)を呼び出しますか?それが最高だと思った。プログラマーはそれをゼロ版と呼ぶことさえあります。

なぜスタックが減少するのかという質問については、メモリを節約するために使用されると思います。

スタックメモリの最上部(最大値のアドレス)から始めてゼロまで作業する場合、変数を割り当てるよりもアドレス $ 0x00000000 に到達したかどうかを確認する方が簡単だと思いますスタックの最大の高さを指定し、そのアドレスに到達したかどうかを確認します。

使用可能なメモリの量に関係なく、スタックの制限は常に $ 0x00000000 になるため、これによりアドレス可能スペースの最後に到達したかどうかを確認しやすくなると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top