¿Diferencia entre CC, gcc y g ++?

104

¿Cuál es la diferencia entre los 3 compiladores CC, gcc, g ++ al compilar código C y C ++ en términos de generación de código ensamblador, bibliotecas disponibles, características del lenguaje, etc.?

vehomzzz
fuente
1
Como se indica en mi respuesta, la respuesta a su pregunta depende de la plataforma, pero la plataforma no está especificada.
Jonathan Leffler
3
Pregunta relacionada: stackoverflow.com/questions/172587/…
Martin York

Respuestas:

122

La respuesta a esto es específica de la plataforma; lo que sucede en Linux es diferente de lo que sucede en Solaris, por ejemplo.

La parte fácil (porque no es específica de la plataforma) es la separación de 'gcc' y 'g ++':

  • gcc es el compilador GNU C de GCC (Colección de compiladores GNU).
  • g ++ es el compilador GNU C ++ de GCC.

La parte difícil, debido a que es específica de la plataforma, es el significado de 'CC' (y 'cc').

  • En Solaris, CC es normalmente el nombre del compilador Sun C ++.
  • En Solaris, cc es normalmente el nombre del compilador Sun C.
  • En Linux, si existe, CC probablemente sea un enlace a g ++.
  • En Linux, cc es un enlace a gcc.

Sin embargo, incluso en Solaris, podría ser que cc sea el antiguo compilador de C basado en BSD de /usr/ucb . En la práctica, eso generalmente no se instala y solo hay un código auxiliar que falla, causando estragos en aquellos que intentan compilar e instalar software de autoconfiguración.

En HP-UX, el 'cc' predeterminado sigue siendo un compilador de C solo para K & R instalado para permitir la vinculación del kernel cuando sea necesario, y no se puede utilizar para el trabajo de software moderno porque no es compatible con el estándar C. Debe usar nombres de compiladores alternativos ('acc' IIRC). De manera similar, en AIX, el compilador del sistema C se conoce con nombres como 'xlc' o 'xlc32'.

Clásicamente, el compilador del sistema predeterminado se llamaba 'cc' y el software de autoconfiguración recurre a ese nombre cuando no sabe qué más usar.

POSIX intentó legislar para evitar esto exigiendo que existieran los programas c89 (originalmente) y posteriormente c99; Estos son los compiladores compatibles con las normas ISO / IEC 9899: 1989 y 9899: 1999 C. Es dudoso que POSIX haya tenido éxito.


La pregunta se refiere a las diferencias en términos de características y bibliotecas. Como antes, la respuesta es específica de la plataforma en parte y genérica en parte.

La gran brecha está entre los compiladores de C y los compiladores de C ++. Los compiladores de C ++ aceptarán programas C ++ y no compilarán programas C arbitrarios. (Aunque es posible escribir C en un subconjunto que también es comprendido por C ++, muchos programas C no son programas C ++ válidos). De manera similar, los compiladores de C aceptarán programas de C y rechazarán la mayoría de los programas de C ++ (porque la mayoría de los programas de C ++ usan construcciones que no están disponibles en C).

El conjunto de bibliotecas disponibles para su uso depende del idioma. Los programas C ++ normalmente pueden utilizar bibliotecas C en una plataforma determinada; Los programas C normalmente no pueden usar bibliotecas C ++. Entonces, C ++ tiene un conjunto más grande de bibliotecas disponibles.

Tenga en cuenta que si está en Solaris, el código objeto producido por CC no es compatible con el código objeto producido por g ++; son dos compiladores separados con convenciones separadas para cosas como manejo de excepciones y alteración de nombres (y la alteración de nombres es deliberadamente diferente para garantizar que los archivos objeto incompatibles no estén vinculados entre sí) Esto significa que si desea utilizar una biblioteca compilada con CC, debe compilar todo su programa con CC. También significa que si desea utilizar una biblioteca compilada con CC y otra compilada con g ++, no tiene suerte. Tienes que recompilar al menos una de las bibliotecas.

En términos de calidad del ensamblador generado, GCC (GNU Compiler Collection) hace un muy buen trabajo. Pero a veces los compiladores nativos funcionan un poco mejor. Los compiladores de Intel tienen optimizaciones más extensas que aún no se han replicado en GCC, creo. Pero tales pontificaciones son peligrosas mientras no sepamos de qué plataforma está interesado.

En términos de características del lenguaje, todos los compiladores generalmente se acercan bastante a los estándares actuales (C ++ 98, C ++ 2003, C99), pero generalmente existen pequeñas diferencias entre el lenguaje estándar y el lenguaje soportado por el compilador. El soporte estándar de C89 más antiguo es esencialmente el mismo (y completo) para todos los compiladores de C. Hay diferencias en los rincones más oscuros del idioma. Necesita comprender 'comportamiento indefinido', 'comportamiento definido por el sistema' y 'comportamiento no especificado'; si invoca un comportamiento indefinido, obtendrá diferentes resultados en diferentes momentos. También hay muchas opciones (especialmente con GCC) para modificar el comportamiento del compilador. GCC tiene una variedad de extensiones que simplifican la vida si sabe que solo está apuntando a esa familia de compiladores.

Jonathan Leffler
fuente
1
Y en OSX (Sierra 10.2 al menos), es un enlace simbólico para hacer ruido.
Josh Kodroff
26

CCes una variable de entorno que se refiere al compilador C del sistema. Lo que apunta (bibliotecas accesibles, etc.) depende de la plataforma. A menudo apuntará al /usr/bin/cccompilador c real (controlador). En plataformas Linux, CCcasi siempre apunta a /usr/bin/gcc.

gcces el controlador binario de la colección de compiladores GNU. Puede compilar C, C ++ y posiblemente otros lenguajes; determina el idioma por la extensión del archivo.

g++es un controlador binario como gcc, pero con algunas opciones especiales establecidas para compilar C ++. En particular (en mi experiencia), g++vinculará libstdc ++ de forma predeterminada, mientras gccque no lo hará.

Managu
fuente
1
¿Puede explicar qué quiere decir con "controlador binario"?
Edan Maor
5
La mayoría de los compiladores de C, pero GCC específicamente, tienen varios programas que hacen el trabajo de compilación. Existe un programa de nivel superior, llamado 'gcc', que es el controlador del compilador; analiza una miríada de opciones de la línea de comandos y organiza las otras fases del compilador: el analizador / analizador, el optimizador, el ensamblador y el enlazador, por lo general (el preprocesador no suele ser una fase separada en estos días, a menos que solicite solo preprocesamiento). Es (el controlador del compilador) un programa bastante complejo, aunque nunca toca un archivo fuente de C en sí.
Jonathan Leffler
3
CC es también el compilador Sun C ++, y no una variable de entorno.
Jonathan Leffler
1
El compilador C ++ de SGI también es CC.
alex tingle
Bueno, supongo que Managu está pensando que ./configure+ makepuede tomar una variable de entorno nombrada CCpara afectar el compilador de C utilizado, pero de lo contrario, generalmente no hay una variable de entorno con ese nombre.
ephemient
5

Quiero agregar solo una información sobre lo que cc en Linux. Está vinculado con gcc. Para comprobarlo. ingrese la descripción de la imagen aquí

Del mismo modo, lo mismo con 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++
Uddhav Gautam
fuente