Je vois le métaprogamme comme "des programmes qui écrivent (ou modifient) d'autres programmes". (Une autre réponse disait "des usines qui fabriquent des usines", belle analogie).
Les gens trouvent toutes sortes d'utilisations pour cela : personnalisation des applications, génération de code passe-partout, l'optimisation d'un programme pour des circonstances particulières, l'implémentation de DSL, l'insertion de code pour traiter des problèmes de conception orthogonaux ("aspects") ...
Ce qui est remarquable, c'est le nombre de mécanismes différents qui ont été inventés pour y parvenir au coup par coup : modèles de texte, macros, conditionnels de préprocesseur, génériques, modèles C++, aspects, réflexion,... Et généralement, certains de ces mécanismes sont intégrés dans certains langages, et d'autres mécanismes dans d'autres langages. dans d'autres langages, et la plupart des langages n'ont aucun support de métaprogrammation. Cette distribution éparpillée des capacités signifie que vous pouvez être en mesure de faire certains types de métaprogrammation dans certains langages. de métaprogrammation dans un langage, avec des limitations, et ne pas pouvoir le faire dans un autre. C'est exaspérant :-}
Une observation que j'ai suivie à la lettre est que l'on peut construire des produits génériques. de métaprogrammation générique qui fonctionne avec tout sous forme de transformations du programme . Une transformation de programme est un modèle paramétré : "si vous voyez ce remplacez-la par que syntaxe".
Une transformation en soi n'est généralement pas impressionnante, mais des douzaines ou des centaines de transformations peuvent faire de l'argent. des changements spectaculaires dans le code. Parce que les transformations de programmes (sophistiquées) peuvent simuler une machine de Turing, elles peuvent effectuer des modifications arbitraires du code, y compris toutes ces techniques ponctuelles que vous trouvez éparpillées.
Un outil qui accepte des définitions de langage. des transformations spécifiques au langage et qui génère un autre pour appliquer ces transformations est un méta -outil de métaprogrammation : un programme pour écrire des "programmes qui écrivent des programmes".
L'intérêt est que vous pouvez appliquer un tel outil pour effectuer des changements très variés à un code arbitraire. Et, vous n'avez pas besoin du comité de conception du langage pour réaliser que vous que vous voulez un type particulier de support de métaprogrammation, et se dépêcher de le fournir pour que vous puissiez continuer votre travail aujourd'hui.
Une leçon intéressante est que de telles machines nécessitent une analyse de programme solide (symbole (tables de symboles, analyse des flux de contrôle et de données, etc.) ) pour l'aider à se concentrer sur l'endroit où se trouvent les problèmes dans le code, afin que la métaprogrammation ) pour l'aider à se concentrer sur l'endroit où se trouvent les problèmes dans le code, afin que la machine de métaprogrammation puisse faire quelque chose à cet endroit (un exemple très faible de ceci est les spécifications par points dans les aspects, qui disent "faites des changements aux endroits qui ressemblent à ceci").
Le PO a demandé des exemples spécifiques d'application de la métaprogrammation. Nous avons utilisé notre outil de métaprogrammation "méta" ( Boîte à outils de réingénierie des logiciels DMS ) pour réaliser les activités suivantes sur grand site les bases de code automatiquement :
- Migration des langues
- Mise en œuvre de la couverture des tests et des profileurs
- Mise en œuvre de la détection des clones
- Réingénierie massive de l'architecture
- Génération de codes pour le contrôle en usine
- SOAisation des contrôleurs de réseau embarqués
- Extraction d'architecture pour les logiciels de l'ordinateur central
- Génération d'instructions SIMD vectorielles à partir de calculs de tableaux
- Rétro-ingénierie du code jusqu'aux concepts
dans de nombreux langages, notamment Java, C#, C++, PHP, ...
L'OP a également demandé, "Pourquoi était-ce mieux que l'alternative ?" La réponse a trait à l'échelle, au temps et à la précision.
Pour les grandes applications, la simple taille de la base de code signifie que vous n'avez pas les ressources ou le temps de faire de telles analyses ou modifications à la main. ou le temps pour effectuer de telles analyses ou modifications à la main.
Pour les tâches de génération de code ou d'optimisation, vous pouvez faire ce qui suit à la main, mais les outils peuvent le faire beaucoup plus rapidement et avec plus de précision.
En substance, ces outils font ce que les êtres humains ne peuvent tout simplement pas faire.
Il convient de noter que les outils ne sont pas créatifs. humains pour déterminer ce qu'ils doivent faire, c'est-à-dire décider de la nature de la quelle est la tâche à accomplir (voir la liste d'exemples ci-dessus) et déterminer comment définir les analyses/transformations pour obtenir cet effet. Vous avez toujours besoin méta -programmeurs. Cependant, lorsqu'un méta-programmeur arme un tel outil avec les bonnes connaissances, le code résultant peut sembler être construit par un codeur expert, créatif et incroyablement rapide.
1 votes
Votre deuxième lien semble assez clair, quelle est votre compréhension des deux concepts, pour voir s'il y a une confusion fondamentale de votre part, sinon votre question est trop large et subjective IMO.
1 votes
Ma question est d'ordre pratique : pourquoi la métaprogrammation est-elle meilleure que, par exemple, l'écriture de quelques éléments de requêtes SQL paramétrées et leur assemblage sur la base de certaines conditions ? Ou es c'est de la métaprogrammation ? (Je ne pensez à mais c'est pour cela que je pose la question - Est-ce différent et pourquoi est-ce mieux ?).
1 votes
Parce que parfois, vous ne savez même pas à l'avance quelle table vous allez interroger ou quelles colonnes vous allez retourner (cela dépend peut-être d'une combinaison d'entrées utilisateur, trop difficile de précalculer toutes les possibilités à l'avance), vous utilisez donc le SQL dynamique (qui pourrait peut-être être considéré comme une forme de métaprogrammation).