Różnica między CC, gcc i g ++?

107

Jaka jest różnica między trzema kompilatorami CC, gcc, g ++ podczas kompilowania kodu C i C ++ pod względem generowania kodu asemblera, dostępnych bibliotek, funkcji języka itp.?

Vehomzzz
źródło
1
Jak wskazałem w mojej odpowiedzi - odpowiedź na Twoje pytanie zależy od platformy, ale platforma nie jest określona.
Jonathan Leffler
3
Powiązane pytanie: stackoverflow.com/questions/172587/…
Martin York

Odpowiedzi:

126

Odpowiedź na to pytanie zależy od platformy; na przykład to, co dzieje się w systemie Linux, różni się od tego, co dzieje się w systemie Solaris.

Najłatwiejszą częścią (ponieważ nie jest specyficzna dla platformy) jest oddzielenie „gcc” i „g ++”:

  • gcc to kompilator GNU C z GCC (kolekcja kompilatorów GNU).
  • g ++ to kompilator GNU C ++ z GCC.

Najtrudniejszą częścią, ponieważ jest specyficzna dla platformy, jest znaczenie „CC” (i „CC”).

  • W systemie Solaris CC jest zwykle nazwą kompilatora Sun C ++.
  • W systemie Solaris nazwa cc jest zwykle nazwą kompilatora Sun C.
  • W Linuksie, jeśli istnieje, CC jest prawdopodobnie łączem do g ++.
  • W systemie Linux cc to link do gcc.

Jednak nawet w systemie Solaris może być tak, że cc jest starym kompilatorem języka C opartym na BSD /usr/ucb. W praktyce zwykle nie jest to instalowane i istnieje tylko kod, który nie działa, siejąc spustoszenie wśród tych, którzy próbują kompilować i instalować samokonfigurujące się oprogramowanie.

W HP-UX domyślnym `` cc '' jest nadal kompilator C tylko dla K & R, który pozwala na ponowne połączenie jądra, gdy jest to konieczne, i nie nadaje się do pracy z nowoczesnym oprogramowaniem, ponieważ nie obsługuje standardu C. Musisz używać alternatywnych nazw kompilatorów. („acc” IIRC). Podobnie w systemie AIX kompilator systemu C ma nazwy takie jak „xlc” lub „xlc32”.

Klasycznie, domyślny kompilator systemu nazywał się „cc”, a samokonfigurujące się oprogramowanie powraca do tej nazwy, gdy nie wie, czego jeszcze użyć.

POSIX usiłował ustanowić sposób obejścia tego problemu, wymagając istnienia programów c89 (pierwotnie), a później c99; są to kompilatory zgodne z normami ISO / IEC 9899: 1989 i 9899: 1999 C. Wątpliwe jest, aby POSIX się powiódł.


Pytanie dotyczy różnic w funkcjach i bibliotekach. Tak jak poprzednio, odpowiedź jest częściowo specyficzna dla platformy, a częściowo ogólna.

Wielki podział występuje między kompilatorami C i kompilatorami C ++. Kompilatory C ++ akceptują programy w C ++ i nie będą kompilować dowolnych programów w C. (Chociaż możliwe jest napisanie C w podzbiorze, który jest również rozumiany przez C ++, wiele programów w C nie jest poprawnymi programami w C ++). Podobnie, kompilatory C akceptują programy w C i odrzucają większość programów C ++ (ponieważ większość programów C ++ używa konstrukcji niedostępnych w C).

Zestaw bibliotek dostępnych do użycia zależy od języka. Programy C ++ mogą zazwyczaj korzystać z bibliotek C na danej platformie; Programy C zwykle nie mogą używać bibliotek C ++. Tak więc C ++ ma większy zestaw dostępnych bibliotek.

Zauważ, że jeśli pracujesz na Solarisie, kod wynikowy utworzony przez CC nie jest kompatybilny z kodem wynikowym utworzonym przez g ++ - są to dwa oddzielne kompilatory z oddzielnymi konwencjami dla rzeczy takich jak obsługa wyjątków i zniekształcanie nazw (a zniekształcanie nazw jest celowe różne, aby zapewnić, że niezgodne pliki obiektowe nie zostaną połączone!). Oznacza to, że jeśli chcesz korzystać z biblioteki skompilowanej w CC, musisz skompilować cały program w CC. Oznacza to również, że jeśli chcesz użyć jednej biblioteki skompilowanej za pomocą CC, a innej skompilowanej za pomocą g ++, nie masz szczęścia. Musisz przynajmniej przekompilować jedną z bibliotek.

