Protocole à métaobjets
# Protocole à métaobjets

Un protocole à métaobjets est une technique en informatique qui consiste à faire de l'interprète d'un programme un objet de première classe, au même titre que ceux qui composent le programme. Il est ainsi possible de le réécrire afin de changer l'interprétation du programme. Cette technique est répandue notamment dans les interprètes des langages à objets, bien qu'elle ne soit pas spécifique à ce paradigme de programmation. Il faut également bien comprendre que même si cet article parle d'interprète, les protocoles à métaobjets ne sont pas spécifiques aux langages de programmation interprétés ou exécutés par une machine virtuelle.

Pour détailler la notion de protocole à métaobjets, prenons l'exemple d'un appel de méthode. Lorsqu'un programmeur écrit par exemple l'expression entier.ajouter(3, 7), il demande implicitement à l'interprète de l'objet entier d'interpréter la méthode ajouter de cet objet avec les paramètres 3 et 7. Appelons entier.interprète l'objet qui encapsule l'interprète de l'objet entier. Écrire entier.ajouter(3, 7) revient à écrire l'appel entier.interprète.appeler("ajouter", (3, 7)), la transformation (la réification de l'appel) étant réalisée automatiquement. C'est là que réside toute l'idée des protocoles à métaobjets : le programmeur a alors la possibilité d'utiliser n'importe quel objet pour l'attribut interprète et ainsi définir sa propre sémantique à l'appel de méthode (dans l'exemple). L'objet interprète est habituellement appelé métaobjet, c'est-à-dire objet qui traite des objets.

Un métaobjet étant un objet comme les autres, il a lui-même un métaobjet associé qui l'interprète, ayant lui-même un métaobjet, et ainsi de suite. Pour éviter que le processus de réification des appels de méthode ne soit infini, un mécanisme est généralement prévu pour permettre aux objets d'exister sans métaobjet associé. Un interprète auto-suffisant par défaut est alors utilisé pour terminer la récursivité.

Un protocole à métaobjets est une spécification de la manière dont objets et métaobjets interagissent. Il précise en particulier la ou les interfaces que les métaobjets doivent satisfaire, et par là même les instructions de l'interprète qui peuvent être redéfinies. Dans l'exemple des langages à objets, sont inclus la plupart du temps l'instanciation et l'appel de méthode, qui sont les deux instructions majeures (sinon les deux seules) du paradigme de la programmation orientée objet.

## Langages de programmation possédant un protocole à métaobjets

* CLOS de Common Lisp
* Smalltalk-80
* la plupart des extensions objets de Scheme (tinyClos, Goop…)
* Perl 6
* Perl 5, via des bibliothèques d'extension de l'objet comme Moose, Mouse ou Moo
* Python
* Ruby
* Java via InvocationHandler
* La programmation orientée aspect
