Введение

Объект, который манипулирует, создает, описывает и реализует другие объекты. В информатике метаобъект — это объект, который манипулирует, создает, описывает или реализует объекты (включая сам себя). Объект, к которому относится метаобъект, называется базовым объектом. Информация, которую метаобъект может определять, включает тип базового объекта, интерфейс, класс, методы, атрибуты, синтаксическое дерево и т. д. Метаобъекты являются примерами концепции рефлексии в информатике, где система имеет доступ (обычно во время выполнения) к своей внутренней структуре. Рефлексия позволяет системе по существу переписывать себя в процессе работы, изменяя собственную реализацию по ходу выполнения.

Время выполнения и время компиляции

Когда компиляция недоступна во время выполнения, возникают дополнительные сложности в реализации протокола метаобъектов. Например, с помощью такого протокола можно изменять иерархию типов, но это может привести к проблемам в коде, скомпилированном с использованием альтернативного определения модели классов. Некоторые среды нашли инновационные решения, например, обрабатывая вопросы, связанные с метаобъектами, на этапе компиляции. Хорошим примером является OpenC++. Объектно-ориентированная модель Semantic Web более динамична, чем большинство стандартных объектных систем, и совместима с протоколами метаобъектов во время выполнения. Например, в модели Semantic Web ожидается, что классы будут изменять свои взаимосвязи, и существует специальный механизм логического вывода, известный как классификатор, который может проверять и анализировать изменяющиеся модели классов.

Использование

Первый протокол метаобъектов был разработан в объектно-ориентированном языке программирования Smalltalk, созданном в Xerox PARC. Common Lisp Object System (CLOS) появилась позже и находилась под влиянием протокола Smalltalk, а также первоначальных исследований Брайана Смита о 3 Lisp как бесконечной башне вычислителей. Модель CLOS, в отличие от модели Smalltalk, позволяет классу иметь более одного суперкласса; это усложняет решение вопросов, связанных с определением родословной иерархии классов для конкретного объекта. CLOS также поддерживает динамическую мультиметодную диспетчеризацию, которая реализуется через обобщенные функции, а не посредством передачи сообщений, как в однонаправленной диспетчеризации Smalltalk. Наиболее влиятельной книгой, описывающей семантику и реализацию протокола метаобъектов в Common Lisp, является "Искусство протокола метаобъектов" Грегора Кицалеса и др. Протоколы метаобъектов также широко используются в приложениях разработки программного обеспечения. Практически во всех коммерческих CASE-системах, средствах реинжиниринга и интегрированных средах разработки существует та или иная форма протокола метаобъектов для представления и манипулирования артефактами проектирования. Метаобъектный протокол – один из способов реализации аспекто-ориентированного программирования. Многие из первых разработчиков MOP, включая Грегора Кицалеса, впоследствии стали основными сторонниками аспекто-ориентированного программирования. Кицалес и др. из PARC были наняты для разработки AspectJ для Java, языка, который не обладает встроенным протоколом метаобъектов.