静的スコープ(せいてきスコープ、英: static scope)とは、プログラミング言語におけるスコープの一種。字句のみから決定できるため、字句スコープまたはレキシカルスコープ (lexical scope) ともいう。

概要

まず、一般的なローカル変数のスコープについて考える。

ブロックなどの構造を持つプログラミング言語では、あるブロックの内側のローカル変数は、そのブロックの外側からは「見えない」というものが多い。ただし、以前のJavaScript (ECMAScript) のように、サポートされるのは関数内ローカルのみで、ブロックローカルというスコープは無いものもある。

疑似コードによる例を挙げる。

ブロックAで定義されている変数xとブロックBで定義されている変数xは同じ識別子を持つが、ブロックが異なるため実体は別である。また、ブロックBからは、さらに内側のブロックCで定義されている変数を参照することはできない。逆にブロックCからはブロックBで定義されている変数xとブロックCで定義されている変数yが参照可能である。

以上のようなスコープはローカル変数として一般的なものである。しかし、上記の疑似コード中にある f = function(z) { return y z; }; のように、スコープ内にある手続きオブジェクト(クロージャ)によって、そのスコープ内における束縛を外部に持ち出すといったような(ことが可能な言語の)場合に、「静的スコープか否か」といったようなことが議論になる。

次の節で述べるCommon Lispでのdefvarや、Perlにおいてmyではなくlocalで宣言した変数といった動的スコープの場合は、その名前解決が、そのソースコードにおいて見えるように解決される(静的スコープ)のではなく、実行時の関数呼び出しの経路(コールスタック)から、ひとつひとつ呼出元をたどるようにして行われる(詳細は「動的スコープ」の記事を参照)。

それに対し静的スコープの場合は、手続きオブジェクトがクロージャによって実装されているなどのようにして、そのスコープにおける束縛が手続きオブジェクトに「ひっ付いて」おり、コールスタックによってではなく、手続きオブジェクトが作られた場所のスコープで名前が解決される(「コールスタック」の記事中の「ルーチンの入れ子における静的スコープサポート」という記述も参照)。

Common Lispにおける例

Common Lispは、静的スコープを一般的なルールとし、動的スコープの名前については明示が必要である。

脚注

関連項目

  • スコープ (プログラミング)
  • 動的スコープ

スコープってなんだろう? Think! management(シンク!マネジメント)

スコープの選び方と機能紹介[再投稿] YouTube

スコープとは?

ライブスコープって実際どうやって使うの? パースペクティブって? 写しやすいルアーや使いにくい場所など実践的な知識を紹介!|ルアマガ+|つり

スコープとは?