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.?
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.?
Odpowiedzi:
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 ++”:
Najtrudniejszą częścią, ponieważ jest specyficzna dla platformy, jest znaczenie „CC” (i „CC”).
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.
CC
jest 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/cc
na faktyczny zgodny z c (sterownik). Na platformach linux CC
prawie zawsze wskazuje na /usr/bin/gcc
.
gcc
to 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 gcc
nie.
./configure
+ make
może przyjąć zmienną środowiskową o nazwie, CC
aby wpłynąć na używany kompilator C, ale poza tym zwykle nie ma zmiennej środowiskowej o tej nazwie.
Chcę dodać tylko jedną informację, co cc w Linuksie. Jest powiązany z gcc. Żeby to sprawdzić.
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++