2009-06-09 21 views

答えて

0

レキシカルスコープは、コンパイラの助けやコードの最適化に役立ちません。それは言語設計の決定です。詳細については、this questionを参照してください。

+0

こちらの48:00をご覧ください:http://www.youtube.com/watch?v=HIJ8ly8HOUQ&feature=PlayList&p=6879A8466C44A5D5&index=19 – unj2

+0

はすべてを見る時間が得られないことがあります。しかし、私はレッスンまたは2つが必要なような音です;-)ほとんどの言語設計の決定のように、 – Willem

+0

は効率に大きな影響を与えます。 –

2

私はレキシカルスコープがコンパイラと最適化に役立つと思います。それはあなたが助けによって何を意味するかによっても異なります。

レキシカルまたはスタティックスコープを使用すると、コンパイラはローカルで参照されたときに変数の可用性を証明することができます。つまり、そのレキシカルコンテキストを意味します。変数を参照するメソッドの範囲内になければなりません。

ダイナミックスコープ環境でこのようにするには、すべての呼び出しコンテキストを考慮する必要があります。関数は、呼び出しコンテキストが知っているすべての変数も知っているからです。変数を参照できるようにするためには、コンパイル時にすべての呼び出しコンテキストの再帰的なバックトラックが必要になります。

これは非常に複雑なため、コンパイル時に省略され、実行時に例外がスローされます。

hereを参照してください。対照的に、動的スコープでは、まずローカル関数を検索してからローカル関数を呼び出した関数を検索し、その関数を呼び出した関数を検索します。呼び出しスタック「動的」とは、特定の関数が呼び出されるたびにコールスタックが異なる可能性があるため、関数が呼び出される場所によって異なる変数にヒットする可能性があるということです。

1

レキシカル(または静的)スコープは、コンパイラがテキストをコードに正しく変換するために必要な情報量を削減します。コンパイラは実行時にアクセスする必要がある追加情報を追加する必要がないため、コンパイルに役立ちます(動的スコープの場合のように)。最適化のために、コンパイラはローカル変数やグローバル変数にアクセスすることができるため、他のスコープに存在する可能性のある変数を考慮する必要はありません。

0

動的スコープでは、最適化を可能にする制約を保証できないため、多くの最適化は不可能です。

これは、ストレージサイズや表現を保証しない動的言語で特に重要です。

たとえば、動的に型指定された言語のコンパイラは、ボックス化されたオブジェクトのリンクリストを取り、それがリストの要素が常に整数であることが証明できる場合は、符号なし8ビットバイトの配列で置き換えることができますこの種のものは、静的スコープを正しく使用すると証明が容易で、スペースと計算効率の両方で大幅に増加する可能性があります。

デバッグ時にダイナミック変数を追跡するのがずっと難しくなるため、レキシカルスコープのコードをデバッグする方がしばしば簡単です。 gotoとグローバル変数の過度使用によって引き起こされる問題と同様に、物事が定義されている可能性のあるスパゲッティコードがあります。

0

語彙(または静的)スコープは、言語が静的に型指定されているときに役立ちます。動的スコープは、言語が動的に型指定されたときに役立ちます。

ダイナミックスコープでは、実行時に変数のスコープが解決されます。 intと宣言された変数が、同じ名前の変数がfloat型の別の字句環境で使用されている場合。唯一、2つの異なる変数を考慮する必要がありました。つまり、変数は型情報を保持する必要があります。ほとんどの静的型システムでは、型情報はオブジェクトコードにまったく入りません。プログラムは型エラーが発生しないことを証明できるだけで簡単にコンパイルされますし、もはや型情報は必要ありません。

レキシカルスコープを持つ動的言語は、この理由でランタイム情報を割り当てるためにスタックではなくヒープを使用することがよくあります。

関連する問題