スコープ
出典: フリー百科事典『ウィキペディア(Wikipedia)』
プログラミングでのスコープとは、ある変数や関数が特定の名前で参照される範囲のこと。ある範囲の外に置いた変数等は、通常、その名前だけでは参照できない。このときこれらの変数はスコープ外である、「見えない」といわれる。
プログラミングでは、予期しない誤作動を避けるためにも、それぞれの作業段階で必要のない名前はできるだけ参照されないようにすることが望ましい(大域変数の危険性)。適切なスコープの判断は、仕様に沿ったプログラムを構成する上で重要である。
スコープの種類
構文範囲からの分類
- 大域スコープ (global scope)
- プログラムの「全体」から見えるスコープのこと。このスコープに属する変数は大域変数といわれる。BASICのような単純な言語では大域スコープしか存在しない場合がある。Pythonのような大域変数の書き換えが簡単には行えない言語も存在する。
- ファイルスコープ (file scope)
- 大域スコープと似ているが、プログラムを記述したファイルの内側でのみ参照できるスコープ。プログラムが複数のファイルから構成される場合は他のファイルから参照することはできない。
- 局所スコープ (local scope)
- ある関数やブロックの範囲内に限定されたスコープのこと。何を持って範囲を与えるかは言語により様々だが、一般に入れ子のローカルスコープは外側を参照できるのが普通である。このとき兄弟関係にあるスコープは見えない。変数宣言が必要な言語の場合は宣言文以降にスコープが制限される場合が多い。
- インスタンススコープ (instance scope)
- クラスベースのオブジェクト指向言語で、各インスタンス毎に割り当てられた変数が所属メソッド(メンバ関数)からのみ参照されるスコープのこと。いわゆるカプセル化はこれを指す。保護されない変数の場合は、クラス定義が見えていてオブジェクトにアクセスできる場合は直接参照できる。C言語の構造体参照なども一種のインスタンススコープである。
- クラススコープ (class scope)
- クラスベースのオブジェクト指向言語で、あるクラスの定義全体から参照できるスコープ。インスタンススコープと異なり変数が共有されるので、ある種の制限された大域スコープと考えることができる。クラススコープをもたない言語の場合でも、ファイルスコープを用いることで同様の機構を実現できる場合がある。ある特定のクラスだけなのか、派生クラスまでも含むのかによってそれぞれクラスインスタンススコープ/クラススコープとさらに細分化する。
スコープ導入からの分類
- 静的スコープ (static scope)
- 構文スコープ (lexical scope)。構文上で決定できるスコープのみを使用する方法。コンパイラ型の言語ではほとんどが静的スコープを採用している。
- 動的スコープ (dynamic scope)
- 静的スコープに加えて、実行時の関数の親子関係で名前を導入するスコープ。関数が呼び出し元で展開されたかのようなスコープが構成される。プログラムの構文的な構造だけからは参照範囲を決定できないため、おおむねインタプリタで使用される。
- 名前空間 (namespace)
- 厳密にいえば名前空間自体はスコープではないが、スコープを導入する機構であるためここに記述する。名前空間はある名前の集合を定義したもので、任意のタイミングで名前空間を導入し、定義された名前を参照可能にすることができる。名前空間では持続範囲を指定できるため、外部で必要のない名前の拡散を避けることもできる。
- 名前空間自体も一種のスコープを持ち、名前空間の名前によって参照される。この視点では、上記のファイルスコープやローカルスコープも暗黙の名前空間でスコープを構成していると考えられる。ただし無名であり、外部に導入できない名前空間である。