2009-10-04 24 views
56

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

+0

Según lo indicado en mi respuesta, la respuesta a su pregunta depende de la plataforma, pero la plataforma no está especificada. –

+3

Pregunta relacionada: http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc/173007 –

Respuesta

82

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ífico de la plataforma) es la separación de 'gcc' y 'g ++':

  • gcc es el GNU C Compiler de la GCC (GNU Compiler Collection).
  • g ++ es el compilador GNU C++ del GCC.

La parte difícil, porque 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 de Sun C.
  • En Linux, si existe, CC es probablemente un enlace a g ++.
  • En Linux, cc es un enlace a gcc.

Sin embargo, incluso en Solaris, podría ser que cc es el viejo compilador de C basado en BSD de /usr/ucb. En la práctica, generalmente no está instalado y solo falla un trozo, lo que causa estragos en aquellos que intentan compilar e instalar software autoconfigurado.

En HP-UX, el 'cc' predeterminado sigue siendo un compilador de K K & R-only instalado para permitir el reenlazado del kernel cuando sea necesario e inutilizable para el software moderno porque no es compatible con el estándar C. tiene que usar nombres de compilador alternativos ('acc' IIRC). De forma similar, en AIX, el compilador del sistema C tiene 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 su camino al respecto requiriendo que los programas c89 (originalmente) y más tarde c99 existan; estos son los compiladores compatibles con los estándares 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 es entre los compiladores de C y los compiladores de C++. Los compiladores C++ aceptarán programas C++ y no compilarán programas C arbitrarios. (Aunque es posible escribir C en un subconjunto que C++ también entiende, muchos programas C no son programas C++ válidos). De forma similar, los compiladores C aceptarán programas C y rechazarán la mayoría de los programas C++ (porque la mayoría de los programas C++ usan construcciones no disponibles en C).

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

Tenga en cuenta que si está en Solaris, el código de objeto producido por CC no es compatible con el código de objeto producido por g ++; son dos compiladores separados con convenciones separadas para cosas como manejo de excepciones y creación de nombres (y el cambio de nombre es deliberadamente diferente para garantizar que los archivos de objetos 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 usar una biblioteca compilada con CC y otra compilada con g ++, no tiene suerte. Tienes que recompilar una de las bibliotecas al menos.

En términos de calidad de ensamblador generado, el 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 amplias que aún no se han replicado en GCC, creo. Pero cualquiera de estas pontificaciones es peligrosa, mientras que no sabemos qué plataforma le preocupa.

En términos de características del lenguaje, 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 idioma admitido por el compilador El antiguo soporte estándar C89 es esencialmente el mismo (y completo) para todos los compiladores de C. Hay diferencias en los rincones más oscuros del lenguaje. Debe 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 el GCC) para ajustar el comportamiento del compilador. El GCC tiene una variedad de extensiones que simplifican la vida si usted sabe que solo está apuntando a esa familia de compiladores.

20

CC es una variable de entorno que hace referencia al compilador de C del sistema. Lo que señala (bibliotecas accesibles, etc.) depende de la plataforma. A menudo señalará a /usr/bin/cc, el compilador c real (controlador). En plataformas Linux, CC casi siempre apunta a /usr/bin/gcc.

gcc es el controlador binario para la colección del compilador de GNU. Puede compilar C, C++ y posiblemente otros idiomas; determina el idioma por la extensión de archivo.

g++ es un controlador binario como gcc, pero con unas pocas opciones especiales establecidas para compilar C++. Notablemente (en mi experiencia), g++ enlazará libstdC++ por defecto, mientras que gcc no lo hará.

+1

¿Puedes explicar lo que quieres decir con "controlador binario"? –

+3

La mayoría de los compiladores C, pero específicamente GCC, tienen varios programas que hacen el trabajo de compilación. Hay un programa de nivel superior, llamado 'gcc', que es el controlador del compilador; analiza una miríada de opciones de línea de comandos y orquesta las otras fases del compilador, el analizador/analizador, el optimizador, el ensamblador y el enlazador, normalmente (el preprocesador no suele ser una fase separada en estos días, a menos que solicite solo preprocesamiento). Es (el controlador del compilador) es un programa bastante complejo, aunque nunca toca un archivo fuente en sí. –

+3

CC es también el compilador de Sun C++, y no una variable de entorno. –

Cuestiones relacionadas