Métaprogrammation - Définition et Explications

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs est disponible ici.

La métaprogrammation est, par analogie avec les métadonnées et les métaclasses, la programmation de métaprogrammes. Elle est l'écriture de programmes qui manipulent des données décrivant des programmes (autres ou eux-mêmes).

Elle peut être employée pour générer du code interprété par un compilateur et donner un résultat constant, afin d'éviter un calcul manuel. Il permet également de réduire le temps (Le temps est un concept développé par l'être humain pour appréhender le changement dans le monde.) d'exécution du programme si le résultat constant avait été classiquement calculé par le programme comme pour les résultats variables.

Cette méthode ne s'applique pas uniquement aux calculs mais aussi au remplissage de données constantes telles que des tableaux ou des structures plus complexes. Cependant cette technique ne fonctionne que pour des valeurs constantes. En effet, si une donnée (Dans les technologies de l'information (TI), une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction d'affaire, d'un événement, etc.) manipulée par le métaprogramme est une entrée du programme (comme par exemple, ici le nombre (La notion de nombre en linguistique est traitée à l’article « Nombre grammatical ».) n donné par l'utilisateur), elle ne peut pas être connue avant l'exécution du programme. Il est donc impossible qu'un tel métaprogramme soit interprété par un compilateur. L'optimisation par métaprogrammation (La métaprogrammation est, par analogie avec les métadonnées et les métaclasses, la programmation de métaprogrammes. Elle est l'écriture de programmes qui manipulent des...) est alors totalement perdu.

La métaprogrammation ne se limite pas seulement à l'écriture de données contenant un programme destiné au compilateur. Elle peut simplement être la manipulation d'un programme en fonction d'entrées variables. Par exemple, un programme peut, selon ses entrées, muter le code d'un métaprogramme. Ce métaprogramme peut alors être destiné à une exécution ultérieure ou une génération de code.

Processus

Il existe différentes façons de procéder :

  • l'utilisation de générateurs de code,
  • la programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent l'écriture des programmes informatiques. C'est une étape...) avec des templates, ou modèles (dans C++ ou Common Lisp),
  • l'utilisation d'un protocole à méta-objets (Un protocole à méta-objets 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...) (en: MOP) comme le MOP de CLOS ou Smalltalk,
  • l'utilisation de macros.

Les deux premières techniques sont disponibles pour les langages à typage statique (Le mot statique peut désigner ou qualifier ce qui est relatif à l'absence de mouvement. Il peut être employé comme :). Il s'agit d'une forme puissante mais limitée de méta-programmation (La métaprogrammation est, par analogie avec les métadonnées et les métaclasses, la programmation de métaprogrammes. Elle est l'écriture de programmes qui manipulent des données décrivant des programmes (autres ou...). Le principe du générateur de code revient en effet à construire un compilateur comprenant la sémantique d'un langage donné, avec des ajouts. Cette approche n'est donc pas facilement portable. La programmation à base de templates permet de construire des opérateurs pour des types de données complètement (Le complètement ou complètement automatique, ou encore par anglicisme complétion ou autocomplétion, est une fonctionnalité informatique permettant à...) hétérogènes - c'est utile en C++. Les templates de Common Lisp (Common Lisp est un langage fonctionnel impur de la famille Lisp.) sont plus généraux. Ces deux techniques ne concernent que la phase (Le mot phase peut avoir plusieurs significations, il employé dans plusieurs domaines et principalement en physique :) de compilation. Certains langages académiques (comme MetaOcaml par exemple) fournissent un typage qui garantit que les programmes générés par le méta-programme sont correctement typés.

Les langages à typage dynamique (Le mot dynamique est souvent employé désigner ou qualifier ce qui est relatif au mouvement. Il peut être employé comme :) et donc réflexifs offrent des moyens d'introspection et de modification en cours d'exécution, non seulement des valeurs et objets du domaine d'une application mais du comportement du système (entendre comme le langage + ses bibliothèques standards). Les protocoles à méta-objets permettent de spécifier le comportement au niveau des classes elles-mêmes (on y considère les classes, les méthodes, comme des objets d'un domaine particulier).

Un système de macro-définition (En programmation informatique, une macro-définition ou simplement macro est l'association d'un texte de remplacement à un identificateur, tel que l'identificateur est remplacé par le...) (ou macros) permet de réaliser des transformations de source à source : on peut ainsi ajouter des opérateurs nouveau à un langage sans altérer sa spécification ni modifier le compilateur (contrairement au principe des générateurs de code). Seuls les langages représentés avec des s-expressions offrent un système de macros satisfaisant et utilisable, du fait de la convergence (Le terme de convergence est utilisé dans de nombreux domaines :) entre la syntaxe abstraite des programmes et leur syntaxe concrète (La concrète est une pâte plus ou moins dure obtenue après extraction d’une matière première fraîche d’origine végétale (fleurs, feuille) par solvants volatils (non aqueux)....).

Certains systèmes experts explicitent ou dirigent le fonctionnement de leur moteur (Un moteur (du latin mōtor : « celui qui remue ») est un dispositif qui déplace de la matière en apportant de la puissance. Il effectue ce travail à partir d'une...) d'inférence par des méta-règles ou méta-connaissances qui peuvent être considérés comme des méta-programmes.

Exemple

Par exemple, pour effectuer le calcul d'une somme finie des nombres entiers inférieurs à 10 (ou toute autre valeur constante), il faut faire le calcul 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10, on peut :

  • créer une fonction qui calcule la somme de i allant de 1 à n, puis donner n = 10 en paramètre (Un paramètre est au sens large un élément d'information à prendre en compte pour prendre une décision ou pour effectuer un calcul.).
  • calculer à la main (La main est l’organe préhensile effecteur situé à l’extrémité de l’avant-bras et relié à ce dernier par le poignet....) pour utiliser directement le résultat: 55
  • faire un métaprogramme qui calculera la somme lors de la compilation

Dans le premier cas, on crée une fonction qui permettra au programme de faire le calcul. Cette technique peut paraître inutile et faire perdre du temps à l'exécution du programme car tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou l'univers.) est constant. Le programme serait plus optimisé si le calcul était déjà fait avant son exécution.

Dans le deuxième cas, on calcule soi-même la valeur et on la met dans le code source (Le code source (ou les sources voire le source) est un ensemble d'instructions écrites dans un langage de programmation informatique de haut niveau, compréhensible par un...) du programme. Ceci pose deux inconvénients :

  • Le calcul peut être faux. Ceci causerait ainsi des erreurs dans les résultats fournis par le programme. De plus, il est difficile de déboguer et retrouver l'origine du problème.
  • Le calcul peut être long et fastidieux. En effet, sur l'exemple, seulement 10 valeurs sont calculées, mais une plus grande somme prendrait beaucoup plus de temps. Même si, sur cet exemple, on peut démontrer que \sum_{k=1}^n k = \frac{n(n+1)}{2} (suite arithmétique), il n'existe pas toujours une formule mathématique simplificatrice, ou alors on n'en connait pas.

Dans le troisième cas, le calcul est effectué en programmant un programme destiné au compilateur. Celui-ci exécute ce métaprogramme pour le transformer en donnée (Dans les technologies de l'information, une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction,...) constante. C'est la méthode la plus optimisée pour les calculateurs humains et informatiques, car le métaprogramme n'est qu'une donnée qui, dans ce cas, est évaluée sans exécuter le programme final.

Cet article vous a plus ? Partagez-le sur les réseaux sociaux avec vos amis !
Page générée en 0.041 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique