В чем разница между 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. Вы должны использовать альтернативные имена компиляторов. ('согласно' IIRC). Точно так же в AIX системный компилятор C имеет такие имена, как «xlc» или «xlc32».
Традиционно системный компилятор по умолчанию назывался cc, и самоконфигурируемое программное обеспечение прибегает к этому имени, когда не знает, что еще использовать.
POSIX попытался законодательно обойти это, потребовав наличия программ c89 (изначально) и более поздних c99; это компиляторы, совместимые со стандартами C. ISO / IEC 9899: 1989 и 9899: 1999. Сомнительно, что POSIX удалось.
Вопрос касается различий в функциях и библиотеках. Как и прежде, ответ частично зависит от платформы, а отчасти - от общего.
Большой разрыв наблюдается между компиляторами C и компиляторами C ++. Компиляторы C ++ принимают программы на C ++ и не компилируют произвольные программы на C. (Хотя можно написать C в подмножестве, которое также понимается C ++, многие программы C не являются допустимыми программами C ++). Точно так же компиляторы C будут принимать программы C и отклонять большинство программ C ++ (потому что большинство программ C ++ используют конструкции, недоступные в C).
Набор доступных для использования библиотек зависит от языка. Программы C ++ обычно могут использовать библиотеки C на данной платформе; Программы на C обычно не могут использовать библиотеки C ++. Итак, C ++ имеет больший набор доступных библиотек.
Обратите внимание, что если вы работаете в Solaris, объектный код, созданный CC, несовместим с объектным кодом, созданным g ++ - это два отдельных компилятора с отдельными соглашениями для таких вещей, как обработка исключений и изменение имени (и изменение имени намеренно разные, чтобы несовместимые объектные файлы не были связаны вместе!). Это означает, что если вы хотите использовать библиотеку, скомпилированную с CC, вы должны скомпилировать всю свою программу с CC. Это также означает, что если вы хотите использовать одну библиотеку, скомпилированную с помощью CC, а другую - с помощью g ++, вам не повезло. Вам нужно перекомпилировать хотя бы одну из библиотек.
С точки зрения качества созданного ассемблера GCC (GNU Compiler Collection) делает очень хорошую работу. Но иногда нативные компиляторы работают немного лучше. Я считаю, что компиляторы Intel имеют более обширные оптимизации, которые еще не были воспроизведены в GCC. Но любые подобные рассуждения опасны, пока мы не знаем, какая платформа вас интересует.
Что касается языковых функций, все компиляторы обычно довольно близки к текущим стандартам (C ++ 98, C ++ 2003, C99), но обычно есть небольшие различия между стандартным языком и языком, поддерживаемым компилятором. Поддержка более старого стандарта C89 практически одинакова (и полностью) для всех компиляторов C. Есть различия в темных углах языка. Вам необходимо понимать «неопределенное поведение», «поведение, определяемое системой» и «неопределенное поведение»; если вы вызовете неопределенное поведение, вы получите разные результаты в разное время. Есть также много опций (особенно с GCC) для настройки поведения компилятора. GCC имеет множество расширений, которые упрощают жизнь, если вы знаете, что ориентируетесь только на это семейство компиляторов.
CC
- переменная среды, относящаяся к системному компилятору C. На что он указывает (доступные библиотеки и т. Д.), Зависит от платформы. Часто он будет указывать /usr/bin/cc
на настоящего c-компилятора (драйвера). На платформах Linux CC
почти всегда указывает на /usr/bin/gcc
.
gcc
бинарный драйвер для коллекции компилятора GNU. Он может компилировать C, C ++ и, возможно, другие языки; он определяет язык по расширению файла.
g++
представляет собой двоичный файл драйвера gcc
, но с несколькими специальными параметрами, установленными для компиляции C ++. Примечательно (по моему опыту), g++
по умолчанию будет связывать libstdc ++, а gcc
не нет.
./configure
+ make
может принимать переменную среды с именем, CC
чтобы влиять на используемый компилятор C, но в остальном обычно нет переменной среды с таким именем.
Я хочу добавить только одну информацию, что такое cc в 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++