コンピュータサイエンスにおいて、メタオブジェクトとは、オブジェクト(自身を含む)を操作、作成、記述、または実装するオブジェクトのことです。メタオブジェクトが関係するオブジェクトは、ベースオブジェクトと呼ばれます。メタオブジェクトが定義する情報には、ベースオブジェクトの型、インターフェース、クラス、メソッド、属性、構文解析ツリーなどが含まれます。メタオブジェクトは、システムが(通常は実行時に)自身の内部構造にアクセスできるという、コンピュータサイエンスの概念であるリフレクションの例です。リフレクションにより、システムは実行時に自身の実装を変更し、実質的にその場で自身を書き換えることができます。[ 1 ]
メタオブジェクトプロトコル(MOP )は、オブジェクトのシステムの構造と動作にアクセスして操作するための語彙(プロトコル)を提供します。メタオブジェクトプロトコルの典型的な機能には、次のものがあります。 [ 2 ]
メタオブジェクトプロトコルは、ソフトウェアオブジェクトシステムは拡張に対してはオープンであるべきだが、変更に対してはクローズドであるべきだとするベルトラン・メイヤーのオープン/クローズド原則に反する。この原則は、オブジェクトに要素を追加することによる拡張と、オブジェクトを再定義することによる変更を効果的に区別し、前者は望ましい性質(「オブジェクトは将来のユースケースの要件を満たすために拡張可能であるべき」)であるのに対し、後者は望ましくない性質(「オブジェクトは、一括改訂の対象とならない安定したインターフェースを提供するべき」)であると提唱している。これに対し、メタオブジェクトプロトコルは、オブジェクトの内部構成とオブジェクトシステム全体を、システム自体の観点から透過的に公開する。実際には、これはプログラマがオブジェクトを使用して、場合によっては非常に複雑な方法で、オブジェクト自身を再定義できることを意味する。
さらに、メタオブジェクトプロトコルは単に「基盤となる」実装へのインターフェースではなく、メタオブジェクトプロトコルを通して、オブジェクトシステムはメタオブジェクトシステムの観点から再帰的に実装され、そのメタオブジェクトシステム自体も理論的にはメタメタオブジェクトシステムの観点から実装され、任意の基本ケース(オブジェクトシステムの一貫した状態)が決定されるまでこのプロセスが繰り返されます。そして、プロトコル自体は、これらの実装レベル間の再帰的な機能関係を表しています。
オブジェクトシステムをこのように実装すると、根本的な裁量による再設計が可能になり、深い柔軟性がもたらされる一方で、複雑で理解しにくいメタ安定性の問題が生じる可能性があります(たとえば、オブジェクトシステムは自身のメタオブジェクトプロトコル(内部の自己表現)を破壊的に更新してはなりませんが、一部の更新の潜在的な破壊性は予測が難しく、推論も困難になる可能性があります)。これは、望ましい変更が伝播される再帰的な深さによって異なります。[ 3 ]このため、メタオブジェクトプロトコルは、言語に存在する場合、通常は控えめに使用され、リバースエンジニアリングなど、他のソフトウェアや自身を高度な方法で変換するソフトウェアなどの特殊な目的に使用されます。[ 4 ]
実行時にコンパイルが利用できない場合、メタオブジェクト プロトコルの実装にはさらに複雑な問題が生じます。たとえば、このようなプロトコルで型階層を変更することは可能ですが、そうすると、別のクラス モデル定義でコンパイルされたコードに問題が発生する可能性があります。一部の環境では、コンパイル時にメタオブジェクトの問題を処理することによって、この問題に対する革新的な解決策が見つかっています。その良い例がOpenC++です。[ 5 ] セマンティックWebオブジェクト指向モデルは、ほとんどの標準オブジェクト システムよりも動的であり、実行時メタオブジェクト プロトコルと整合性があります。たとえば、セマンティック Web モデルでは、クラスは互いの関係を変更することが想定されており、進化するクラス モデルを検証および分析できる分類器と呼ばれる特別な推論エンジンがあります。 [ 6 ]
最初のメタオブジェクトプロトコルは、ゼロックスPARCで開発されたオブジェクト指向プログラミング言語Smalltalkにありました。Common Lisp Object System (CLOS)は後に登場し、Smalltalkプロトコルと、評価器の無限の塔としての3-Lispに関するBrian C. Smithのオリジナルの研究の影響を受けています。 [ 7 ] CLOSモデルは、Smalltalkモデルとは異なり、クラスが複数のスーパークラスを持つことを許可します。これにより、オブジェクトインスタンス上のクラス階層の系統の解決などの問題で複雑さが増します。CLOSはまた、動的なマルチメソッドディスパッチを許可し、これはSmalltalkのシングルディスパッチのようにメッセージパッシングではなく、ジェネリック関数を介して処理されます。[ 8 ] Common Lispのメタオブジェクトプロトコルのセマンティクスと実装を記述した最も影響力のある書籍は、Gregor KiczalesらによるThe Art of the Metaobject Protocolです。[ 9 ]
メタオブジェクトプロトコルは、ソフトウェアエンジニアリングアプリケーションでも広く使用されています。事実上すべての商用CASE、リエンジニアリング、および統合開発環境には、設計成果物を表現および操作するための何らかのメタオブジェクトプロトコルがあります。[ 10 ] [ 11 ] [ 12 ]
メタオブジェクトプロトコルは、アスペクト指向プログラミングを実装する一つの方法です。グレゴール・キザレスをはじめとするMOPの初期の創始者の多くは、その後、アスペクト指向プログラミングの主要な提唱者となりました。PARCのキザレスらは、ネイティブのメタオブジェクトプロトコルを持たないJava言語向けにAspectJを設計するために雇われました。