¿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.?
¿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.?
Respuestas:
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 ++':
La parte difícil, debido a que es específica de la plataforma, es el significado de 'CC' (y 'cc').
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.
CC
es 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/cc
compilador c real (controlador). En plataformas Linux, CC
casi siempre apunta a /usr/bin/gcc
.
gcc
es 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 gcc
que no lo hará.
./configure
+ make
puede tomar una variable de entorno nombrada CC
para afectar el compilador de C utilizado, pero de lo contrario, generalmente no hay una variable de entorno con ese nombre.
Quiero agregar solo una información sobre lo que cc en Linux. Está vinculado con gcc. Para comprobarlo.
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++