IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[metaprog] voir le travail du compilateur


Sujet :

C++

  1. #1
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut [metaprog] voir le travail du compilateur
    Bonjour,

    J'aurais voulu savoir s'il est possible de voir la transformation que fait le compilateur des lignes de métaprogrammation?
    Comme par exemple avec les macros et -E de g++.

    ps: je travaille avec g++.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Avec Boost, tu peux faire des printf, ce qui te permet d'afficher quelques résultats, mais pas tous.
    Afficher un résultat de métaprog, c'est chaud, je trouve, enfin, ça dépend pas mal du programme

  3. #3
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Je sais pas is je me sui bien fais comprendre...

    dans l'exemple suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<unsigned int>
    struct Factoriel{
       enum{value=N*Factoriel<N-1>::value};
    };
    template<>
    struct Factoriel<0>{
       enum{value=1;}
    };
    Avec la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned f = Factoriel<5>::value;
    g++ doit bien un moment transformer cette ligne en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned f = 5*4*3*2*1*1;
    N'y aurait il pas un moyen de l'arréter aprés cette transformation comme avec l'option -E pour les macros qui sont transformées au moment de la précompilation?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Déjà pour que ce soit clair, au niveau des options de compilation il n'y a rien. Le traitement des méta-programmes n'est pas une phase séparée comme peut l'être le préprocessing, c'est intégré à la "compilation".

    Ensuite pour ton exemple, le mieux est encore de regarder la sortie ASM générée. Même si tu n'y connais rien en assembleur, un tel enchaînement de constantes apparaîtra clairement.

    Et puis surtout, personne ne sait où le compilo va s'arrêter, il peut très bien sortir la suite de multiplications que tu donnes, ou bien directement la constante finale.

    Sans oublier que la méta-programmation ce n'est pas que du calcul de constantes, ça peut aussi être de la génération de types. Et là, pour voir des résultats intermédiaires...

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Laurent Gomila
    Déjà pour que ce soit clair, au niveau des options de compilation il n'y a rien.
    Je n'en suis pas sur. J'attendais pour repondre parce que je voulais verifier. Il y a une serie d'options de dump (genre -ftree-dump) qui pourraient aider.

    Le traitement des méta-programmes n'est pas une phase séparée comme peut l'être le préprocessing, c'est intégré à la "compilation".
    Exact.

    Et puis surtout, personne ne sait où le compilo va s'arrêter, il peut très bien sortir la suite de multiplications que tu donnes, ou bien directement la constante finale.
    J'imagine mal un compilateur ne pas mettre la constante finale dans ce cas. Pour rappel c'est la valeur d'un enum et elle peut servir par exemple pour dimentionner un tableau et a d'autres endroits ou le C++ exige d'avoir une constante.

    Sans oublier que la méta-programmation ce n'est pas que du calcul de constantes, ça peut aussi être de la génération de types. Et là, pour voir des résultats intermédiaires...
    Ca ne me semble pas rehidibitoire. Je suis sur que gnat -- la partie Ada de gcc -- permet un dump a un niveau de description "C" bien que ce soit une syntaxe Ada. Ca ne m'etonnerait pas, mais je ne suis pas certain, qu'une option disponible pour le C++ le fasse aussi. Mais il faut se taper le manuel et peut-etre experimenter un peu et j'ai pas le temps maintenant.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je n'en suis pas sur. J'attendais pour repondre parce que je voulais verifier. Il y a une serie d'options de dump (genre -ftree-dump) qui pourraient aider.
    Intéressant. Tu as plus de précisions sur ces options ?

    J'imagine mal un compilateur ne pas mettre la constante finale dans ce cas. Pour rappel c'est la valeur d'un enum et elle peut servir par exemple pour dimentionner un tableau et a d'autres endroits ou le C++ exige d'avoir une constante.
    Dans ce cas là oui, c'est vrai. Mais si on prend l'exemple d'un meta-programme qui calcule une fonction, a priori avec l'inlining on ne sait pas trop jusqu'où on va arriver. J'avais fait quelques tests : pour la fonction arctangente hyperbolique que je donne dans mon tutoriel, le compilo m'avait généré une suite de N additions de constantes, ou quelque chose de ce genre.

    Ca ne me semble pas rehidibitoire. Je suis sur que gnat -- la partie Ada de gcc -- permet un dump a un niveau de description "C" bien que ce soit une syntaxe Ada. Ca ne m'etonnerait pas, mais je ne suis pas certain, qu'une option disponible pour le C++ le fasse aussi. Mais il faut se taper le manuel et peut-etre experimenter un peu et j'ai pas le temps maintenant.
    Intéressant aussi.

Discussions similaires

  1. Voir les ordinateurs du groupe de Travail
    Par dealler dans le forum Développement
    Réponses: 0
    Dernier message: 11/08/2010, 18h46
  2. Voir les options du compilateur
    Par mess-mate dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 18/09/2008, 18h15
  3. Réponses: 10
    Dernier message: 19/06/2008, 22h51
  4. Delphi compilateur ou langage (voire les 2...)
    Par Ice-tea dans le forum Delphi
    Réponses: 5
    Dernier message: 20/02/2007, 11h59
  5. Réponses: 1
    Dernier message: 30/06/2006, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo