識別子

識別子（しきべつし、）とは、ある実体の集合の中で、特定の元を他の元から曖昧さ無く区別することを可能とする、その実体に関連する属性の集合のことISO/IEC 25760-1:2011 3.1.1~3.1.4をいう。ほぼすべての情報処理システムで何らかの識別子が使われており、識別子を利用することで機械的な処理が可能になる。

識別子の例
バーコード

氏名
メールアドレス
HTTP cookie
 Uniform Resource Identifier (URI)
 UUID/GUID
匿名識別子

オペレーティングシステムにおける識別子
ユーザー識別子/UID
プロセス識別子/PID
セキュリティ識別子

ネットワークにおける識別子
デジタルオブジェクト識別子/DOI
サービスセット識別子/SSID
IPアドレス
MACアドレス

プログラミング言語における識別子
プログラミング言語においては変数、サブルーチン（関数、プロシージャ、メソッドとも）、データ型などを識別する、プログラム中のトークンとして表される。それぞれ変数名、ルーチン名（関数名、プロシージャ名、メソッド名）、型名のように呼ばれることもある。

一般的に識別子はスコープ内で複数の意味を持ってはならない。また曖昧さが許されないので、文法上定まった形式に沿った名前でなければならない。ただしJavaのように、たとえスコープ内で異なる構文要素（変数やメソッドなど）が同一の名前で定義されていても、文脈によって区別ができる言語もある。詳しくは名前空間の記事も参照のこと。

言語によって識別子に使える名前の規則は違うが、通例ASCIIの英数字と '_' (アンダーバーもしくはアンダースコア) などの一部の記号から構成され、トークンの区切りとして使われることの多い空白（スペース）や、減算の演算子として使われることの多いハイフンマイナス '-' を含めることができない言語が多い。またレキシカルアナライザが容易に数値リテラルと判別できるように、先頭にだけは数字を使えない言語が多い。大文字/小文字を区別しない言語もある。Unicodeをサポートする言語では、ソースコードをUnicodeでエンコードすることにより、ASCII英数字に限らず日本語文字のようなUnicode文字が使える場合もあるが、C#ではサロゲートペアを識別子に使えない一方で、Swiftでは絵文字などのサロゲートペアを識別子として使えるなど、言語によってUnicodeの中でも使える範囲が異なる場合がある。

また、多くの言語で識別子として使うことができないキーワードあるいは予約語が設定されている。C#のget/setなどのように、通常は識別子として使用できるものの、出現場所によっては識別子ではなくキーワードとして扱われるようになる「文脈依存キーワード」が規定されている言語も多い。

FORTRAN、Perlなどの様に変数名によって変数の中身となる値の型が定まる場合もある（正確には、FORTRANの仕様は、決められたいくつかのアルファベットで始まる名前の変数はデフォルトで整数型などで定義されているものと自動的にみなされる、というものである。Perlの仕様は、識別子自体ではなく、識別子に付ける $ や @ や # や & というプレフィックスと文脈により、その識別子の扱い方が変わる、というものである）。

言語間の問題
異なる言語間でオブジェクトシンボルが共有できる場合など、識別子に関連した問題が発生することがある。

C#やC++/CLIでは大文字/小文字が区別されるので、同じ名前空間内に大文字/小文字の差異しかない識別子を持つ複数の型を定義したり、同じ型内に大文字/小文字の差異しかない識別子を持つ複数のメソッドやプロパティを定義したりすることができる。しかし、これらを公開 (public/protected) シンボルとして含むアセンブリ（ライブラリ）を作成し、そのアセンブリを、大文字/小文字を区別しないVB.NETで使おうとすると、同じ名前の識別子が複数存在する（競合）と判断されてコンパイルエラーになる。

また、共通中間言語では文法上の曖昧さが生じないため、記号や空白が含まれる識別子が許容されており、F#などでは記号や空白を含む識別子を使う手段が提供される。しかし、C#など非対応の言語からはその識別子を扱うことはできず、リフレクションなどの手段を使わない限り参照することができない。

この問題を回避するためにライブラリ (API) などは共通言語仕様 (CLS) に従うべきとされているCapitalization Conventions | Microsoft DocsVisual Basic Naming Conventions | Microsoft Docs。

また、JavaScriptやJSONでは$（ドルマーク）が識別子として使える。
$が識別子として利用できない言語からJSONを利用する場合、通常はdata.hogeのようにアクセスできる言語でもdata["hoge$piyo"]のように文字列として処理するなど、回避策をとる必要が出る。

 形式 
識別子はしばしば構造を持つ。例えば郵便地域を識別する郵便番号は階層構造（上位の3桁あるいは5桁が広域、残りが区域内区分）をもつ。区切り文字などを用いた形式により識別子に構造が導入される。

典型的な区切り文字としてはピリオド（IPv4: 4階層 - 196.0.0.1）やコロン（IPv6: 6階層 - 2001:0db8:0000:0000:0000:0000:0000:9abc）、スラッシュ（パス: 任意階層 - root/home/app）などがある。構造が固定長の場合、省略記法が定義される場合もある（IPv6: 0の連続を省略 - 2001:0db8::9abc, ARN:存在しない階層を省略 - arn:aws:iam::123:role/roleA）。

 脚注 
 注釈 

 出典 

関連項目
命名規則 (プログラミング)
ハンガリアン記法
キャメルケース
名前空間
多重定義
変数 (プログラミング)

*
Category:名前
Category:プログラミング言語の概念