も参照。 自由変数と束縛変数

変数のスコープは、プログラムのテキストのどこでその変数が使われるかを表し、一方、範囲(または寿命)は、プログラムの実行で変数が(意味のある)値を持つときを表します。 変数のスコープは実際には変数名のプロパティであり、エクステントは変数自体のプロパティである。 これらはコンテキスト(環境とも呼ばれる)と混同してはならない。コンテキストはプログラムのプロパティであり、ソースコードや実行のポイントによって変化する – スコープ:概要を参照。 さらに、オブジェクトの寿命は変数の寿命と一致することがありますが、多くの場合、変数の寿命とは関係ありません。

変数名のスコープはその範囲に影響します。 ほとんどの言語では、各変数 (および他の名前付きエンティティ) に特定のスコープを定義しており、それは与えられたプログラム内で異なる場合があります。 変数のスコープとは、その変数名が意味を持ち、その変数が「見える」とされるプログラムコードの部分のことです。 スコープに入ると、その変数の寿命が始まり(コンテキストに入る)、スコープから出ると、その変数の寿命が終わります(コンテキストから出る)。 例えば、「語彙的スコープ」を持つ変数は、特定の関数/サブルーチン内、より詳細には式/文のブロック内(関数スコープまたはブロックスコープに準ずる)でのみ意味を持ちます。これは静的解決で、解析時またはコンパイル時に実行可能です。 一方、動的スコープを持つ変数は、特定の制御フローに依存するグローバルバインディングスタックに基づいて、実行時に解決されます。 特定の関数内でのみアクセス可能な変数は「ローカル変数」と呼ばれる。 一方、Extent は変数の実行時 (動的) 側面である。 変数の値への各結合は、実行時にそれ自身のエクステントを持つことができる。 バインディングのエクステントは、変数が同じ値またはメモリ位置を参照し続けるプログラムの実行時間の部分である。 プログラミング言語がガベージコレクション機能を備えていない限り、 そのエクステントが永久にそのスコープより長い変数は、 メモリリークを引き起こす可能性があります。 しかし、LispのクロージャやCの静的ローカル変数のように、変数の束縛がそのスコープを越えても許される場合があります。 スコープがエクステントより先に始まる変数は未初期化と呼ばれ、明示的に特定の値を与えられていないため、アクセスすると未定義の任意の値を持つことがよくあります (ワイルドポインタを参照)。 スコープが終了する前に範囲が終了した変数は、ぶら下がりポインタとなり、その値が破壊されたため、再び初期化されていないとみなされる可能性があります。 前の2つのケースで説明した変数は、out of extentまたはunboundと呼ばれることがあります。 多くの言語では、変数が out of extent のときにその値を使おうとするとエラーになります。 他の言語では、そうすることで予測不可能な結果が得られるかもしれません。

スペース効率のために,変数に必要なメモリ空間は,その変数が最初に使用されるときだけ割り当てられ,不要になったときに解放されるかもしれない。 変数はスコープ内にあるときのみ必要とされるため、スコープに入ったときに各変数の寿命を開始すると、未使用の変数にスペースを与えてしまう可能性がある。

プログラムの異なる部分が互いの変数を変更することで誤って相互作用しないように、変数のスコープを可能な限り狭くすることは、良いプログラミングの実践と考えられている。 そうすることで、離れた場所での動作を防ぐこともできます。 これを行うための一般的なテクニックは、プログラムの異なるセクションで異なる名前空間を使用すること、または動的変数スコープまたは語彙的変数スコープのいずれかによって個々の変数を “private” にすることです。

コメントを残す

メールアドレスが公開されることはありません。