コンテンツにスキップ

「プロトタイプベース」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
G000001 (会話 | 投稿記録)
m 少なくともCLOS(Common Lisp)とDylanはプロトタイプ指向ではありませんので、一覧から削除しました。
3行目: 3行目:
{{プログラミング・パラダイム}}
{{プログラミング・パラダイム}}


'''プロトタイプベース''' ({{lang-en-short|''prototype-based''}}) は、[[オブジェクト指向プログラミング]]のスタイルのひとつであり、{{仮リンク|メタオブジェクト|en|Metaobject|label=}}の仕組みを中心にした手法を指す。インスタンスベース(''instance-based'')とも呼ばれる。プロトタイプベースは1990年代前半から認知されるようになった後発のスタイルであり、先発の[[クラスベース]]のオブジェクト指向とは明確に区別されている。「[[Smalltalk]]」「[[Objective-C]]」「[[CLOS]]」「[[Self]]」「[[Oz (プログラミング言語)|Oz]]」「[[Lua]]」「[[Dylan]]」「[[Python]]」「[[JavaScript]]」「[[Ruby]]」「[[Io (プログラミング言語)|Io]]」「[[REBOL]]」「[[Julia (プログラミング言語)|Julia]]」といった[[スクリプト言語]]や[[Webプログラミング|Webプログラミング言語]]を中心に支持されている。
'''プロトタイプベース''' ({{lang-en-short|''prototype-based''}}) は、[[オブジェクト指向プログラミング]]のスタイルのひとつであり、{{仮リンク|メタオブジェクト|en|Metaobject|label=}}の仕組みを中心にした手法を指す。インスタンスベース(''instance-based'')とも呼ばれる。プロトタイプベースは1990年代前半から認知されるようになった後発のスタイルであり、先発の[[クラスベース]]のオブジェクト指向とは明確に区別されている。「[[Smalltalk]]」「[[Objective-C]]」「[[Self]]」「[[Oz (プログラミング言語)|Oz]]」「[[Lua]]」「[[Python]]」「[[JavaScript]]」「[[Ruby]]」「[[Io (プログラミング言語)|Io]]」「[[REBOL]]」「[[Julia (プログラミング言語)|Julia]]」といった[[スクリプト言語]]や[[Webプログラミング|Webプログラミング言語]]を中心に支持されている。


メタオブジェクト(''metaobject'')は「[[LISP]]」由来のプログラム概念であり、実装的には[[変数 (プログラミング)|変数]]と[[関数 (プログラミング)|関数]]双方の[[識別子|識別名]]と[[参照 (情報工学)|参照値]]をペア定義できる可変サイズの[[構造体|データ構造体]]であることが多い。[[委譲]]先となる別のメタオブジェクトの識別名と参照値もペア定義できる。メタオブジェクトはフレーム&スロット(''frame&slot'')の機構名で読み替えられてもいる。プログラミング言語仕様上ではプロトタイプ(''prototype'')の機能名で実装されていることが多い。クラスの機能名で実装している言語もあるのでこの場合は誤解を招きやすくなっている。プロトタイプを複製して[[インスタンス]]が生成される。インスタンスはオブジェクトとも呼ばれる。プロトタイプは動的にカスタマイズできる「[[型システム|型]]」と見なせるものであり、その型を複製=量化したインスタンスは自由に加工/計算/代入できる「[[値 (情報工学)|値]]」になる。
メタオブジェクト(''metaobject'')は「[[LISP]]」由来のプログラム概念であり、実装的には[[変数 (プログラミング)|変数]]と[[関数 (プログラミング)|関数]]双方の[[識別子|識別名]]と[[参照 (情報工学)|参照値]]をペア定義できる可変サイズの[[構造体|データ構造体]]であることが多い。[[委譲]]先となる別のメタオブジェクトの識別名と参照値もペア定義できる。メタオブジェクトはフレーム&スロット(''frame&slot'')の機構名で読み替えられてもいる。プログラミング言語仕様上ではプロトタイプ(''prototype'')の機能名で実装されていることが多い。クラスの機能名で実装している言語もあるのでこの場合は誤解を招きやすくなっている。プロトタイプを複製して[[インスタンス]]が生成される。インスタンスはオブジェクトとも呼ばれる。プロトタイプは動的にカスタマイズできる「[[型システム|型]]」と見なせるものであり、その型を複製=量化したインスタンスは自由に加工/計算/代入できる「[[値 (情報工学)|値]]」になる。

2021年1月18日 (月) 12:09時点における版

