2009-10-04 17 views
56

Jaka jest różnica między 3 kompilatorami CC, gcc, g ++ podczas kompilowania kodów C i C++ pod względem montażu generowanie kodu, dostępnych bibliotek, funkcji językowych itp.?Różnica między CC, gcc i g ++?

+0

Jak wskazano w mojej odpowiedzi - odpowiedź na pytanie zależy od platformy, ale platforma nie jest określona. –

+3

Powiązane pytanie: http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc/173007 –

Odpowiedz

82

Odpowiedź na to pytanie jest zależna od platformy; to, co dzieje się w Linuksie, różni się od tego, co dzieje się na przykład w Solarisie.

Prosta część (ponieważ nie jest zależne od platformy) jest oddzielenie 'gcc' i 'g ++'

  • GCC GNU C kompilator GCC (GNU kompilator Collection).
  • g ++ jest kompilatorem GNU C++ od GCC.

Najtrudniejszą częścią, ponieważ jest to specyficzne dla platformy, jest znaczenie "CC" (i "cc").

  • W systemie Solaris CC jest zwykle nazwą kompilatora Sun C++.
  • W systemie Solaris cc jest zwykle nazwą kompilatora Sun C.
  • W systemie Linux, jeśli istnieje, CC jest prawdopodobnie linkiem do g ++.
  • W systemie Linux cc jest linkiem do gcc.

Jednak nawet w systemie Solaris może to oznaczać, że cc to stary kompilator C oparty na BSD z /usr/ucb. W praktyce to zazwyczaj nie jest instalowane i jest tylko niedziałający kod pośredniczący, który sieje spustoszenie na tych, którzy próbują skompilować i zainstalować samodzielnie konfigurujące się oprogramowanie.

W systemie HP-UX domyślnym "cc" jest nadal zainstalowany kompilator C tylko R-only K, aby umożliwić ponowne podłączenie jądra, gdy jest to konieczne, i nieużyteczny dla nowoczesnego oprogramowania, ponieważ nie obsługuje standardowego C. muszą 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 systemowy był nazywany "cc", a oprogramowanie do samodzielnej konfiguracji powracało do tej nazwy, gdy nie wie, co jeszcze można użyć.

POSIX próbował ustanowić prawo w tym zakresie, wymagając istnienia programów c89 (pierwotnie) i późniejszego c99; są to kompilatory zgodne ze standardami ISO/IEC 9899: 1989 i 9899: 1999 C. Wątpliwe jest, że POSIX odniósł sukces.


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

Duża różnica między kompilatorami C i kompilatorami C++. Kompilatory C++ będą akceptować programy w C++ i nie będą kompilować dowolnych programów w języku C. (Chociaż możliwe jest napisanie C w podzbiorze, który jest również rozumiany przez C++, wiele programów C nie jest prawidłowymi programami C++). Podobnie kompilatory języka C akceptują programy w języku C i odrzucają większość programów w C++ (ponieważ większość programów w C++ używa konstrukcji niedostępnych w C).

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

Należy zauważyć, że jeśli korzystasz z systemu Solaris, kod obiektowy generowany przez CC nie jest zgodny z kodem wynikowym wytworzonym przez g ++ - są to dwa oddzielne kompilatory z osobnymi konwencjami dla takich rzeczy, jak obsługa wyjątków i mangling nazw (oraz nazwa mangling jest rozmyślnie inna, aby zapewnić, że niekompatybilne pliki obiektów nie są ze sobą połączone!). Oznacza to, że jeśli chcesz korzystać z biblioteki skompilowanej z CC, musisz skompilować cały program z CC. Oznacza to również, że jeśli chcesz użyć jednej biblioteki skompilowanej z CC i innej skompilowanej za pomocą g ++, masz pecha. Musisz przekompilować przynajmniej jedną z bibliotek.

Pod względem jakości generowanego asemblera, GCC (GNU Compiler Collection) wykonuje bardzo dobrą robotę. Ale czasami natywne kompilatory działają trochę lepiej. Kompilatory Intela mają bardziej rozbudowane optymalizacje, które, jak sądzę, nie zostały jeszcze zreplikowane w GCC. Ale każda taka kara jest ryzykowna, podczas gdy my nie wiemy, z której platformy korzystasz.

Pod względem funkcji językowych kompilatory ogólnie bardzo się zbliżają do obecnych standardów (C++ 98, C++ 2003, C99), ale zazwyczaj występują niewielkie różnice między językiem standardowym a językiem obsługiwanym przez kompilator. Starsza obsługa standardu C89 jest zasadniczo taka sama (i kompletna) dla wszystkich kompilatorów języka C. W ciemniejszych zakątkach języka istnieją różnice. Musisz zrozumieć "niezdefiniowane zachowanie", "zachowanie zdefiniowane przez system" 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 z GCC), aby poprawić działanie kompilatora. GCC ma wiele rozszerzeń, które upraszczają życie, jeśli wiesz, że celujesz tylko w tę rodzinę kompilatorów.

20

CC to zmienna środowiskowa odnosząca się do kompilatora C systemu. To, na co wskazuje (dostępność bibliotek itp.) Zależy od platformy. Często będzie wskazywać na /usr/bin/cc, rzeczywistą kompilację c (sterownik). Na platformach linuksowych, CC prawie zawsze wskazuje na /usr/bin/gcc.

gcc to sterownik binarny dla kolekcji kompilatora GNU. Może kompilować C, C++ i być może inne języki; określa język według rozszerzenia pliku.

g++ to sterownik binarny, taki jak gcc, ale z kilkoma specjalnymi opcjami ustawionymi dla kompilowania C++. Warto zauważyć (z mojego doświadczenia), że g++ domyślnie będzie łączyło libstdC++, podczas gdy gcc nie będzie.

+1

Czy możesz wyjaśnić, co masz na myśli przez "sterownik binarny"? –

+3

Większość kompilatorów języka C, ale w szczególności GCC, ma wiele programów do wykonania kompilacji. Istnieje program najwyższego poziomu, zwany "gcc", który jest sterownikiem kompilatora; analizuje niezliczone opcje wiersza poleceń i steruje innymi fazami kompilatora - zwykle analizator składni, optymalizator, asembler i łącznik (zazwyczaj preprocesor zwykle nie jest obecnie osobną fazą, chyba że użytkownik zażąda tylko wstępnego przetwarzania). To (sterownik kompilatora) jest dość złożonym programem, mimo że nigdy nie dotyka samego pliku źródłowego C. –

+3

CC to także kompilator Sun C++ - a nie zmienna środowiskowa. –

Powiązane problemy