「スコープ (プログラミング)」の版間の差分

削除された内容 追加された内容
編集の要約なし
28行目:
 
=== スコープ導入からの分類 ===
; [[静的スコープ]] (static scope) : 構文スコープ ('''lexical scope''')。構文上で決定されるスコープ。
:; [[動的スコープに加えて、]] (dynamic scope) : 実行時の関数の親子関係で名前を導入が導入されるスコープ。関数が呼び出し元で展開されたかのようなスコープが構成される。プログラムの構文的な構造だけからは参照範囲を実行時に名前による解定できが必要ため、おおむね[[イ普通にコタプリタ]]で使用さパイルしてこを実現するのは面倒である。
: 構文スコープ ('''lexical scope''')。構文上で決定できるスコープのみを使用する方法。[[コンパイラ]]型の言語ではほとんどが静的スコープを採用している。
; [[名前空間]] (namespace) : 厳密にいえば名前空間自体はスコープそのものではなく、スコープを導入する機構である。おおまかに2通りのものを名前空間と呼んでいる。(1)名前の集合を定義するもので、任意のタイミングで名前空間を導入し、定義された名前を参照可能にすることができる。名前空間では持続範囲を指定できるため、外部で必要のない名前の拡散を避けることもできる。名前空間自体も一種のスコープを持ち、名前空間の名前によって参照される。この視点では、上記のファイルスコープやローカルスコープも暗黙の名前空間でスコープを構成していると考えられる。ただし無名であり、外部に導入できない名前空間である。<br/>(2)ごく単純なプログラミング言語を除いて、たとえば構造体のメンバ名などは、他の名前と干渉せず、その構造体の中でユニーク(唯一)であれば任意の名前が使える([[予約語]]と同一の場合は制限されることもある。字句や構文の都合にもよる)。そのような「名前が干渉せず、区切られている」それぞれの空間を名前空間という。Lispにおける「Lisp-1とLisp-2の議論」などがある。
:
; [[動的スコープ]] (dynamic scope)
: 静的スコープに加えて、実行時の関数の親子関係で名前を導入するスコープ。関数が呼び出し元で展開されたかのようなスコープが構成される。プログラムの構文的な構造だけからは参照範囲を決定できないため、おおむね[[インタプリタ]]で使用される。
:
; [[名前空間]] (namespace)
: 厳密にいえば名前空間自体はスコープではないが、スコープを導入する機構であるためここに記述する。名前空間はある名前の集合を定義したもので、任意のタイミングで名前空間を導入し、定義された名前を参照可能にすることができる。名前空間では持続範囲を指定できるため、外部で必要のない名前の拡散を避けることもできる。
: 名前空間自体も一種のスコープを持ち、名前空間の名前によって参照される。この視点では、上記のファイルスコープやローカルスコープも暗黙の名前空間でスコープを構成していると考えられる。ただし無名であり、外部に導入できない名前空間である。
 
==関連項目==