メインメニューを開く

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

目次

識別子の例編集

プログラミング言語における識別子編集

プログラミング言語においては変数関数、データ型などを識別する、プログラム中のトークンとして表される。それぞれ変数名や関数名、型名のように呼ばれることもある。

識別子はスコープ内で複数の意味を持ってはならない。また曖昧さが許されないので、文法上定まった形式に沿った名前でなければならない。

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

また、多くの言語で識別子として使うことができない予約語が設定されている。

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

言語間の問題編集

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

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

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

この問題を回避するためにライブラリ (API) などは共通言語仕様 (CLS) に従うべきとされている[4][5]

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

参考文献編集

  1. ^ ISO/IEC 25760-1:2011 3.1.1~3.1.4
  2. ^ 言語および処理系によってはASCIIコードでないこともありえる。
  3. ^ 便宜上、「半角英数」と呼ばれることもある。
  4. ^ Capitalization Conventions | Microsoft Docs
  5. ^ Visual Basic Naming Conventions | Microsoft Docs

関連項目編集