プロトタイプベース (: prototype-based) は、オブジェクト指向プログラミングのスタイルのひとつであり、メタオブジェクト英語版の仕組みを中心にした手法を指す。インスタンスベース(instance-based)とも呼ばれる。プロトタイプベースは1990年代前半から認知されるようになった後発のスタイルであり、先発のクラスベースのオブジェクト指向とは明確に区別されている。「Smalltalk」「Objective-C」「Self」「Oz」「Lua」「Python」「JavaScript」「Ruby」「Io」「REBOL」「Julia」といったスクリプト言語Webプログラミング言語を中心に支持されている。

メタオブジェクト(metaobject)は「LISP」由来のプログラム概念であり、実装的には変数関数双方の識別名参照値をペア定義できる可変サイズのデータ構造体であることが多い。委譲先となる別のメタオブジェクトの識別名と参照値もペア定義できる。メタオブジェクトはフレーム&スロット(frame&slot)の機構名で読み替えられてもいる。プログラミング言語仕様上ではプロトタイプ(prototype)の機能名で実装されていることが多い。クラスの機能名で実装している言語もあるのでこの場合は誤解を招きやすくなっている。プロトタイプを複製してインスタンスが生成される。インスタンスはオブジェクトとも呼ばれる。プロトタイプは動的にカスタマイズできる「」と見なせるものであり、その型を複製=量化したインスタンスは自由に加工/計算/代入できる「」になる。

特徴

メタオブジェクト

あなたはプロトタイプを作り、新しいインスタンスを作る。双方のオブジェクトは変幻自在だ。新しいフィールドとメソッドを付け足して拡充できる。その行為はプロトタイプと同等である。類似オブジェクトを作るためのクラスとその継承も必要ない。これ以上のオブジェクト指向があるだろうか? — Douglas Crockford(JavaScript developer)

標準的なメタオブジェクトは「フレーム&スロット」「シンボル」「データ」「コード」の四要素から構成される。この四要素はいずれもオブジェクトである。データは変数値/定数値を指す。コードは引数有り/無し関数式を指す。シンボルはいわゆる識別子であり、データが束縛されたら変数名になり、またコードが束縛されたら関数名になる。フレーム&スロットはシンボル(変数名/関数名)が集約される媒体であり、プロトタイプ/インスタンスを指す。プロトタイプは所有シンボル先の要self変数に値を代入できず、また所有シンボル先の要self関数を呼び出せないオブジェクトである。インスタンスはそれらが可能なオブジェクトである。要self変数/関数はインスタンス変数/関数であり、そうでないものはクラス変数/関数である。インスタンスはプロトタイプを複製する方式で生成される。プロトタイプとインスタンスは共にそのメンバとなる変数と関数を自由に付け足すことができる。上述のメカニズムから変数と関数もオブジェクト(フレーム&スロット)になるので、変数にそのメンバ変数/メンバ関数を持たせることも可能であり、関数ではそのローカル変数/ローカル関数が、メンバ変数/メンバ関数として解釈される。シンボルはオブジェクトを識別するための用途にほぼ限られているが、仕組み上はそれにもメンバを付けることができる。シンボルは上述の四要素とプロトタイプ/インスタンスを分類するためのメタ情報IDとしても使われる。また後述のセレクタ(振る舞い指示子)としても使われる。

フレーム&スロット、変数値、関数式、関数の引数値、関数の返り値は、それぞれがお互いをメンバにできるので、入れ子の連結関係で所有ないし所属し合えるようになっている。変数値にメンバ変数/メンバ関数を付けると、クラスベースOOPインスタンスと同等になる。void関数は専用の書式でクラスベースOOPのインスタンスと同等になり、そのvoid関数内のローカル変数/ローカル関数がメンバ変数/メンバ関数になる。メンバ変数付き関数とメンバ関数付き変数は、関数オブジェクトまたはクロージャと同等なものである。

デリゲーション

オブジェクトのメンバ関係の連鎖メカニズムは、デリゲーション(委譲)によるオブジェクトのコミュニケーションを活性化させる。これにはセレクタ(振る舞い指示子)を用いる言語もあるが、大抵はコールするその関数オブジェクト名またはそのメソッド名が振る舞い指示子と同義になっている。関数オブジェクトが引数とともにコールされてそこで指定処理に対応できない場合は、そのメンバ関数またはメンバ変数のメッセージレシーバーに引数を渡してそちらに委譲する。委譲先でも不可だった場合はそのまた次のメンバにたらい回しもできる。オブジェクトはそのたらい回しの結果返ってきた値を自身の返り値にできる。

ダックタイピング

カプセル化/継承/多態性

関数型的側面

総論

メタオブジェクトを基礎にしたプロトタイプベースは、さながら原生動物のようなプログラミングパラダイムであり、手続き型、関数型、クラスベースOOPといった様々な形態で取り扱うことができる。

来歴

脚注

関連項目