Різниця між CC, gcc та g ++?


105

Чим відрізняються 3 компілятори CC, gcc, g ++ при компілюванні коду C і C ++ з точки зору генерації коду асемблери, наявних бібліотек, мовних особливостей тощо?


1
Як зазначено у моїй відповіді - відповідь на ваше запитання залежить від платформи, але платформа не вказана.
Джонатан Леффлер

3
Питання, пов’язані з цим: stackoverflow.com/questions/172587/…
Мартін Йорк

Відповіді:


123

Відповідь на це - конкретна платформа; те, що відбувається на Linux, відрізняється від, наприклад, Solaris.

Найпростіша частина (оскільки вона не залежить від платформи) - це розділення 'gcc' та 'g ++':

  • gcc - компілятор GNU C з GCC (Колекція компіляторів GNU).
  • g ++ - компілятор GNU C ++ від GCC.

Важкою частиною, оскільки вона є специфічною для платформи, є значення "CC" (і "cc").

  • У Solaris CC зазвичай називає компілятор Sun C ++.
  • У Solaris cc зазвичай називається компілятором Sun C.
  • У Linux, якщо він існує, CC, ймовірно, посилання на g ++.
  • У Linux cc є посиланням на gcc.

Однак, навіть на Solaris, можливо, що cc - це старий компілятор C, заснований на BSD /usr/ucb. На практиці це, як правило, не встановлено, і є лише заглушка, яка не спрацьовує, спричиняючи загрозу тим, хто намагається скласти та встановити програмне забезпечення, що самоконфігурується.

У HP-UX типовий "cc" - це все-таки компілятор C лише для K&R, встановлений для дозволу перезавантаження ядра при необхідності, і непридатний для роботи в сучасному програмному забезпеченні, оскільки він не підтримує стандартний C. Ви повинні використовувати альтернативні імена компілятора ('acc' IIRC). Аналогічно, на AIX системний компілятор C має такі назви, як 'xlc' або 'xlc32'.

Класично компілятор системи за замовчуванням називався "cc", і програмне забезпечення, що самоконфігурується, перетворюється на це ім'я, коли воно не знає, що ще використовувати.

POSIX намагався врегулювати цю проблему, вимагаючи існування програм c89 (спочатку) та пізніше c99; це компілятори, сумісні зі стандартами ISO / IEC 9899: 1989 та 9899: 1999 C. Сумнівно, що POSIX досяг успіху.


Питання задає питання про відмінності у функціях та бібліотеках. Як і раніше, відповідь є платформою частково, а частково загальною.

Велика різниця між компіляторами C і компіляторами C ++. Компілятори C ++ прийматимуть програми C ++ і не збиратимуть довільних програм C. (Хоча можна записати C у підмножину, яка також розуміється на C ++, багато програм C не є дійсними програмами C ++). Аналогічно, компілятори C приймуть програми C і відхилять більшість програм C ++ (оскільки більшість програм C ++ використовують конструкції, недоступні в C).

Набір бібліотек, доступних для використання, залежить від мови. Програми C ++ зазвичай можуть використовувати бібліотеки C на даній платформі; Програми C зазвичай не можуть використовувати бібліотеки C ++. Отже, у C ++ є більший набір бібліотек.

Зауважте, що якщо ви перебуваєте в Solaris, об'єктний код, створений CC, не сумісний з об'єктним кодом, створеним g ++ - вони є двома окремими компіляторами з окремими умовами для таких речей, як обробка винятків та керування іменами (і ім'я mangling навмисне різні для того, щоб несумісні файли об’єктів не були пов’язані разом!). Це означає, що якщо ви хочете використовувати бібліотеку, складену з CC, ви повинні скласти всю свою програму з CC. Це також означає, що якщо ви хочете використовувати одну бібліотеку, складену з CC, а іншу, складену з g ++, вам не пощастить. Вам потрібно принаймні перекомпілювати одну з бібліотек.

Що стосується якості створеної асемблера, GCC (колекція компіляторів GNU) робить дуже хорошу роботу. Але іноді вітчизняні компілятори працюють трохи краще. Я вважаю, що компілятори Intel мають більш широкі оптимізації, які ще не були використані в GCC. Але будь-які подібні понтифікації небезпечні, поки ми не знаємо, на якій платформі ви переймаєтесь.

Що стосується мовних особливостей, то всі компілятори зазвичай досить близькі до діючих стандартів (C ++ 98, C ++ 2003, C99), але зазвичай існують невеликі відмінності між стандартною мовою та мовою, яку підтримує компілятор. Старіша підтримка стандарту C89 по суті однакова (і повна) для всіх компіляторів C. У темних куточках мови є відмінності. Вам потрібно зрозуміти "невизначена поведінка", "визначена системою поведінка" та "не визначена поведінка"; якщо ви посилаєтесь на невизначену поведінку, ви отримаєте різні результати в різний час. Існує також багато варіантів (особливо з GCC), щоб налаштувати поведінку компілятора. GCC має різноманітні розширення, які полегшують життя, якщо ви знаєте, що націлені лише на цю сім'ю компіляторів.


1
І на OSX (Sierra 10.2, принаймні), це симпосилання на кланг.
Джош Кодрофф

26

CC- змінна середовища, що посилається на компілятор C системи. На що він вказує (доступні бібліотеки тощо), залежить від платформи. Часто це вказує на /usr/bin/ccфактичного c complier (драйвера). На платформах Linux це CCмайже завжди вказує /usr/bin/gcc.

gccє бінарним драйвером для колекції компілятора GNU. Він може компілювати C, C ++ і, можливо, інші мови; він визначає мову за розширенням файлу.

g++є бінарним драйвером gcc, але з декількома спеціальними параметрами для компіляції C ++. Помітно (на мій досвід), g++за замовчуванням буде пов’язано libstdc ++, тоді як gccне буде.


1
Чи можете ви пояснити, що ви маєте на увазі під "бінарним драйвером"?
Edan Maor

5
Більшість компіляторів C, але конкретно GCC, мають ряд програм, які виконують компіляцію. Існує програма вищого рівня, яка називається "gcc", тобто драйвер компілятора; вона аналізує безліч варіантів командного рядка і оркеструє інші фази компілятора - аналізатор / аналізатор, оптимізатор, асемблер і лінкер, як правило (препроцесор зазвичай не є окремою фазою в ці дні, якщо ви не вимагаєте лише попередньої обробки). Це (драйвер компілятора) - це досить складна програма, хоча вона ніколи не торкається самого вихідного файлу C.
Джонатан Леффлер

3
CC також є компілятором Sun C ++ - а не змінною середовища.
Джонатан Леффлер

1
Компілятор C ++ SGI також є CC.
alex tingle

Ну, я припускаю, що Манагу думає, що ./configure+ makeможе взяти змінну середовища, іменовану CCдля впливу на використовуваний компілятор C, але в іншому випадку загальнозмінна змінна середовища за цим іменем не існує.
ефемія

6

Я хочу додати лише одну інформацію про те, що купіть в Linux. Він пов'язаний з gcc. Щоб перевірити це. введіть тут опис зображення

Аналогічно те саме, що і з 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++
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.