La métaprogrammation fait référence à une variété de façons dont un programme se connaît ou peut se manipuler.
Dans des langages comme C #, la réflexion est une forme de métaprogrammation puisque le programme peut examiner des informations sur lui-même. Par exemple, renvoyer une liste de toutes les propriétés d'un objet.
Dans des langages comme ActionScript, vous pouvez évaluer les fonctions au moment de l'exécution pour créer de nouveaux programmes tels que eval ("x" + i). DoSomething () affecterait un objet appelé x1 lorsque i est 1 et x2 lorsque i est 2.
Enfin, une autre forme courante de métaprogrammation est lorsque le programme peut se changer de manière non triviale. LISP est bien connu pour cela et c'est quelque chose que Paul Graham a défendu il y a une dizaine d'années. Je vais devoir consulter certains de ses essais spécifiques. Mais l'idée est que le programme changerait une autre partie du programme en fonction de son état. Cela permet un niveau de flexibilité pour prendre des décisions au moment de l'exécution qui est très difficile dans la plupart des langues courantes aujourd'hui.
Il est également intéressant de noter qu'au bon vieux temps de la programmation en assemblage direct, les programmes qui se modifiaient au moment de l'exécution étaient nécessaires et très courants.
Extrait de l'essai de Paul Graham "What Made Lisp Different" :
De nombreuses langues ont quelque chose appelé une macro. Mais les macros Lisp sont uniques. Et croyez-le ou non, ce qu'ils font est lié aux parenthèses. Les concepteurs de Lisp n'ont pas mis toutes ces parenthèses dans le langage juste pour être différent. Pour le programmeur Blub, le code Lisp semble bizarre. Mais ces parenthèses sont là pour une raison. Ils sont la preuve extérieure d'une différence fondamentale entre Lisp et d'autres langages.
Le code Lisp est constitué d'objets de données Lisp. Et pas dans le sens trivial du fait que les fichiers source contiennent des caractères et que les chaînes sont l'un des types de données pris en charge par le langage. Le code Lisp, après avoir été lu par l'analyseur, est constitué de structures de données que vous pouvez parcourir.
Si vous comprenez comment les compilateurs fonctionnent, ce qui se passe réellement n'est pas tant que Lisp a une syntaxe étrange que Lisp n'a pas de syntaxe. Vous écrivez des programmes dans les arborescences d'analyse qui sont générés dans le compilateur lorsque d'autres langages sont analysés. Mais ces arbres d'analyse sont entièrement accessibles à vos programmes. Vous pouvez écrire des programmes qui les manipulent. En Lisp, ces programmes sont appelés macros. Ce sont des programmes qui écrivent des programmes.
Des programmes qui écrivent des programmes? Quand voudriez-vous faire ça? Pas très souvent, si vous pensez en Cobol. Tout le temps, si vous pensez en Lisp. Ce serait pratique ici si je pouvais donner un exemple de macro puissante, et dire là! et ça? Mais si je le faisais, cela ressemblerait à du charabia pour quelqu'un qui ne connaissait pas Lisp; il n'y a pas de place ici pour expliquer tout ce que vous devez savoir pour comprendre ce que cela signifie. Dans Ansi Common Lisp, j'ai essayé de faire avancer les choses aussi vite que possible, et même ainsi je ne suis pas arrivé aux macros avant la page 160.
Mais je pense que je peux donner une sorte d'argument qui pourrait être convaincant. Le code source de l'éditeur Viaweb était probablement composé d'environ 20 à 25% de macros. Les macros sont plus difficiles à écrire que les fonctions Lisp ordinaires, et il est considéré comme un mauvais style de les utiliser lorsqu'elles ne sont pas nécessaires. Donc, chaque macro de ce code est là parce qu'elle doit l'être. Cela signifie qu'au moins 20 à 25% du code de ce programme fait des choses que vous ne pouvez pas faire facilement dans une autre langue. Aussi sceptique que puisse être le programmeur de Blub à propos de mes prétentions sur les pouvoirs mystérieux de Lisp, cela devrait le rendre curieux. Nous n'écrivions pas ce code pour notre propre amusement. Nous étions une toute petite startup, programmant aussi dur que possible afin de mettre des barrières techniques entre nous et nos concurrents.
Une personne suspecte pourrait commencer à se demander s'il y avait une corrélation ici. Une grande partie de notre code faisait des choses qui sont très difficiles à faire dans d'autres langues. Le logiciel résultant a fait des choses que les logiciels de nos concurrents ne pouvaient pas faire. Peut-être qu'il y avait une sorte de connexion. Je vous encourage à suivre ce fil. Il y a peut-être plus à ce vieil homme qui boitille sur ses béquilles qu'il n'y paraît.