第一級オブジェクト
第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクトを意味しない。第一級オブジェクトは「第一級データ型に属す」という。
この言葉は1960年代にクリストファー・ストレイチーによって「functions as first-class citizens」という文脈で初めて使われた。
言語によって異なるが、第一級オブジェクトは概ね次のような性質をもつ。
- 無名のリテラルとして表現可能である。
- 変数に格納可能である。
- データ構造に格納可能である。
- それ自体が独自に存在できる(名前とは独立している)。
- 他のものとの等値性の比較が可能である。
- プロシージャや関数のパラメータとして渡すことができる。
- プロシージャや関数の戻り値として返すことができる。
- 実行時に構築可能である。
- 表示可能である。
- 読み込むことができる。
- 分散したプロセス間で転送することができる。
- 実行中のプロセスの外に保存することができる。
例えば、C言語やC++では、数値データや構造体は代入で使用でき、関数に渡すこともできる。しかし同じC/C++でも、配列(言語組み込みの固定長配列)は、配列のデータ型のまま代入することも関数に渡すこともできない。また、関数から返すこともできない。配列そのものではなく、ポインタもしくは参照を用いるか、ないしは配列を構造体に埋め込み、その構造体を関数の引数や戻り値としなければならない。[1] 配列の各要素についてはできるが、配列全体をひとつとして扱うことはできない。そのため、C/C++の配列は、第一級オブジェクトではない。また、C/C++での関数は実行時に作成することができない。したがってC/C++では関数も第一級オブジェクトではない。ただし、関数ポインタを使用することで上の性質の多くを満たすことができるため、C/C++の関数を第二級オブジェクトという場合がある。FORTRAN 66における文字列は変数に格納することができないため、第一級オブジェクトではない。
Smalltalkでは、無名関数(ブロック)については他言語同様として、関数(メソッド)もクラスと同じように第一級オブジェクトである(CompiledMethodクラスのインスタンス。実体はバイトコード列でクラスのメソッド辞書に値として格納されている)。演算子(+、-)もSmalltalkではメソッドで実現されているため、他の通常のメソッド同様やはり第一級オブジェクトである。
ほぼすべての言語において、整数や浮動小数点数などの最も単純なデータ型は第一級オブジェクトである。古い言語(例えば上述のC/C++)においては配列は第一級オブジェクトではなかった。それらはオブジェクトとして例えば直接代入することはできず、その要素のみを個別に扱うことしかできなかった。
関連項目
[編集 ]脚注
[編集 ]- ^ この場合、代入や関数との受け渡しが扱っているデータ型はあくまで構造体であり、配列そのものではない。 "C Program For Create An Array In Structure". Programming With Basics (2016年4月29日). 2023年11月8日閲覧。