Qual è la differenza tra i 3 compilatori CC, gcc, g ++ durante la compilazione di codice C e C ++ in termini di generazione di codice assembly, librerie disponibili, funzionalità del linguaggio, ecc.?
Qual è la differenza tra i 3 compilatori CC, gcc, g ++ durante la compilazione di codice C e C ++ in termini di generazione di codice assembly, librerie disponibili, funzionalità del linguaggio, ecc.?
Risposte:
La risposta a questa domanda è specifica della piattaforma; ciò che accade su Linux è diverso da ciò che accade su Solaris, per esempio.
La parte facile (perché non è specifica della piattaforma) è la separazione di "gcc" e "g ++":
La parte difficile, perché è specifica della piattaforma, è il significato di "CC" (e "cc").
Tuttavia, anche su Solaris, potrebbe essere che cc sia il vecchio compilatore C basato su BSD da /usr/ucb. In pratica, questo di solito non è installato e c'è solo uno stub che fallisce, devastando coloro che cercano di compilare e installare software auto-configurante.
Su HP-UX, il 'cc' predefinito è ancora un compilatore C solo K & R installato per consentire il ricollegamento del kernel quando necessario e inutilizzabile per il lavoro del software moderno perché non supporta lo standard C.Devi usare nomi di compilatori alternativi ("acc" IIRC). Allo stesso modo, su AIX, il compilatore C di sistema ha nomi come "xlc" o "xlc32".
Classicamente, il compilatore di sistema predefinito era chiamato "cc" e il software di configurazione automatica ricorre a quel nome quando non sa cos'altro usare.
POSIX ha tentato di legiferare intorno a questo richiedendo l'esistenza dei programmi c89 (originariamente) e successivamente c99; questi sono i compilatori compatibili con gli standard ISO / IEC 9899: 1989 e 9899: 1999 C. È dubbio che POSIX abbia avuto successo.
La domanda fa domande sulle differenze in termini di funzionalità e librerie. Come prima, la risposta è in parte specifica della piattaforma e in parte generica.
Il grande divario è tra i compilatori C e i compilatori C ++. I compilatori C ++ accetteranno programmi C ++ e non compileranno programmi C arbitrari. (Sebbene sia possibile scrivere C in un sottoinsieme compreso anche da C ++, molti programmi C non sono programmi C ++ validi). Allo stesso modo, i compilatori C accetteranno i programmi C e rifiuteranno la maggior parte dei programmi C ++ (perché la maggior parte dei programmi C ++ utilizza costrutti non disponibili in C).
Il set di librerie disponibili per l'uso dipende dalla lingua. I programmi C ++ possono solitamente utilizzare le librerie C su una determinata piattaforma; I programmi C di solito non possono utilizzare le librerie C ++. Quindi, C ++ ha un set più ampio di librerie disponibili.
Nota che se sei su Solaris, il codice oggetto prodotto da CC non è compatibile con il codice oggetto prodotto da g ++ - sono due compilatori separati con convenzioni separate per cose come la gestione delle eccezioni e la modifica del nome (e la modifica del nome è deliberatamente diverso per garantire che i file oggetto incompatibili non siano collegati tra loro!). Ciò significa che se vuoi usare una libreria compilata con CC, devi compilare l'intero programma con CC. Significa anche che se vuoi usare una libreria compilata con CC e un'altra compilata con g ++, sei sfortunato. Devi ricompilare almeno una delle librerie.
In termini di qualità dell'assemblatore generato, GCC (GNU Compiler Collection) fa un ottimo lavoro. Ma a volte i compilatori nativi funzionano un po 'meglio. I compilatori Intel hanno ottimizzazioni più estese che non sono state ancora replicate in GCC, credo. Ma qualsiasi pontificazione di questo tipo è pericolosa mentre non sappiamo di quale piattaforma ti preoccupi.
In termini di caratteristiche del linguaggio, i compilatori generalmente sono abbastanza vicini agli standard attuali (C ++ 98, C ++ 2003, C99), ma di solito ci sono piccole differenze tra il linguaggio standard e il linguaggio supportato dal compilatore. Il supporto dello standard C89 precedente è essenzialmente lo stesso (e completo) per tutti i compilatori C. Ci sono differenze negli angoli più oscuri della lingua. È necessario comprendere "comportamento non definito", "comportamento definito dal sistema" e "comportamento non specificato"; se invochi un comportamento indefinito, otterrai risultati diversi in momenti diversi. Ci sono anche molte opzioni (specialmente con GCC) per modificare il comportamento del compilatore. Il GCC ha una varietà di estensioni che rendono la vita più semplice se sai che stai prendendo di mira solo quella famiglia di compilatori.
CCè una variabile di ambiente che fa riferimento al compilatore C del sistema. Ciò a cui punta (librerie accessibili, ecc.) Dipende dalla piattaforma. Spesso punterà a /usr/bin/cc, l'effettivo compilatore c (driver). Sulle piattaforme Linux, CCpunta quasi sempre a /usr/bin/gcc.
gccè il binario del driver per la raccolta del compilatore GNU. Può compilare C, C ++ e possibilmente altri linguaggi; determina la lingua in base all'estensione del file.
g++è un driver binario simile gcc, ma con alcune opzioni speciali impostate per la compilazione di C ++. In particolare (nella mia esperienza), g++collegherà libstdc ++ per impostazione predefinita, mentre gccnon lo farà.
./configure+ makepossa prendere una variabile d'ambiente chiamata CCper influenzare il compilatore C usato, ma per il resto non c'è generalmente una variabile d'ambiente con quel nome.
Voglio aggiungere solo un'informazione quale cc in Linux. È collegato a gcc. Per controllarlo.

Allo stesso modo, la stessa cosa con 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++