Méta-programmation

10

Je viens de commencer mon voyage en tant que développeur C ++ et j'ai récemment étudié un sujet appelé méta-programmation. Jusqu'à présent, j'ai parcouru beaucoup d'informations sur le sujet et j'ai quelques questions.

  1. Utilisation de Reflection en c ++: est-ce possible? Selon ma compréhension, la réflexion est une technique de méta-programmation qui a la capacité de manipuler un état d'un programme, et sa manipulation peut être une introspection ou une introcession.

  2. Quelle est la différence entre l'architecture réfléchissante et l'architecture de méta-niveau? Dans quelle catégorie appartient l'architecture de méta-programmation?

  3. La méta-programmation se décline en deux niveaux: le méta-niveau et le niveau de base. À ma connaissance, le programme objet ou le système sous enquête est le niveau de base, et le méta-programme qui va fonctionner sur le système sous enquête est le niveau méta. Ai-je raison?

Aidez-moi également en fournissant quelques directives sur le travail sur la métaprogrammation de modèles en C ++.
Pouvez-vous me suggérer quelques exemples pratiques que je peux rechercher pour me familiariser avec cette technique de programmation?

ChrisF
la source
2
Cette question pourrait appartenir davantage aux programmeurs qu'à stackoverflow. Le premier étant plus théorique et le second plus pratique. Certaines parties peuvent être facilement répondues d'un point de vue pratique Le C ++ n'a pas de réflexion , mais d'autres ne sont pas liés au code (différence entre les architectures réfléchissantes et métalliques, par exemple)
David Rodríguez - dribeas
Cette réponse SO explique pourquoi C ++ n'a pas de réflexion: stackoverflow.com/q/359237/120163 , et quelques techniques C ++ faibles pour le simuler mal.
Ira Baxter
Si vous êtes très intéressé par la métaprogrammation, je vous suggère de jeter un œil au langage D, plus clair que C ++ sur ce point.
deadalnix

Réponses:

10

La métaprogrammation signifie simplement que vous avez les moyens d'écrire du code qui écrit un autre code (au sens large). C ++ le fait via le mécanisme de modèle, qui est fondamentalement un langage de macro de type sécurisé. Il est parfaitement possible d'appliquer simplement l'étape d'extension du modèle, et le résultat sera un code C ++ sans modèle valide.

La réflexion est la capacité d'un langage de programmation et / ou d'un environnement d'exécution à inspecter (et souvent à modifier) ​​ses propres éléments de langage au moment de l'exécution. En règle générale, les langages réfléchissants offrent des structures de données qui représentent des éléments de langage tels que des classes, des méthodes, des variables, des paramètres, etc., ainsi que des routines ou des classes pour les inspecter, les modifier et les créer. La capacité de modification fait de la réflexion un type de méta-programmation, car elle vous permet d'écrire du code qui génère un autre code.

D'autres exemples de métaprogrammation incluent les générateurs de code, les binaires auto-modifiables (bien qu'ils ne soient plus aussi populaires aujourd'hui qu'ils l'étaient il y a deux décennies), les macros C; on pourrait faire valoir que le curry et les techniques de programmation fonctionnelle similaires sont également une sorte de métaprogrammation.

tdammers
la source
+1 J'aime vraiment votre réponse et je veux poser des questions sur l'utilisation du compilateur en tant que service comme en C # ou en utilisant un moteur de script comme en Java pour exécuter du code qui est construit au moment de l'exécution. N'est-ce pas aussi une forme de métaprogrammation?
M.Sameer
Donc, quiconque construit un interpréteur Python en C fait de la métaprogrammation? Qu'en est-il de l'implémentation d'un ORM qui mappe un langage orienté objet vers SQL? Chaque framework web est-il un exemple de métaprogrammation?
kojiro
1
  1. Non. Les programmes C ++ sont compilés en code machine et toutes les informations sur les classes, etc. sont perdues (à moins d'utiliser C ++ / CLI pour l'environnement .NET, mais ce n'est pas du C ++ pur).

2-3. Je ne sais pas - attendez une autre réponse qui aide à cela :-)

La méta-programmation utilisant des modèles C ++ est très puissante, mais aussi complexe. L'extension du modèle nécessite un style de programmation fonctionnel plutôt qu'une programmation impérative que C ++ utilise. Si vous n'avez pas d'expérience avec la programmation fonctionnelle, je vous recommanderais de faire un détour et d'apprendre quelques lisp, haskell ou schémas de base.

Anders Abel
la source