Combien de passages sur le code gcc utilise-t-il?

  • Spécifiquement pour C et C ++, combien de passes sont utilisées par défaut?
  • Ce nombre change-t-il en fonction du niveau d’optimisation utilisé? (cela devrait)
  • Peut-il être changé directement?

Je cherchais cette information dans http://gcc.gnu.org/ , mais googler à l’aide du site:http://gcc.gnu.org/ n’a rien donné.

Tout pointeur vers une documentation à ce sujet sera également utile.


Par pass, j’entendais un passage sur la représentation originale du code source uniquement et non la définition de passe multiple suggérée par Wikipedia .

Les passes et les fichiers du compilateur peuvent être la chose la plus proche de ce que vous recherchez.

Comme d’autres l’ont souligné plus haut, les compilateurs modernes n’effectuent qu’un seul passage au stade de l’parsing syntaxique, puis plusieurs à un stade ultérieur en utilisant une représentation interne (généralement des arbres ou une autre structure de données de type graphe en mémoire).

Concrètement, GCC utilise cette approche. Voir: https://gcc.gnu.org/onlinedocs/gccint/Parsing-pass.html#Parsing-pass

Je n’ai jamais entendu parler d’un compilateur passant plusieurs fois sur la représentation textuelle (sauf si vous comptez le préprocesseur comme une passe). Même lorsque les compilateurs avaient plusieurs passes de communication par fichiers, les fichiers contenaient une représentation intermédiaire (table de symboles AST + sérialisée).

Les assembleurs, d’autre part, effectuaient régulièrement deux passages (ou plus) sur le code source. Leur pré-processeur permet souvent de faire des choses spécifiquement sur une passe, ce qui permet de jouer un tour plus ou moins sale.

En gcc, il existe essentiellement deux types de passes, à savoir: gimple, rtl. Dans gcc 4.6.2, le nombre total de passages uniques est égal à 207. Oui, le nombre total de passages dans un programme donné dépend du niveau d’optimisation. Et certaines de ces passes sont sockets plus d’une fois. Si quelqu’un veut passer par ces passes, allez dans le fichier passes.c dans le code source gcc. Chemin pour passes.c dans gcc 4.6.2: source gcc -> gcc -> passes.c

Oui, vous pouvez changer le nombre de passes en ajoutant vos passes en tant que plugin dynamic dans gcc.

D’après ce que quelqu’un de ma classe de conception de compilateur m’a dit, gcc effectue un seul passage, alors que d’autres compilateurs tels que ceux utilisés par Visual Studio (par défaut) utilisent deux passages. C’est pourquoi vous devez faire en sorte que les classes soient déclarées en c ++ si vous les utilisez dans une configuration circulaire.

 Class A { B* b; } Class B { A* a; } 

C # et les autres langages n’en ont pas besoin, car la première passe construit les références et la deuxième passe est compilée.

Mais là encore je ne suis pas expert en compilateurs.

Exactement un. Je ne vois aucune raison valable pour un compilateur moderne de faire plus d’un passage sur le code source, si par “code” vous voulez dire la représentation textuelle originale de la source du programme. Le but de cette passe unique est de convertir le code source en une représentation interne, qui sera utilisée pour une parsing ultérieure. Cette représentation interne n’est plus obligée d’avoir une structure linéaire et / ou ne doit plus être restreinte à un traitement séquentiel uniquement, ce qui signifie que la notion de “réussite” n’est tout simplement plus applicable.

Si cette réponse ne vous satisfait pas, vous devriez probablement fournir une explication plus précise de ce que vous définissez comme “passer” le code source.

Votre définition du multi-passe semble être l’ancienne, en raison du temps où (une représentation de) des sources de programme entières ne correspondaient tout simplement pas à la mémoire disponible. Ces temps sont révolus et je ne connais pas un seul compilateur actuel multi-passes (ancienne définition).

Dans l’entrée Wikipédia en allemand pour Comstackr, les deux définitions sont données: http://de.wikipedia.org/wiki/Comstackr

Compilateur multi-passes

En savoir plus sur la qualité du code dans le répertoire dans le code de code. In den Anfangszeiten des Comstackrbaus wurde der Übersetzungsprozess hauptsächlich deshalb in mehrere À propos de nous Heutzutage dient ein Multi-pass-Comstackr pour tous les pays, toutes les régions (Autres déclarations), disponibles avant le début du processus de recherche. Cliquez ici pour afficher le résultat.

Voulez-vous dire passe sur le code source ? Juste une fois. C’est ce qu’on appelle la phase de “tokenization” ou “parsing lexicale” ou, plus largement, “l’parsing”.

Voulez-vous dire les phases dans le compilateur? Il y a plusieurs. Le terme “pass” est vraiment plus un vieux concept d’assembleur qu’un concept de compilateur de nos jours, et même alors, il n’est utilisé que grossièrement. Le terme “pass” n’a pas une définition unique.

Les compilateurs sont décomposés en “phases”. Lisez l’intro à n’importe quel manuel du compilateur. Il expliquera les phases (il y a environ une douzaine de phases logiques), et GCC suit les modèles de manuel avec une grande fidélité. Certaines phases sont généralement combinées en une “passe” unique, d’autres sont des “passes” distinctes.

Le concept de passe n’est vraiment pas aussi utile en termes de discussion des compilateurs que le concept de phase .