名前解決

名前解決（）は、名前と実体の関係を明らかにすることであり、情報技術関連で以下のような意味を持つ。

 プログラミング言語における名前解決 
プログラミング言語の式には、識別子が含まれる。式の意味は、その識別子が指す実体が何であるかに依存する。識別子がその文脈において何を指すのかを決定するアルゴリズムは、その言語の定義の一部である。

そのアルゴリズムの計算量は、その言語の洗練度合いによって変わってくる。例えば、アセンブリ言語での名前解決は単純な連想配列の参照だが、C++の名前解決には以下のような事柄が関係し、遥かに複雑である。
 名前空間により、ある識別子はどの名前空間に属しているかで意味が変わってくる。
 スコープにより、スコープのレベルによって識別子の意味が異なる場合がある。また、スコープはオーバーライドされたり、隠蔽されたりする。基本的には最も近いスコープでの束縛を見つけることで名前解決でき、局所変数は大域変数に取って代わることになる。
 「可視性規則 (visibility rules)」により、特定の名前空間やスコープの識別子が現在のコンテキストから見えるかどうかが決定される。
 多重定義により、名前空間やスコープが同じであっても、識別子の使い方によって異なる意味を持たせることができる。
 「アクセス可能性 (accessibility)」により、通常なら可視のスコープにある識別子を名前解決の際に考慮するか否かが変更できる。
 「実引数依存の名前探索」により、実引数の型に関係する名前空間から解決の候補となる名前を探す場合がある。

 静的と動的 
プログラミング言語では、名前解決をコンパイル時に行うものと実行時に行うものがある。前者を「静的名前解決」、後者を「動的名前解決」と呼ぶ。

静的名前解決をするプログラミング言語としては、C言語、C++、Pascal などがある。動的名前解決をするプログラミング言語としては、LISP、Perl、Python、Tcl、PHP、REBOL などがある。

 ネットワークにおける名前解決 
コンピュータネットワークにおける名前解決とは、抽象度の高いアドレス（ホスト名など）に対応する抽象度の低いアドレス（例えばIPアドレス）を見つけることである。名前解決を行うコマンドとして nslookup や host がある。詳しくは Domain Name System、OSI参照モデルを参照のこと。

他に、WindowsネットワークのWindows Internet Naming Service (WINS)、AppleTalkのName Binding Protocol (NBP)等がある。

 テキストマイニングにおける名前解決 
テキストマイニングソフトウェアでの名前解決とは、自然言語のテキストを参照して、名詞が参照している人物や事物を具体的に特定することである。

 単純なテキストでの名前解決 
例えば、次のような文章を解釈する場合を考える。

ジョンはエドワードにその本をあげた。そして彼は立ち上がり、ジョンに部屋に戻るよう呼びかけた。

この文章をソフトウェアが解釈する際、「彼」が「ジョン」なのか「エドワード」なのかを決定する必要がある。また、2つ目の文にある「ジョン」が1つ目の文の「ジョン」と同じ人物かどうかを決定しなければならない。これは自然言語処理全般に必要なことであり、日本語や英語に限った話ではない。

 複数文書間の名前解決 
実際には、名前解決は複数文書間に適用されることが多い。例えば、長期間にわたる新聞記事を見てみると、「ジョージ・ブッシュ」という人名は第41代アメリカ大統領のジョージ・H・W・ブッシュを意味する場合と、第43代大統領のジョージ・W・ブッシュを意味する場合がある。このような同姓同名の人は無数にいるため、ある文章に出てくる人名が特定の「この人」だということを確定するには、人名以外の情報を必要とする。

実際には、明確に特定できるだけの情報がないことが多く、このような名前解決は（特にソフトウェアにとっては）非常に困難な問題である。文脈上の特定の手掛かりを利用する手法がいくつもあるが、万能の解決策は知られていない。

 関連項目 
 名前空間
 スコープ (プログラミング)
 固有表現抽出

Category:ライブラリ (プログラミング)
Category:コンパイラ