レキシカルスコープはどのようにコンパイラに役立ちますか?コンパイルや最適化に役立ちますか?なぜレキシカルスコープがコンパイラより優先されますか?
答えて
レキシカルスコープは、コンパイラの助けやコードの最適化に役立ちません。それは言語設計の決定です。詳細については、this questionを参照してください。
私はレキシカルスコープがコンパイラと最適化に役立つと思います。それはあなたが助けによって何を意味するかによっても異なります。
レキシカルまたはスタティックスコープを使用すると、コンパイラはローカルで参照されたときに変数の可用性を証明することができます。つまり、そのレキシカルコンテキストを意味します。変数を参照するメソッドの範囲内になければなりません。
ダイナミックスコープ環境でこのようにするには、すべての呼び出しコンテキストを考慮する必要があります。関数は、呼び出しコンテキストが知っているすべての変数も知っているからです。変数を参照できるようにするためには、コンパイル時にすべての呼び出しコンテキストの再帰的なバックトラックが必要になります。
これは非常に複雑なため、コンパイル時に省略され、実行時に例外がスローされます。
hereを参照してください。対照的に、動的スコープでは、まずローカル関数を検索してからローカル関数を呼び出した関数を検索し、その関数を呼び出した関数を検索します。呼び出しスタック「動的」とは、特定の関数が呼び出されるたびにコールスタックが異なる可能性があるため、関数が呼び出される場所によって異なる変数にヒットする可能性があるということです。
レキシカル(または静的)スコープは、コンパイラがテキストをコードに正しく変換するために必要な情報量を削減します。コンパイラは実行時にアクセスする必要がある追加情報を追加する必要がないため、コンパイルに役立ちます(動的スコープの場合のように)。最適化のために、コンパイラはローカル変数やグローバル変数にアクセスすることができるため、他のスコープに存在する可能性のある変数を考慮する必要はありません。
動的スコープでは、最適化を可能にする制約を保証できないため、多くの最適化は不可能です。
これは、ストレージサイズや表現を保証しない動的言語で特に重要です。
たとえば、動的に型指定された言語のコンパイラは、ボックス化されたオブジェクトのリンクリストを取り、それがリストの要素が常に整数であることが証明できる場合は、符号なし8ビットバイトの配列で置き換えることができますこの種のものは、静的スコープを正しく使用すると証明が容易で、スペースと計算効率の両方で大幅に増加する可能性があります。
デバッグ時にダイナミック変数を追跡するのがずっと難しくなるため、レキシカルスコープのコードをデバッグする方がしばしば簡単です。 gotoとグローバル変数の過度使用によって引き起こされる問題と同様に、物事が定義されている可能性のあるスパゲッティコードがあります。
語彙(または静的)スコープは、言語が静的に型指定されているときに役立ちます。動的スコープは、言語が動的に型指定されたときに役立ちます。
ダイナミックスコープでは、実行時に変数のスコープが解決されます。 intと宣言された変数が、同じ名前の変数がfloat型の別の字句環境で使用されている場合。唯一、2つの異なる変数を考慮する必要がありました。つまり、変数は型情報を保持する必要があります。ほとんどの静的型システムでは、型情報はオブジェクトコードにまったく入りません。プログラムは型エラーが発生しないことを証明できるだけで簡単にコンパイルされますし、もはや型情報は必要ありません。
レキシカルスコープを持つ動的言語は、この理由でランタイム情報を割り当てるためにスタックではなくヒープを使用することがよくあります。
- 1. なぜパブリック変数にプロパティが優先されますか?
- 2. index.htmlがindex.phpよりも優先されるのはなぜですか?
- 3. なぜRelayCommandをRoutedCommandより優先しますか?
- 4. Application_ErrorがPage_Errorよりも優先されます
- 5. CompareAttributeのエラーがRequiredAttributeよりも優先されます
- 6. CNAMEレコードの*が明示的なサブドメインより優先されますか?
- 7. は@Column columnDefinitionの@Temporalより優先されますか?
- 8. 優先度キューを表すヒープがバイナリツリーより優れているのはなぜですか?
- 9. コンパイラはインラインよりもインラインで優れていますか?
- 10. 印刷時に通常のスタイルシートが印刷スタイルシートより優先されるのはなぜですか?
- 11. ASP.NETルーティングがweb.configのHttp Handlersセクションよりも優先されるのはなぜですか?
- 12. .NETでP/InvokeよりもCOM相互運用が優先されるのはなぜですか?
- 13. 投稿要求がレールでの削除より優先されるのはなぜですか?
- 14. なぜ `boost :: any`は` void * `より優れていますか?
- 15. /resourceまたは/ resource /はRESTish Webサイトでより優先されますか?
- 16. なぜDOMツリーのプリオーダー、深さ優先のトラバーサルですか?
- 17. RoR - ラックミドルウェアまたはアクティブコントローラのフィルタが優先されますか?
- 18. 呼び出し可能はRunnableよりも優先されますか?
- 19. インターフェイスのカスタムイベントは、デフォルトのフォームイベントよりも優先されますか?
- 20. ArrayListはいつJavaの配列よりも優先されますか?
- 21. なぜデータ構造のアライメントを優先しますか?
- 22. {%load static%}と{%load staticfiles%}:どちらが優先されますか?
- 23. RにはJavaのPriorityQueueのような優先度キューがありますか?
- 24. Scalaに保持されている不変優先キューがありますか?
- 25. シフトがCの加減算よりも優先順位が低いのはなぜですか?
- 26. ログイン領域のインライン幅は、CSSのデフォルトよりも優先されます
- 27. デフォルトのボタンは、リッチテキストコントロールの入力よりも優先されます
- 28. static_castのような演算子の優先度はなぜですか?
- 29. スカラ、より低い優先順位でインポートしますか?
- 30. この深さ優先検索でNullPointerExceptionが生成されるのはなぜですか?
こちらの48:00をご覧ください:http://www.youtube.com/watch?v=HIJ8ly8HOUQ&feature=PlayList&p=6879A8466C44A5D5&index=19 – unj2
はすべてを見る時間が得られないことがあります。しかし、私はレッスンまたは2つが必要なような音です;-)ほとんどの言語設計の決定のように、 – Willem
は効率に大きな影響を与えます。 –