Jeśli chodzi o jakość generowanego asemblera, GCC (GNU Compiler Collection) wykonuje bardzo dobrą robotę. Ale czasami natywne kompilatory działają nieco lepiej. Kompilatory Intela mają bardziej rozbudowane optymalizacje, które, jak sądzę, nie zostały jeszcze zreplikowane w GCC. Ale takie pontacje są niebezpieczne, podczas gdy nie wiemy, o którą platformę się martwisz.

Jeśli chodzi o funkcje językowe, wszystkie kompilatory generalnie są dość zbliżone do obecnych standardów (C ++ 98, C ++ 2003, C99), ale zwykle występują niewielkie różnice między językiem standardowym a językiem obsługiwanym przez kompilator. Obsługa starszego standardu C89 jest zasadniczo taka sama (i kompletna) dla wszystkich kompilatorów C. Istnieją różnice w ciemniejszych zakamarkach języka. Musisz zrozumieć „niezdefiniowane zachowanie”, „zdefiniowane przez system zachowanie” i „nieokreślone zachowanie”; jeśli wywołasz niezdefiniowane zachowanie, otrzymasz różne wyniki w różnym czasie. Istnieje również wiele opcji (szczególnie w przypadku GCC), aby dostosować zachowanie kompilatora. GCC ma wiele rozszerzeń, które ułatwiają życie, jeśli wiesz, że celujesz tylko w tę rodzinę kompilatorów.

Jonathan Leffler
źródło
1
A na OSX (przynajmniej Sierra 10.2) jest to dowiązanie symboliczne do dzwonka.
Josh Kodroff,
27

CCjest zmienną środowiskową odnoszącą się do systemowego kompilatora C. Na co wskazuje (dostępne biblioteki itp.) Zależy od platformy. Często będzie wskazywać /usr/bin/ccna faktyczny zgodny z c (sterownik). Na platformach linux CCprawie zawsze wskazuje na /usr/bin/gcc.

gccto plik binarny sterownika dla kolekcji kompilatorów GNU. Potrafi kompilować C, C ++ i prawdopodobnie inne języki; określa język na podstawie rozszerzenia pliku.

g++jest binarnym, podobnym do sterownika gcc, ale z kilkoma specjalnymi opcjami ustawionymi do kompilacji C ++. Warto zauważyć, że (z mojego doświadczenia) g++domyślnie łączy libstdc ++, a gccnie.

Managu
źródło
1
Czy możesz wyjaśnić, co rozumiesz przez „binarny sterownik”?
Edan Maor
5
Większość kompilatorów C, ale szczególnie GCC, ma wiele programów, które wykonują kompilację. Istnieje program najwyższego poziomu o nazwie „gcc”, czyli sterownik kompilatora; analizuje niezliczone opcje wiersza poleceń i organizuje inne fazy kompilatora - zazwyczaj parser / analizator, optymalizator, asembler i konsolidator (preprocesor zwykle nie jest obecnie oddzielną fazą, chyba że żądasz tylko wstępnego przetwarzania). Jest to (sterownik kompilatora) dość złożony program, mimo że nigdy nie dotyka samego pliku źródłowego C.
Jonathan Leffler
3
CC jest także kompilatorem Sun C ++ - i nie jest zmienną środowiskową.
Jonathan Leffler
1
Kompilator C ++ SGI jest również CC.
alex tingle
Cóż, przypuszczam, że Managu myśli, że ./configure+ makemoże przyjąć zmienną środowiskową o nazwie, CCaby wpłynąć na używany kompilator C, ale poza tym zwykle nie ma zmiennej środowiskowej o tej nazwie.
ephemient
6

Chcę dodać tylko jedną informację, co cc w Linuksie. Jest powiązany z gcc. Żeby to sprawdzić. wprowadź opis obrazu tutaj

Podobnie jest z 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++
Uddhav Gautam
źródło