Quelle est exactement la métaprogrammation?
Je lisais un article sur l'événement theserverside sur ployglot de programmation sur la plate-forme Java. Quelques commentaires dans l'article, reportez-vous à la métaprogrammation que la capacité à générer du code (peut-être à la volée).
Est la métaprogrammation la capacité de générer du code à la volée ou est-ce la capacité d'injecter des méthodes et des attributs des objets existants au moment de l'exécution (comme ce que certains langages dynamiques comme Python, Ruby, et Groovy permettre).
- Vous pourriez être intéressé dans cette réponse, stackoverflow.com/questions/2565572/...
- La réponse est en fait mieux que toutes les réponses ici!
InformationsquelleAutor Parag | 2009-02-05
Vous devez vous connecter pour publier un commentaire.
Métaprogrammation se réfère à une variété de moyens d'un programme de la connaissance de lui-même ou peut manipuler lui-même.
Dans des langages tels que C#, la réflexion est une forme de métaprogrammation depuis le programme peut examiner l'information sur lui-même. Par exemple une liste de toutes les propriétés d'un objet.
Dans des langues comme l'ActionScript, vous pouvez évaluer les fonctions au moment de l'exécution pour créer de nouveaux programmes tels que eval("x" + i).DoSomething() pourrait affecter un objet appelé x1 lorsque je est 1 et x2 lorsque je est 2.
Enfin, une autre forme courante de la métaprogrammation est lorsque le programme peut modifier lui-même dans la non-trivial de la mode. LISP est bien connu pour cela et c'est quelque chose de Paul Graham défendu depuis une dizaine d'années. Je vais regarder de très près certains de ses essais. Mais l'idée est que le programme serait le changement d'une autre partie du programme en fonction de son état. Cela permet un niveau de souplesse pour prendre des décisions à l'exécution qui est très difficile dans la plupart des langues populaires aujourd'hui.
Il est également intéressant de noter que, de retour dans le bon vieux jours de programmation en droit de l'assemblée, les programmes modifiés eux-mêmes au moment de l'exécution sont nécessaires et très banal.
De Paul Graham essai "Ce Qui A Fait Lisp Différents":
in order to put technical barriers between us and our competitors
et c'est tamade correcte.Grande question. Je suis vraiment désolé de voir qu'aucune des réponses en train de vraiment répondre à votre question correctement. Peut-être que je peux aider...
La définition de la métaprogrammation est vraiment très simple: il signifie que les programmes qui manipulent des programmes.
Votre réponse dit des programmes qui manipulent eux-mêmes. Ceux-ci sont en effet metaprograms mais ils sont un sous-ensemble de tous les metaprograms.
Tous:
sont metaprograms. Ainsi, le Compilateur GCC est un metaprogram, le Disponible interprète est un metaprogram, le Système de calcul formel Mathematica est un metaprogram, le Coq prouveur est un metaprogram et ainsi de suite.
D'autres réponses ont affirmé que metaprograms sont des programmes qui génèrent des autres programmes. Ceux-ci sont en effet metaprograms mais, encore une fois, ils sont un sous-ensemble de tous les metaprograms. Le Plus rapide de la transformée de Fourier dans l'Ouest (FFTW) bibliothèque est un exemple d'une telle metaprogram. Le code source est écrit principalement en OCaml et il génère des bits de code C (appelé codelets) qui sont combinés pour créer haute performance La Transformée De Fourier Rapide routines optimisées pour des machines spécifiques. Cette bibliothèque est en fait utilisé pour fournir la FFT routines Matlab. Les gens ont écrit des programmes pour générer des méthodes numériques pour les décennies, depuis les premiers jours de FORTRAN.
Le premier langage de programmation intégré de soutien pour la métaprogrammation est LISP) de la langue à la fin des années 1950. LISP 1.5 inclus un certain nombre de caractéristiques qui ont fait la métaprogrammation plus facile. Tout d'abord, LISP de base de données est de type listes imbriquées, c'est à dire les arbres comme
(a (b c) d)
, ce qui signifie que tout code LISP peut exprimées en natif comme une structure de données. Ceci est connu comme homoiconicity. Deuxièmement, du code LISP peuvent être converties en données facilement à l'aide de DEVIS. Par exemple(+ 1 2 3)
ajoute 1+2+3 et(QUOTE (+ 1 2 3))
crée une expression qui ajoute 1+2+3 lors de l'évaluation. Troisièmement, LISP a fourni une méta-circulaire de l'évaluateur qui vous permet d'utiliser l'hôte interpréteur ou compilateur pour évaluer du code LISP au moment de l'exécution, y compris au moment de l'exécution généré du code LISP. LISP est descendants Régime et Clojure. Dans toutes ces langues, la métaprogrammation est le plus souvent vu sous la forme de programmes qui modifient eux-mêmes, généralement à l'aide de macros.Dans les années 1970, Robin Milner développé un Métalangage (ML) qui a évolué dans la ML de la famille des langages de programmation qui comprend Standard ML et OCaml et fortement influencé Haskell et F#. Ces langues de le rendre facile à exprimer en d'autres langues. Dans ces langues metaprograms sont les plus couramment observés sous la forme de lexers, les analyseurs, les interprètes et les compilateurs.
En 1994, Erwin Unruh a découvert que le C++ système de template est Turing complet et peut être utilisée pour exécuter des programmes arbitraires au moment de la compilation. C++ template métaprogrammation apporté la métaprogrammation pour les masses incultes qui (ab)utilisé pour beaucoup de choses différentes, y compris la production de méthodes numériques dans le Blitz++ de la bibliothèque.
Bien, la métaprogrammation est juste de la programmation, mais c'est essentiellement "écrire du code qui écrit le code".
La capacité que vous évoquez, lorsqu'un programme peut observer et de modifier sa propre structure et le comportement est appelé la réflexion et c'est un type de métaprogrammation.
Typées dynamiquement langues, ont puissant moteur d'exécution de réflexion fonctionnalités, rendue possible par les interpréter la nature de ces langues...
Statique tapé langues ont de puissantes techniques de métaprogrammation, par exemple le C++ modèle de métaprogrammation...
Ce n'est que mon opinion personnelle, qui est probablement le plus libéral de la définition de la métaprogrammation.
Je pense qu'il comprend:
Je pense que vous pouvez y arriver en utilisant l'un de ces et en combinaison:
La métaprogrammation est d'écrire un programme qui affiche un autre programme. C'est quelque chose de langages comme Lisp sont vraiment bons. Il est beaucoup plus facile à faire dans un langage qui prend en charge réelle des macros (pas C++ macros, mais plutôt ceux qui peuvent manipuler le code de sortie) tels que Ruby, Lisp, Scheme, etc. que dans un langage comme Java.
Une mise en œuvre consiste à créer un langage spécifique au domaine" qui est un moyen de renforcer un langage de programmation pour accomplir une tâche spécifique. Il peut être incroyablement puissant si fait correctement. Ruby on Rails est un bon exemple de ce genre de programmation.
Si vous êtes intéressé à l'exploration de cette méthode, consultez la La Structure et l'Interprétation des Programmes d'Ordinateur qui est l'un des précurseurs des livres traitant de ce sujet.
Fondamentalement, c'est l'écriture de code qui génère plus de code qui est exécuté pour accomplir un but. Cela se fait généralement soit dans la même langue (l'utilisation de javascript pour créer un javascript chaîne de caractères, puis
eval
) ou d'émettre une autre langue (à l'aide .NET pour créer un fichier de commandes windows).wikipédia a un bel article sur le sujet. On n'a pas à faire d'exécution des modifications de quelque chose pour se qualifier comme la métaprogrammation. Par exemple, beaucoup de gens utilisent des modèles C++ pour faire la métaprogrammation au moment de la compilation.