Quelle est la différence entre les 3 compilateurs CC, gcc, g ++ lors de la compilation de code C et C ++ en termes de génération de code d'assemblage, de bibliothèques disponibles, de fonctionnalités de langage, etc.?
Quelle est la différence entre les 3 compilateurs CC, gcc, g ++ lors de la compilation de code C et C ++ en termes de génération de code d'assemblage, de bibliothèques disponibles, de fonctionnalités de langage, etc.?
Réponses:
La réponse à cela est spécifique à la plate-forme; ce qui se passe sous Linux est différent de ce qui se passe sous Solaris, par exemple.
La partie facile (car elle n'est pas spécifique à la plate-forme) est la séparation de 'gcc' et 'g ++':
Le plus difficile, car il est spécifique à la plate-forme, est la signification de «CC» (et «cc»).
Cependant, même sur Solaris, il se peut que cc soit l'ancien compilateur C basé sur BSD de /usr/ucb
. En pratique, cela n'est généralement pas installé et il y a juste un stub qui échoue, faisant des ravages sur ceux qui essaient de compiler et d'installer des logiciels auto-configurables.
Sur HP-UX, le 'cc' par défaut est toujours un compilateur C K & R uniquement installé pour permettre la reconnexion du noyau si nécessaire, et inutilisable pour les logiciels modernes car il ne prend pas en charge la norme C.Vous devez utiliser d'autres noms de compilateurs ('acc' IIRC). De même, sous AIX, le compilateur système C porte des noms tels que «xlc» ou «xlc32».
Classiquement, le compilateur système par défaut s'appelait «cc» et le logiciel auto-configurable se rabat sur ce nom lorsqu'il ne sait pas quoi utiliser d'autre.
POSIX a tenté de légiférer pour contourner ce problème en exigeant que les programmes c89 (à l'origine) et plus tard c99 existent; ce sont les compilateurs compatibles avec les normes ISO / CEI 9899: 1989 et 9899: 1999 C. Il est douteux que POSIX ait réussi.
La question porte sur les différences en termes de fonctionnalités et de bibliothèques. Comme auparavant, la réponse est en partie spécifique à la plate-forme et générique en partie.
Le grand fossé se situe entre les compilateurs C et les compilateurs C ++. Les compilateurs C ++ accepteront les programmes C ++ et ne compileront pas de programmes C arbitraires. (Bien qu'il soit possible d'écrire C dans un sous-ensemble également compris par C ++, de nombreux programmes C ne sont pas des programmes C ++ valides). De même, les compilateurs C accepteront les programmes C et rejetteront la plupart des programmes C ++ (car la plupart des programmes C ++ utilisent des constructions non disponibles en C).
L'ensemble des bibliothèques disponibles pour l'utilisation dépend de la langue. Les programmes C ++ peuvent généralement utiliser des bibliothèques C sur une plate-forme donnée; Les programmes C ne peuvent généralement pas utiliser les bibliothèques C ++. Ainsi, C ++ a un plus grand ensemble de bibliothèques disponibles.
Notez que si vous êtes sous Solaris, le code objet produit par CC n'est pas compatible avec le code objet produit par g ++ - ce sont deux compilateurs séparés avec des conventions distinctes pour des choses telles que la gestion des exceptions et la modification des noms (et la modification des noms est délibérément différent pour s'assurer que les fichiers objets incompatibles ne sont pas liés ensemble!). Cela signifie que si vous souhaitez utiliser une bibliothèque compilée avec CC, vous devez compiler tout votre programme avec CC. Cela signifie également que si vous souhaitez utiliser une bibliothèque compilée avec CC et une autre compilée avec g ++, vous n'avez pas de chance. Vous devez recompiler au moins l'une des bibliothèques.
En termes de qualité d'assembleur généré, le GCC (GNU Compiler Collection) fait un très bon travail. Mais parfois, les compilateurs natifs fonctionnent un peu mieux. Les compilateurs Intel ont des optimisations plus étendues qui n'ont pas encore été répliquées dans GCC, je crois. Mais de telles pontifications sont dangereuses alors que nous ne savons pas de quelle plate-forme vous êtes concerné.
En termes de fonctionnalités du langage, les compilateurs sont tous généralement assez proches des standards actuels (C ++ 98, C ++ 2003, C99), mais il existe généralement de petites différences entre le langage standard et le langage supporté par le compilateur. L'ancien support standard C89 est essentiellement le même (et complet) pour tous les compilateurs C. Il existe des différences dans les coins les plus sombres de la langue. Vous devez comprendre le «comportement non défini», le «comportement défini par le système» et le «comportement non spécifié»; si vous invoquez un comportement non défini, vous obtiendrez des résultats différents à des moments différents. Il existe également de nombreuses options (notamment avec le GCC) pour modifier le comportement du compilateur. Le GCC a une variété d'extensions qui simplifient la vie si vous savez que vous ciblez uniquement cette famille de compilateurs.
CC
est une variable d'environnement faisant référence au compilateur C du système. Ce qu'il pointe (bibliothèques accessibles, etc.) dépend de la plate-forme. Souvent, il pointera vers /usr/bin/cc
le complicateur c réel (pilote). Sur les plates-formes Linux, CC
pointe presque toujours vers /usr/bin/gcc
.
gcc
est le binaire du pilote pour la collection de compilateurs GNU. Il peut compiler C, C ++ et éventuellement d'autres langages; il détermine la langue par l'extension de fichier.
g++
est un pilote de type binaire gcc
, mais avec quelques options spéciales définies pour la compilation de C ++. Notamment (d'après mon expérience), g++
liera libstdc ++ par défaut, alors que gcc
non.
./configure
+ make
peut prendre une variable d'environnement nommée CC
pour affecter le compilateur C utilisé, mais sinon, il n'y a généralement pas de variable d'environnement portant ce nom.
Je veux ajouter juste une information sur ce que cc sous Linux. Il est lié à gcc. Pour le vérifier.
De même, la même chose avec c ++.
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++