静的スコープ

静的スコープ（せいてきスコープ、）とは、プログラミング言語におけるスコープの一種。字句のみから決定できるため、字句スコープまたはレキシカルスコープ () ともいう。
概要.
まず、一般的なローカル変数のスコープについて考える。
ブロックなどの構造を持つプログラミング言語では、あるブロックの内側のローカル変数は、そのブロックの外側からは「見えない」というものが多い。ただし、以前のJavaScript (ECMAScript) のように、サポートされるのは関数内ローカルのみで、ブロックローカルというスコープは無いものもある。
疑似コードによる例を挙げる。
A {
 var x;
B {
 var x; // A内のxとは別物
 var f;
 C {
 var y; // Cの内側からしか見えない
 y = rand();
 f = function(z) { return y + z; };
 x = f(42);
ブロックcodice_1で定義されている変数codice_2とブロックcodice_3で定義されている変数codice_2は同じ識別子を持つが、ブロックが異なるため実体は別である。また、ブロックcodice_3からは、さらに内側のブロックcodice_6で定義されている変数を参照することはできない。逆にブロックcodice_6からはブロックcodice_3で定義されている変数codice_2とブロックcodice_6で定義されている変数codice_11が参照可能である。
以上のようなスコープはローカル変数として一般的なものである。しかし、上記の疑似コード中にある codice_12 のように、スコープ内にある手続きオブジェクト（クロージャ）によって、そのスコープ内における束縛を外部に持ち出すといったような（ことが可能な言語の）場合に、「静的スコープか否か」といったようなことが議論になる。
次の節で述べるCommon Lispでのcodice_13や、Perlにおいてcodice_14ではなくcodice_15で宣言した変数といった動的スコープの場合は、その名前解決が、そのソースコードにおいて見えるように解決される（静的スコープ）のではなく、実行時の関数呼び出しの経路（コールスタック）から、ひとつひとつ呼出元をたどるようにして行われる（詳細は「動的スコープ」の記事を参照）。
それに対し静的スコープの場合は、手続きオブジェクトがクロージャによって実装されているなどのようにして、そのスコープにおける束縛が手続きオブジェクトに「ひっ付いて」おり、コールスタックによってではなく、手続きオブジェクトが作られた場所のスコープで名前が解決される（「コールスタック」の記事中の「ルーチンの入れ子における静的スコープサポート」という記述も参照）。
Common Lispにおける例.
Common Lispは、静的スコープを一般的なルールとし、動的スコープの名前については明示が必要である。
(setf func-lex
 (let ((a 3))
 (lambda () a)))
 (funcall func-lex))
(setf func-dyn
 (let ((*a* 3))
 (lambda () *a*)))