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