Чим відрізняються 3 компілятори CC, gcc, g ++ при компілюванні коду C і C ++ з точки зору генерації коду асемблери, наявних бібліотек, мовних особливостей тощо?
Чим відрізняються 3 компілятори CC, gcc, g ++ при компілюванні коду C і C ++ з точки зору генерації коду асемблери, наявних бібліотек, мовних особливостей тощо?
Відповіді:
Відповідь на це - конкретна платформа; те, що відбувається на Linux, відрізняється від, наприклад, Solaris.
Найпростіша частина (оскільки вона не залежить від платформи) - це розділення 'gcc' та 'g ++':
Важкою частиною, оскільки вона є специфічною для платформи, є значення "CC" (і "cc").
Однак, навіть на 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 має різноманітні розширення, які полегшують життя, якщо ви знаєте, що націлені лише на цю сім'ю компіляторів.
CC
- змінна середовища, що посилається на компілятор C системи. На що він вказує (доступні бібліотеки тощо), залежить від платформи. Часто це вказує на /usr/bin/cc
фактичного c complier (драйвера). На платформах Linux це CC
майже завжди вказує /usr/bin/gcc
.
gcc
є бінарним драйвером для колекції компілятора GNU. Він може компілювати C, C ++ і, можливо, інші мови; він визначає мову за розширенням файлу.
g++
є бінарним драйвером gcc
, але з декількома спеціальними параметрами для компіляції C ++. Помітно (на мій досвід), g++
за замовчуванням буде пов’язано libstdc ++, тоді як gcc
не буде.
./configure
+ make
може взяти змінну середовища, іменовану CC
для впливу на використовуваний компілятор C, але в іншому випадку загальнозмінна змінна середовища за цим іменем не існує.
Я хочу додати лише одну інформацію про те, що купіть в 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++