第一級オブジェクト

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

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

この言葉は1960年代にChristopher Stracheyによって「functions as first-class citizens」という文脈で初めて使われた。

言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。

  • 無名のリテラルとして表現可能である。
  • 変数に格納可能である。
  • データ構造に格納可能である。
  • それ自体が独自に存在できる(名前とは独立している)。
  • 他のものとの等値性の比較が可能である。
  • プロシージャ関数のパラメータとして渡すことができる。
  • プロシージャや関数の戻り値として返すことができる。
  • 実行時に構築可能である。
  • 表示可能である。
  • 読み込むことができる。
  • 分散したプロセス間で転送することができる。
  • 実行中のプロセスの外に保存することができる。

例えばCC++では、数値データや配列、構造体などと異なり、関数を実行時に作成することはできない。したがってCにおける関数は第一級オブジェクトではないといえる。ただし関数ポインタを使用することで上の性質の多くを満たすことができるため、第二級オブジェクトという場合もある。同様に、FORTRAN 66における文字列は変数に格納することができないため、第一級オブジェクトではない。

Smalltalkにおいては、関数(メソッド)はクラスと同じように第一級オブジェクトである。演算子(+-)もSmalltalkにおいてはメソッドなので、やはり第一級オブジェクトである。しかしながら、新しい演算子は定義できても優先順位を変更できないなどの理由から、それらは第一級オブジェクトではないとする者もいる。

ほぼすべての言語において、整数浮動小数点数などの最も単純なデータ型は第一級オブジェクトである。古い言語においては配列は第一級オブジェクトではなかった。それらはオブジェクトとして代入することはできず、その要素のみを直接処理することしかできなかった。

関連項目[編集]