特定のプログラミング言語設計において、第一級オブジェクト[a]とは、他のエンティティが一般的に利用できるすべての操作をサポートするエンティティです。これらの操作には通常、引数として渡されること、関数から返されること、変数に割り当てられることが含まれます。[1]
歴史
ファーストクラスオブジェクトとセカンドクラスオブジェクトの概念は、1960年代にクリストファー・ストラチーによって導入されました。 [2] [3]彼はこの用語を厳密に定義したわけではありませんが、 ALGOLにおける実数と手続きを対比しました。
第一クラスと第二クラスのオブジェクト。ALGOLでは、実数は式に現れたり、変数に代入されたりします。また、どちらもプロシージャ呼び出しの実パラメータとして現れます。一方、プロシージャは、演算子 (最も一般的なケース) として、または実パラメータの 1 つとして、別のプロシージャ呼び出しにのみ現れます。プロシージャを含む式や、結果がプロシージャとなる式は他にありません。したがって、ある意味では、ALGOL のプロシージャは第二クラスのオブジェクトです。プロシージャは常に直接現れなければならず、変数や式で表現することはできません (仮パラメータの場合を除く)... [4]
ロビン・ポプルストーンは次のような定義を与えました。「すべてのアイテムには一定の基本的権利がある。」
- すべての項目は関数の実際のパラメータになることができます
- すべての項目は関数の結果として返される可能性があります
- すべての項目は割り当てステートメントの対象になることができます
- すべての項目は同等性についてテストすることができます。[5]
1990年代にラファエル・フィンケル[6]は第2クラスと第3クラスの価値の定義を提案したが、これらの定義は広く採用されなかった。[7] [より良い情報源が必要]
例
整数や浮動小数点数などの 最も単純なスカラーデータ型は、ほぼ常にファーストクラスです。
多くの古い言語では、配列と文字列はファーストクラスではありません。つまり、オブジェクトとして割り当てることも、サブルーチンにパラメータとして渡すこともできません。たとえば、Fortran IVもCも配列の割り当てをサポートしておらず、パラメータとして渡される場合、実際には最初の要素の位置のみが渡され、サイズは失われます。C は配列ポインタの割り当てをサポートしているように見えますが、実際にはこれらは単に配列の最初の要素へのポインタであり、配列のサイズは保持しません。[要出典]
ほとんどの言語では、データ型はファーストクラス オブジェクトではありませんが、一部のオブジェクト指向言語では、クラスはファーストクラス オブジェクトであり、メタクラスのインスタンスです。関数型プログラミングファミリの言語では、たとえば、一般化された代数データ型や、プログラムが独自の実装言語への拡張を実装できるようにするその他のメタ言語機能などの形で、ファーストクラス型が使用されることもよくあります。
継続とGOTOラベルをオブジェクトとしてサポートする言語はほとんどなく、ましてやファーストクラス オブジェクトとしてサポートする言語はほとんどありません。
機能
多くのプログラミング言語は、引数に適用できる関数値の受け渡しと返却をサポートしています。関数値をファーストクラスと呼ぶのにこれが十分かどうかは議論の余地があります。
一部の著者は、実行時に新しい関数を作成できることを「ファーストクラス」と呼ぶことを要求しています。 [要出典]この定義では、C の関数はファーストクラス オブジェクトではありません。代わりに、関数ポインタを介して上記のほとんどの方法で操作できるため、セカンドクラス オブジェクトと呼ばれることがあります。
Smalltalkでは、関数 (メソッド) は Smalltalk クラスと同様にファーストクラス オブジェクトです。Smalltalk 演算子 (+、- など) はメソッドであるため、これもファーストクラス オブジェクトです。
反射
JavaやPHPなどの一部の言語には、明示的なリフレクションサブシステムがあり、通常のオブジェクトと同じようにアクセスしたり操作したりできない場合でも、内部実装構造にアクセスできます。
Lispファミリーなどの他の言語では、リフレクションは特別なサブシステムではなく、言語の中心的な機能です。通常、これは次の機能のセットの形をとります。
- 構文マクロまたはfexpr - コードをデータとして扱い、それを裁量で評価するコードをユーザーが記述できるようにします。これにより、たとえば、プログラムがコンパイラ、インタープリタ、またはパーサー (リーダー マクロ) 内でプログラム (または自分自身を書き換える) を記述できるようになります。
- メタ循環評価器- 言語の評価器の定義をそれ自体のコンパイルされたトートロジーとして提供し、それ自体とは異なるメタ言語を必要とせずに言語の直接的な変更を容易にします。
- メタオブジェクト プロトコル-オブジェクト指向プログラミング用のメタ循環評価器の特殊な形式。オブジェクト システムは、それ自体がクラスとオブジェクトであるメタクラスとメタオブジェクトのシステムを介して再帰的に実装されます。
これらは、言語実装へのさまざまな形式のファーストクラスのアクセスを可能にし、一般的に、通常の言語オブジェクトと同じように操作でき、通常の言語オブジェクトと完全に区別がつきません。このため、ユーザーによるコアプログラミングシステムのテストされていない変更は、言語実装者によるパフォーマンスの最適化を簡単に損なう可能性があるため、その使用には通常、いくつかの (文化的な) 規定とアドバイスが伴います。
参照
注記
- ^ ファーストクラス型、ファーストクラスオブジェクト、ファーストクラスエンティティ、またはファーストクラス値とも呼ばれます。
参考文献
- ^ スコット、マイケル (2006)。プログラミング言語語用論。サンフランシスコ、カリフォルニア州:モルガン・カウフマン出版社。p. 140。ISBN 9780126339512。
- ^ ロッド・バースタル、「クリストファー・ストラチー - プログラミング言語の理解」、高階および記号計算 13 :52 (2000)
- ^ Harold Abelson と Gerald Jay Sussman、「コンピュータプログラムの構造と解釈」、第 2 版、セクション 1.3.4 脚注 64、2015 年 3 月 9 日にWayback Machineにアーカイブ
- ^ Christopher Strachey、「プログラミング言語の基本概念」、Higher-Order and Symbolic Computation 13 :11 (2000)。2000 年に出版されたが、これは Strachey が 1967 年 8 月に行った講義のメモである。
- ^ RJ ポプルストーン: POP-2の設計哲学。D. ミチー著『マシンインテリジェンス 3』、エディンバラ大学出版局、1968 年
- ^ フィンケル、R.高度なプログラミング言語設計、p 73
- ^ Norman Ramsey. 「第一級、第二級、第三級の値について」. stackoverflow.com . 2013年9月14日閲覧。
- ^ ab Paritosh Shroff、Scott F. Smith。マッチ関数によるファーストクラスメッセージの型推論
- ^ Bove, Ana; Dybjer, Peter (2009). 「Dependent Types at Work」(PDF) .言語エンジニアリングと厳密なソフトウェア開発. コンピュータサイエンスの講義ノート。第 5520 巻。pp . 57–99。doi :10.1007 / 978-3-642-03153-3_2。ISBN 978-3-642-03152-6. 2014年4月2日時点のオリジナルよりアーカイブ(PDF) 。2015年6月8日閲覧。 (アーカイブも)
