Je pense que Meta Programming est très très cool. En particulier, j'aime les macros Lisp. P>
Cependant, je pense que c ++ modèle sucer parce que:
1. Ils ralentissent le temps de compilation (même avec des en-têtes précompilés qui finissent par être de 50 Mo de grande taille si vous incluez l'un de SE STL Stuff).
2. Ils donnent des erreurs terribles compilatrice / syntaxe qui sont de
3. Ils n'étaient pas découragés pour une programmation de méta compliquée en premier lieu (générer des erreurs de comipleur pour les numéros premiers / montrant les modèles Turing Turing était une grosse affaire de retour dans la journée). P>
Après avoir dit tout cela, existe-t-il une alternative décente pour la programmation de Meta C ++? quelque chose comme p>
*. M -> compilateur Meta -> * .cpp -> g ++ -> exécutable? P>
EDIT: P>
Je suis thikning dans le sens des "scripts de générations de code personnalisé". Je me demande simplement s'il y a un très bon ensemble d'entre eux. P>
5 Réponses :
Si vous utilisez C ++, je pense que vos seules alternatives viables sont droites PRÉPROCESSOR MACROS , ou personnalisé génération de code . p>
Le flux de travail que vous avez décrit constituerait essentiellement une forme de génération de code dans laquelle vous pré-traiteriez votre fichier .m en code C ++ compilable. Swig est un très bon exemple de projet qui fait cela. P>
Personnellement, j'ai eu un grand succès de la rédaction de générateurs de code à Python, mais je pense que tout langage de script serait aussi bon. Un paquet qui pourrait être utile est Cog de notre propre Batchelder :) P>
Je ne suis pas sûr que c'est ce qui devrait vouloir, j'ai utilisé des générateurs de code pour produire du code C ++. En particulier, Python Cheetah. Vous encrégez essentiellement un code Python droit dans votre code C ++ et exécuté via le préprocesseur de Cheetah.it permet de faire des calculs assez complexes plus faciles que d'utiliser des modèles ou un prétraiteur C ++, plus vous obtenez toutes les bibliothèques et extensions de Python. D'autre part, il fait du débogage plus difficile si quelque chose ne va pas. Si vous êtes intéressé, je pouvais fournir des exemples et des messages EMACS pour éditer des programmes de Cheetah C ++.
Si vous avez besoin de quelque chose de moins puissant et que vous souhaitez rester dans C ++ C uniquement, prends Regard sur Boost PreProcessor, ici . Il faut un peu de temps pour s'y habituer, mais pourrait rendre la vie vraiment facile lorsque le code répétitif est impliqué p>
d'accord, je suis en train de coller l'exemple de guépard, donnez-moi quelques minutes: p> < Pré> xxx pré>
produit (après exécution qui est un code C ++ régulier P > Les lignes commençant par% sont interprétées comme des déclarations de Python par le préprocesseur de Cheetah.
/// sont des commentaires de guépard. Les valeurs par défaut utilisent # comme des relevés Python, mais je les ai changés pour éviter la collision avec des directives de préprocesseur C. Voulez-vous des exemples en utilisant le préprocesseur de boost? p> p> guépard ... code>) p>
% final code> doit être utilisé pour terminer les blocs Python. Les variables en code C ++ commencent par $ sont remplacées par des variables Python. p>
Je fais quelque chose de similaire à celui-ci en utilisant Mako; J'ai trouvé cela en recherchant une alternative plus standard.
La génération de code est la meilleure réponse ... p>
Vous devez également examiner comment le noyau Linux effectue des listes liées. P>
La liste liée au noyau Linux a expliqué p>
L'idée de base est que, au lieu de disposer de votre type intégré dans certaines structures (par exemple avec les pointeurs suivants et prévisibles, pour une implémentation de la liste typique), vous avez la liste des noyau structurée intégrée dans votre structure ... genre de flexion de l'esprit, Mais consultez l'article ... Je n'ai jamais pensé que le type de générique de sécurité était possible en C jusqu'à ce que je voyais cela .... p>
Sauf que, votre exemple n'est pas sécurisé de type, c'est-à-dire inconscient.
Le casting est caché derrière certaines macros. Cependant, pour C où il est difficile ou impossible de faire ce genre de chose de manière typique, cette technique est très utile. Windows a eu des macros similaires ( contenant_record () code>) pour la manipulation de la liste liée également. C'est une belle technique compte tenu des limitations de C. et j'ai maintenant appris un nouveau terme utile: "Tapez inconscient".
Vous pouvez utiliser cette technique de liste liée à C ++ et boost :: intrusif vous permet de le faire sans couler, pas même caché derrière les macros.
La plupart des gens insistent sur la tentative de métaprogramme de l'intérieur de leur langue préférée. C ++ est retenu comme exemple quintessentiel en raison de la métaprogrammation des modèles. Pendant que cela fonctionne, il est douloureux et maladroit. Je trouve que cela raconte que les gens figuraient, il était capable d'être capable, après que Stroustrop l'ait ajouté à la langue; Je ne pense pas même qu'il s'attendait à ce qu'il se révèle tout à fait la façon dont il l'a fait, bien que je doute qu'il se plaint de cela maintenant. P>
Mais la plupart des langues de programmation n'ont pas d'installations de métaprogramming. (Ou ils peuvent avoir des capacités faibles ou maladroites :) p>
Un moyen autour de cela est de faire des métaprogrammations de dehors em> la langue, en utilisant Outils de transformation de programme . Ces outils peuvent analyser le code source et effectuer des transformations arbitraires à ce sujet (c'est ce que les métaprogramming font de toute façon), puis craignent le programme révisé. P>
Si vous avez un système de transformation de programme à usage général, vous pouvez analyser des langues arbitraires, vous pouvez ensuite faire de la métaprogrammation sur / avec la langue que vous aimez.
Voir notre Toolkit de réengagement logiciel DMS pour un tel outil, qui ont des extrémités avant robustes Pour C, C ++ (même C ++ 17), Java, C #, Cobol, PHP et un certain nombre d'autres langages de programmation, et ont été utilisés pour la métaprogramming sur tous ceux-ci. P>
Cette approche est utile car elle fournit une approche méthodologique régulière pour fournir des méthodes de métaprogrammation pour toute langue que vous souhaitez manipuler. Et vous n'avez pas besoin d'attendre que les concepteurs de langue et les metteurs à mettre en œuvre ne doivent pas non plus avoir à vivre avec les limites de ce qu'ils peuvent imaginer ou réellement mettre en œuvre, ou payer le prix de l'espace / heure d'exécution de toutes ces données de réflexion qu'il prend pour le soutenir. p>
Comme TM, l'utilisation de transformations de programme prend des efforts pour apprendre et appliquer. Mais être capable de manipuler des programmes de manière arbitraire semble assez utile. P>
(Nous avons fait une réingénierie architecturale de très grandes applications C ++ en utilisant DMS. TM ne peut tout simplement pas le faire). P>
Si C ++ 0x est une option, certains problèmes de méta-programmation peuvent être réduits à un ensemble de fonctions ConstExpr, exécutées au moment de la compilation. Par exemple, envisagez Matteur Regex de compilation à l'aide de Consexport a>. Les fonctions ConstExpr sont également plus rapide que C ++ Modèle Meta -programmes. p>
Si vous êtes dans la programmation fonctionnelle, plusieurs autres options sont également disponibles. P>
C ++ Modèle METAPROGRAMMING AVEC HASKELL INTÉGRÉ < / p>
Meta vers une interface de style fonctionnel pour les métaprogrammes de modèle C ++ < / p>
Quel genre de choses essayez-vous de générer ou de calculer? Structures? Fonctions droites? Code spaghetti? Machines d'état?