導入
コンピューティングでは、識別子のスコープは、この識別子がリンクされている範囲です。このスコープは字句的または動的にすることができます。

語彙範囲
字句スコープは、ソース コードの一部によって定義されます。この部分内では、識別子にはリンクが 1 つだけあります。
グローバル スコープの識別子は、ソース コード全体にバインドされます (宣言または定義された後でのみバインドされる場合もあります)。多くのプログラミング言語では、すべての関数にグローバル スコープがあります (例: C)。グローバル スコープを持つ識別子が変数を指定する場合、グローバル変数と呼びます。これらは通常、プログラム内の複数の場所に有用なデータを保存するために使用されます。特殊な場合はロックです。
ローカル スコープの識別子は、言語の構文構造 (通常はそれが宣言または定義されている構造) 内でのみバインドされます。ローカル スコープの識別子が変数を指定する場合、ローカル変数と呼びます。さらに、ほとんどの言語では、ローカル スコープの識別子は、同じ名前でより高いスコープの識別子、つまりローカル スコープがマスキング識別子の構造を包含する構造である識別子、つまりグローバル スコープの識別子をマスクします。
スキームの例:
REPL > ( foo 42 を定義) ;グローバル変数 foo には値 42 REPL > foo が含まれます。変数 foo へのアクセス42 REPL > ( let ( ( foo - 1 ) ) ;値 -1 foo を含むローカル変数 foo が定義されている let フォームの開きます。 let 形式の終わり。変数 foo - 1 REPL > foo の値を返します。変数 foo 42へのアクセス
歴史的
字句スコープの原則は、 LISP 1.5 で初めて導入されました。これは Algol 60 に追加され、その子孫は通常字句のみ (C、Pascal) です。プロモーターであるScheme は、やはり字句スコープのみを持つ Lisp 方言です。 Common Lisp には、Scheme からインポートされた字句スコープと動的スコープの両方があります。
ダイナミックスコープ
動的スコープは、実行中にエントリポイントとエグジット ポイントで区切られた動的エクステントで定義されます。動的スコープの識別子をバインドすると、この新しいバインディングを作成するシェイプの動的スコープ内の以前のバインディングが非表示になります。したがって、動的変数と呼ばれる動的スコープを持つ変数を使用すると、環境への変更を呼び出しスタックに反映させることができます。
Common Lisp の例:
CL-USER > ( defvar *foo* 42 ) ;値 42 を含む動的スコープ変数 *foo*を定義*FOO* CL-USER > ( defun return-foo ( ) ; *foo* の値を返す関数を定義 *foo * ) RETURN-FOO CL -USER > ( return -foo ) ;変数 *foo* へのアクセス42 CL-USER > ( let ( ( *foo* - 1 ) ) ; フォームを開く let *foo* を値 -1, ( return-foo ) ) ;その実行は、この接続の動的スコープを構成します- 1 CL-USER > ( return-foo ) ;変数 *foo* 42へのアクセス
そして、動的スコープを持たない Scheme の同じ例:
REPL > ( define foo 42 ) REPL > ( define ( return - foo ) foo ) REPL > ( return - foo ) 42 REPL > ( let ( ( foo - 1 ) ) ( return - foo ) ) ;ここで、 return-foo を実行すると、字句スコープ内の変数 foo にアクセスします42 REPL > ( return - foo ) 42
非関数型言語、特にPostScriptを含む Forth (スタック言語) から派生した言語も動的スコープをサポートします。使用される方法は、スタック位置ごとに変数のディクショナリへの参照を含む2 番目のスタック (パラメータ スタックや関数戻りスタックとは独立しており、多くの場合 2 つのスタックは共通です) を使用することです。スタックの最上部で参照される最初のディクショナリで変数が見つからない場合、検索はスタックの下位のディクショナリで続行されます。
変数の各辞書は通常、各辞書内で最適な検索時間を得るためにハッシュ テーブルによってモデル化されます (検索時間は辞書に格納されている変数の数にほとんど依存しません)。これを行うには、変数名が、ハッシュ関数を使用して情報ビットが均等に分散されたデジタル検索キーに変換されます。次に、この数値キーをハッシュ テーブルのサイズの間隔に換算して、変数が格納されている場所を取得します。衝突の可能性があるため、ハッシュ テーブルには、使用される各位置に変数名のエントリが含まれます (正しい変数がそこに格納されているかどうかを同等にチェックできるようにするため)。同じ計算キーを共有する変数の衝突を解決するには、さまざまな戦略があります。
- ハッシュ テーブルのサイズを増やし、そこに既に格納されている変数を再配布します。変数を追加する場合、この操作はコストがかかりますが、衝突の数を制限することができます。
- ハッシュ テーブル内の同じ位置を共有する変数をリストにチェーンします。衝突リストはテーブルの外部にあることも、ハッシュ テーブル内の空き位置からランダムに選択された位置を占有することもできます。
- 共通のハッシュ キー、別のハッシュ テーブルへの参照などの別の変数 (最初のテーブルで同じキーを共有するすべての変数を含む)、別のハッシュ関数を使用した 2 番目のテーブル (この場合は検索時間) によって決定される位置に格納します。変数の総数に応じて部分的に対数になり、部分的に線形ではなくなります)。
PostScript と Forth は、すべてのディクショナリ (スコープ スタックで参照される) 自体が名前を付けることができる変数であるという点で特別であり、直接使用することも、取得する前にスコープ スタックでも検索される名前で検索することもできます。参照をスコープ スタックに積み重ねることができます。したがって、これらの言語には予約された変数名はなく、すべての定義済みオブジェクト名は実際にはスコープ スタック内で参照されます。スコープ スタックは決して空ではありませんが、少なくとも独自の参照と独自の名前を含む最初のスコープの「システム」辞書を参照します。さらに、スコープ スタックで参照されるディクショナリの 1 つでそれらの参照を削除することで、後続のすべてのスコープ解決から特定の変数を選択的に削除することができます (これにより、特定の変数を特定のスコープ レベルから非表示にして、そのスコープ変数を使用することが可能になります)下位のスコープ レベルで定義されます)。また、エントリの 1 つを別のエントリに置き換えることもできます (初期スコープで定義された変数はアクセスできなくなりますが、同じ名前の別のエントリに置き換えられますが、タイプが異なる可能性があります。これにより、完全に一致するシステム変数を作成できます)アクセスできません)。非表示にします)。
名前のスコープは、値を保存および参照するための言語だけではありません。また、ほとんどの階層ファイル システムでは、アクセス可能なファイル名をさまざまなビューで表示することができます。システム全体(およびシステムがホストするすべてのプロセス) に対してファイル名の辞書が 1 つだけある、非常に単純な古いファイル システムだけが、ファイル名のスコープを 1 つだけサポートします (ただし、追加のファイルを格納することで、ファイル名を拡張するためにそのまま使用できます)ファイル形式の名前辞書)。
- たとえば、 UnixとLinuxでは、ファイル名はスコープ変数 (この場合、ファイル ディレクトリは辞書) によってアクセス可能なファイル オブジェクトに解決され、同じファイルを複数の異なる名前 (複数のファイルを含む) で参照することもできます。スコープの解決には、名前でファイルにアクセスするプロセスに固有のグローバル変数が使用されます。この変数はchrootによって変更可能であり、「/」で始まる名前を検索することでこの「ルート」辞書を暗黙的に参照します。
- chdirのような操作を使用して、サブディレクトリの概念と、あるスコープ レベルから別のスコープ レベルへの動的ナビゲーションをサポートする現在の辞書への参照を含む別の変数。この簡単な名前付けは、現在のオペレーティング システムの事実上すべてのファイル システムでサポートされています。
- 一部のファイル システムでは、それぞれに名前を割り当てることで、複数のルート ディクショナリを同時に使用できます。 CPM、 DOS 、またはWindowsファイル システムの場合、各ルートは一意の文字で指定されます (必須ではありませんが、通常は参照ファイルを含むドライブまたはボリュームを指定します)。このように名付けられた各リーダーには、各プロセスに固有の現在のディレクトリがあり、各プロセスは現在のリーダーにも関連付けられます。
- 他のシステム (VMS など) はさらに進んで、単一のドライブ文字に限定されず、事実上無限の数の現在のボリュームにそれぞれ独自の名前を付けることができます。この場合、各プロセスにはアクセス可能なボリュームの辞書が存在し、その中にファイルまたは他のディレクトリが見つかり、プロセスのコンテキストで独自のボリュームの辞書内に保存できます。これにより、両方の動的スコープ解決方法 (階層型またはコンテキスト型) の利点が組み合わされます。
vdm | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| ソフトウェアライブラリ | 標準ライブラリ ・ネームスペース ・フレームワーク ・テンプレート・インターフェース ・プログラミングインターフェース( API ) | ||||||||
| 語彙 |
| ||||||||
| ソースコード内 |
| ||||||||
| ソフトウェア開発ツール | 開発環境 • 統合開発環境( IDE ) • ドキュメントジェネレータ • バージョン管理 • モデル • パッチ • 仕様 | ||||||||
| 民間伝承 | Hello world • シンプルで愚かなままにしてください • エキゾチックなプログラミング言語 | ||||||||
| カテゴリ:ソフトウェア開発 • カテゴリ:コンピュータプログラミング | |||||||||
