Je lisais un article sur TheServerSide sur la programmation ployglot sur la plateforme Java . Certains commentaires dans l'article font référence à la métaprogrammation comme étant la capacité de générer du code (peut-être à la volée).
La métaprogrammation a-t-elle la capacité de générer du code à la volée ou est-ce la capacité d'injecter des méthodes et des attributs dans des objets existants au moment de l'exécution (comme ce que permettent certains langages dynamiques comme Python, Ruby et Groovy).
metaprogramming
Parag
la source
la source
Réponses:
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" :
la source
in order to put technical barriers between us and our competitors
et c'est tamade correct.Excellente question. Je suis vraiment désolé de voir qu'aucune des réponses actuellement ne répond correctement à votre question. Peut-être que je peux aider ...
La définition de la métaprogrammation est vraiment assez simple: cela signifie des programmes qui manipulent des programmes.
Votre réponse acceptée dit des programmes qui se manipulent. Ce sont en effet des métaprogrammes mais ils sont un sous-ensemble de tous les métaprogrammes.
Tout:
sont des métaprogrammes. Donc le compilateur GCC est un métaprogramme, l' interpréteur CPython est un métaprogramme, le système d'algèbre informatique Mathematica est un métaprogramme, le prouveur du théorème Coq est un métaprogramme et ainsi de suite.
D'autres réponses ont affirmé que les métaprogrammes sont des programmes qui génèrent d'autres programmes. Ce sont en effet des métaprogrammes mais, encore une fois, ils sont un sous-ensemble de tous les métaprogrammes. La bibliothèque FFTW (Fastest Fourier Transform in the West ) est un exemple d'un tel métaprogramme. Le code source est écrit principalement en OCaml et génère des bits de code C (appelés codelets) qui sont combinés pour créer des routines de transformation rapide de Fourier hautes performances optimisées pour des machines spécifiques. Cette bibliothèque est en fait utilisée pour fournir les routines FFT dans Matlab. Les gens ont écrit des programmes pour générer des méthodes numériques pendant des décennies, depuis les débuts de FORTRAN .
Le premier langage de programmation intégrant la prise en charge de la métaprogrammation était le langage LISt Processor (LISP) à la fin des années 1950. LISP 1.5 comprenait un certain nombre de fonctionnalités qui facilitaient la métaprogrammation. Premièrement, le type de données principal de LISP est constitué de listes imbriquées, c'est-à-dire d'arbres comme
(a (b c) d)
, ce qui signifie que tout code LISP peut être exprimé nativement sous forme de structure de données. Ceci est connu sous le nom d'homoiconicité. Deuxièmement, le code LISP peut être facilement converti en données à l'aide de QUOTE. Par exemple,(+ 1 2 3)
ajoute 1 + 2 + 3 et(QUOTE (+ 1 2 3))
crée une expression qui ajoute 1 + 2 + 3 lorsqu'elle est évaluée. Troisièmement, LISP a fourni un évaluateur méta-circulaire qui vous permet d'utiliser l'interpréteur ou le compilateur hôte pour évaluer le code LISP au moment de l'exécution, y compris le code LISP généré au moment de l'exécution. Les descendants de LISP incluent Scheme et Clojure. Dans tous ces langages, la métaprogrammation est le plus souvent vue sous la forme de programmes qui se modifient eux-mêmes, généralement à l'aide de macros.Dans les années 1970, Robin Milner a développé un MetaLanguage (ML) qui a évolué pour devenir la famille ML de langages de programmation qui inclut Standard ML et OCaml et a fortement influencé Haskell et F # . Ces langues facilitent l'expression d'autres langues. Dans ces langages, les métaprogrammes sont le plus souvent vus sous la forme de lexers, d'analyseurs, d'interprètes et de compilateurs.
En 1994, Erwin Unruh a découvert que le système de modèles C ++ était Turing complet et pouvait être utilisé pour exécuter des programmes arbitraires au moment de la compilation . La métaprogrammation de modèles C ++ a apporté la métaprogrammation aux masses non lavées qui (ab) l'ont utilisée pour de nombreuses choses différentes, y compris la génération de méthodes numériques dans la bibliothèque Blitz ++ .
la source
Eh bien, la métaprogrammation n'est que de la programmation, mais c'est essentiellement "écrire du code qui écrit du code" .
La capacité que vous mentionnez, lorsqu'un programme peut observer et modifier sa propre structure et son comportement s'appelle réflexion et c'est un type de métaprogrammation.
Les langages typés dynamiquement, ont de puissantes fonctionnalités de réflexion d'exécution, rendues possibles par la nature interprétée de ces langages ...
Les langages typés statiques ont également de puissantes techniques de métaprogrammation, par exemple la métaprogrammation de modèle C ++ ...
la source
Ce n'est que mon opinion personnelle, qui est probablement la définition la plus libérale de la métaprogrammation.
Je pense que cela comprend:
Je pense que vous pouvez y arriver en utilisant l'un de ces éléments et en combinaison:
la source
La métaprogrammation consiste à écrire un programme qui sort un autre programme. C'est quelque chose pour lequel des langages comme Lisp sont vraiment bons. C'est beaucoup plus facile à faire dans un langage qui prend en charge de vraies macros (pas des macros C ++, mais plutôt celles qui peuvent manipuler le code qu'elles produisent) comme Ruby, Lisp, Scheme, etc. que dans un langage comme Java.
Une implémentation consiste à créer un "langage spécifique au domaine" qui est une manière d'améliorer un langage de programmation pour accomplir une tâche spécifique. Cela peut être incroyablement puissant s'il est fait correctement. Ruby on Rails est un bon exemple de ce type de programmation.
Si vous souhaitez explorer cette méthode, consultez la structure et l'interprétation des programmes informatiques qui est l'un des livres fondamentaux couvrant le sujet.
la source
Fondamentalement, il s'agit d'écrire du code qui génère plus de code, qui est exécuté pour atteindre un objectif. Cela se fait généralement soit dans la même langue (en utilisant javascript pour créer une chaîne javascript, puis
eval
elle) soit pour émettre une autre langue (en utilisant .NET pour créer un fichier batch Windows).la source
wikipedia a un bel article sur le sujet. Il n'est pas nécessaire de faire des modifications à l'exécution pour que quelque chose soit qualifié de métaprogrammation. Par exemple, de nombreuses personnes utilisent des modèles C ++ pour effectuer une métaprogrammation au moment de la compilation.
la source