静的スコープとは
静的スコープ(static scope)は、
プログラミング言語におけるスコープの一種で、変数の有効範囲を決定する方法です。字句スコープ(lexical scope)とも呼ばれ、コードのテキスト構造のみに基づいて、変数がどの範囲から参照可能かを決定します。
多くの
プログラミング言語では、ブロック(例えば、`{}` で囲まれたコードのまとまり)内で定義された
ローカル変数は、そのブロックの外側からはアクセスできません。これは、変数名が同じでも、異なるブロックで定義されていれば、それらは別の実体として扱われることを意味します。しかし、古いバージョンの
JavaScriptのように、関数内
ローカル変数はサポートされていても、ブロック
ローカル変数がサポートされていない言語もあります。
// 疑似コードの例
ブロックA {
変数 x を定義
ブロックB {
変数 x を定義 // ブロックAのxとは別の変数
ブロックC {
変数 y を定義
// ここでは、ブロックBのxとCのyを参照可能
}
}
}
上記の例では、ブロックAで定義された変数`x`とブロックBで定義された変数`x`は、同じ名前を持ちますが、異なる変数です。ブロックCからは、ブロックBで定義された`x`とブロックCで定義された`y`を参照できますが、ブロックBからはブロックC内の変数にはアクセスできません。これは
ローカル変数における一般的なスコープの概念です。
静的スコープの重要性
手続きオブジェクト(
クロージャ)がスコープ内の変数を外部に持ち出す場合、「静的スコープかどうか」が重要になります。静的スコープでは、手続きオブジェクトが作成された場所のスコープで変数が解決されます。一方、
動的スコープでは、変数が参照される場所の実行時の関数呼び出しの経路(
コールスタック)に基づいて解決されます。
静的スコープのメリット
予測可能性: コードの見た目から変数の有効範囲がわかるため、プログラムの動作を予測しやすくなります。
可読性: 変数がどこで定義され、どこで参照されているかが明確になり、コードが読みやすくなります。
保守性: スコープが明確であるため、コードの変更による影響範囲を特定しやすくなり、保守性が向上します。
スコープの種類 | 名前解決の方法 | 特徴 |
---|
:-- | :--------------- | :------------- |
静的スコープ | 手続きオブジェクトが作成されたスコープで解決する。 | コードの見た目からスコープが決定され、予測しやすい。 |
動的スコープ | 変数が参照される場所のコールスタックをたどって解決する。 | 実行時の呼び出し状況によってスコープが変化する。 |
Common Lispでは、静的スコープがデフォルトのルールであり、
動的スコープを使用するには明示的な宣言が必要です。
まとめ
静的スコープは、プログラムの可読性、予測可能性、保守性を高めるために重要な概念です。変数の有効範囲をコードの構造から静的に決定することで、複雑なプログラムでも変数の名前衝突を避け、コードを理解しやすくすることができます。
関連情報
スコープ (プログラミング)
*
動的スコープ