第一級オブジェクト

第一級オブジェクト（ファーストクラスオブジェクト、）は、あるプログラミング言語において、たとえば生成、代入、演算、（引数・戻り値としての）受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクトを意味しない。第一級オブジェクトは「第一級データ型に属す」という。

この言葉は1960年代にクリストファー・ストレイチーによって「」という文脈で初めて使われた。

言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。
無名のリテラルとして表現可能である。
変数に格納可能である。
データ構造に格納可能である。
それ自体が独自に存在できる（名前とは独立している）。
他のものとの等値性の比較が可能である。
プロシージャや関数のパラメータとして渡すことができる。
プロシージャや関数の戻り値として返すことができる。
実行時に構築可能である。
表示可能である。
読み込むことができる。
分散したプロセス間で転送することができる。
実行中のプロセスの外に保存することができる。
例えば、C言語やC++では、数値データや構造体は代入で使用でき、関数に渡すこともできる。しかし同じC/C++でも、配列（言語組み込みの固定長配列）は、代入することも関数に渡すこともできない。また、関数から返すこともできない。配列そのものではなく、ポインタもしくは参照を使って関数の引数や戻り値とすることしかできない。配列の各要素についてはできるが、配列全体をひとつとして扱うことはできない。そのため、C/C++の配列は、第一級オブジェクトではない。また、C/C++での関数は実行時に作成することができない。したがってC/C++では関数も第一級オブジェクトではない。ただし、関数ポインタを使用することで上の性質の多くを満たすことができるため、C/C++の関数を第二級オブジェクトという場合がある。FORTRAN 66における文字列は変数に格納することができないため、第一級オブジェクトではない。

Smalltalkでは、無名関数（ブロック）については他言語同様として、関数（メソッド）もクラスと同じように第一級オブジェクトである（CompiledMethodクラスのインスタンス。実体はバイトコード列でクラスのメソッド辞書に値として格納されている）。演算子（+、-）もSmalltalkではメソッドで実現されているため、他の通常のメソッド同様やはり第一級オブジェクトである。

ほぼすべての言語において、整数や浮動小数点数などの最も単純なデータ型は第一級オブジェクトである。古い言語(例えば上述のC/C++)においては配列は第一級オブジェクトではなかった。それらはオブジェクトとして例えば直接代入することはできず、その要素のみを個別に扱うことしかできなかった。

関連項目
第一級関数
オブジェクト (プログラミング)

プログラミング言語デザイン
プログラミング言語の構文
オブジェクト (計算機科学)