ダイナミックリンクは以前のアクティベーションレコードを指しているので、ダイナミックスコープのプログラミング言語では意味があります。しかし、静的スコープのプログラミング言語では、アクセスリンク(1つの下位ネストレベルで機能のアクティブ化記録を指す)が十分でない理由は何ですか? 特にCで - なぜアクセスリンクが必要でないのですか?そして、なぜダイナミックリンクが必要ですか?機能起動レコードにダイナミックリンクが必要なのはなぜですか? (静的スコープ言語で)
答えて
:
アクティベーションレコード:スタックフレーム
ダイナミックリンク:[保存]フレームポインタ
ので、あなたの質問を次のように解釈します:なぜフレームポインタが必要ですか? [1]
フレームポインタはではなく、が必要です。
一部のコンパイラ(Green Hills C++、-O2付きGCCなど)は、通常、生成しないか、生成しないように要求することができます(MSVC、GCC)。それはもちろんありません、と述べた
は、その利点を持っている:call stackの
簡単トラバース:stack traceを生成するフレームポインタがヘッドを形成してリンクリストを横断するのと同じくらい簡単です。スタックトレースとデバッガの実装をはるかに簡単にします。
より簡単なコード生成:常に変化するスタックポインタの代わりにフレームポインタをインデックスすることによって、スタック変数を参照できます。各プッシュ/ポップでスタックポインタが変化し、フレームポインタは、(prologue/epilogue間)関数内で一定に保た
物事がゆがんで行くべき、stack unwindingは、フレームポインタを使用して行うことができます。これは、Borlandの構造化例外処理(SEH)の仕組みです。
スタック管理を合理化:
setjmp(3)
、alloca(3)
とC99-VLAの特に実装可能(通常は行うが)それに依存します。
欠点:
- レジスタの使用:x86のみ8汎用レジスタを得ました。これらの1つは、フレームポインタを保持するために完全に専用化する必要があります。
- オーバーヘッド:すべての機能に対してプロローグ/エピローグが生成されます。
しかし気づいたように、コンパイラはフレームポインタを維持しなくても完全に細かいコードを生成できます。
[1]それが意味するものではない場合は、詳しく説明してください。
おそらく、ダイナミックリンクは「フレームポインタ」ではなく「ディスプレイリンク」です。 –
@BasileStarynkevitch私が理解しているように、ダイナミックリンクは、関数のアクティベーションレコードをそのダイナミックなプレデセッサ(つまり、呼び出し側のアクティベーションフレーム)にリンクします。したがって、私はこの質問を意味として解釈しました。なぜ、フレームポインタが必要なのですか?しかし、OPが心に留めていることであれば、私は完全にはわかりません。それを反映するために私の答えを編集しました。 – a3f
ご質問はoptimizing optionGCCのに関連するかもしれない、そしてthisを参照してください。
ところで、多くの人々は、あなたが活性化レコードに名前を何(call stackに)コールフレームを命名されています。 continuation、またcontinuation passing styleとA-normal formの概念は密接に関連しています。
動的リンクは、実際にはnested関数(とおそらくclosures)にのみ有効であり、標準Cにはそれらがありません。一部の人々はディスプレイのリンクを話します。標準Cはネストされた関数を持っていないので、関連するトリック(表示リンク、トランポリン、...)は必要ありません。
GCCコンパイラはC言語の拡張としてnested functions提供し、そしてあなたが考えているものに非常に密接に、活性化レコードのダイナミックリンクでそれらを実装します。ウィキペディアもman or boy testとtrampolineでお読みください。私は私にもっとよく知っている、この命名法を使用します
- 1. CustomFieldSerializerに静的メソッドが必要なのはなぜですか?
- 2. 静的型付き言語で型の宣言が重要なのはなぜですか?
- 3. java静的メソッドなぜ必要です
- 4. グローバルconst charには "静的"が必要ですが、ブールには必要ないのはなぜですか?
- 5. なぜNode.jsでテンプレート言語が必要ですか?
- 6. 静的イニシャライザで宣言の順序が重要なのはなぜですか?
- 7. プッシュ機能が必要なのはなぜですか?
- 8. 必要な機能の間にスコープが必要
- 9. 機能的で純粋なプログラミング言語
- 10. プログラミング言語でコンパイラを作成するために必要な言語機能は何ですか?
- 11. 静的ビルドで共有ライブラリが必要なのはなぜですか?
- 12. なぜ機能に「静的」な定義がありますか?
- 13. 静的リンクと動的リンクに別々のライブラリが必要なのはなぜですか?
- 14. F#何が機能的な言語になるか
- 15. この静的アサートが機能しないのはなぜですか?
- 16. ClassInitializeメソッドを静的にする必要があるのはなぜですか?
- 17. jQueryでドラッグ機能が起動しないのはなぜですか?
- 18. Java 8でコンシューマとサプライヤの機能が必要なのはなぜですか?
- 19. イメージ登録で機能の説明が必要なのはなぜですか?
- 20. OO言語に実際にPROTECTEDアクセス修飾語が必要なのはなぜですか?
- 21. なぜSpring起動アプリケーションクラスに@Configurationアノテーションが必要なのですか?
- 22. jQuery.live関数が静的要素で機能しないのはなぜですか?
- 23. lambdaを使用するために機能的なインターフェイスが必要なのはなぜですか?
- 24. この機能が起動しないのはなぜですか?
- 25. Kotlinプリントステートメントでスコープの明確化が必要なのはなぜですか?
- 26. なぜPythonのsubprocess.check_outputが機能するには、shell = Trueが必要ですか?
- 27. ここでスコープ解決が機能しないのはなぜですか?
- 28. C++で動的配列が必要なのはなぜですか?
- 29. 静的メソッドで使用するとC#enum型を静的宣言する必要がないのはなぜですか?
- 30. なぜこのコードで静的修飾子が必要ですか?
さらに詳しい情報を提供してください。私はプログラミング言語Cと一緒に使用されている用語 "活性化レコード"を聞いたことがありません。 – Downvoter
多分OPは[これは](http://www.cs.nmsu.edu/~rth/cs/cs471/f00 /ARIs.html) – LPs
これは共有ライブラリの静的変数に関連していますか? – wallyk