Pros / Contras para quien? LLVM es claramente superior como back-end para compiladores, excepto si necesita una cantidad ridícula de arquitecturas compatibles. Pero supongo que estás hablando de usuarios finales.
Respuestas:
19
gcc es muy maduro, fácil de instalar (al menos para la mayoría de los sistemas) y es el compilador predeterminado para muchos sistemas, por lo que en muchos casos la gente lo tiene instalado casi sin darse cuenta. Se ha portado a un billón de arquitecturas, por lo que es mucho más probable que funcione de inmediato si tiene que apuntar a hardware oscuro.
Clang es mucho más nuevo. Con frecuencia produce mensajes de error mucho mejores, especialmente para las plantillas de C ++. En muchos casos, se ejecuta mucho más rápido. Está construido principalmente como un conjunto de bibliotecas, por lo que hay muchos otros proyectos (por ejemplo, analizadores de código) que usan el mismo front-end, entienden las mismas entradas, etc. El uso de llvm como back-end le brinda cierta flexibilidad adicional en cómo se genera código a partir de él.
Clang tiene informes de errores mucho mejores. Por ejemplo, si comete un error tipográfico en el nombre de una función que llama, Clang informará que es probable que sea un error tipográfico (y sugiera el nombre correcto), mientras que GCC se quejará de un nombre de función desconocido.
GCC generalmente produce un código más rápido si apunta a x86 / x86-64. Para ARM la situación es ambigua, a menudo Clang se optimiza mejor. Además, AFAIK Clang no admite la optimización del tamaño del código.
GCC usa muchas heurísticas. Esto es bueno para el rendimiento (en un caso típico), pero horrible si desea hacer una optimización a nivel de fuente (por ejemplo, desenrollar bucles). Incluso pequeños cambios en el código fuente pueden hacer que GCC genere una salida completamente diferente. Clang es más predecible, y generalmente genera el código que espera.
A diferencia de Jerry Coffin, encuentro que construir GCC desde la fuente es mucho más difícil que Clang. El procedimiento de la página de inicio de Clang siempre funcionó para mí. Un manual similar para GCC nunca funcionó en el primer intento. GCC depende de versiones particulares de GMP, MPFR, MPC, Parma Polyhedra Library y CLooG, y necesitaba varias iteraciones para encontrar las versiones que funcionarían para un lanzamiento particular de GCC (sí, usar las últimas versiones de esas bibliotecas no funciona )
Tengo la sensación de que Clang está mejor probado que GCC. Aunque solo utilizo versiones oficiales de GCC, a veces produjo código defectuoso. Para Clang, generalmente uso la versión troncal (de nuevo, porque es fácil de construir), pero nunca la vi generar resultados incorrectos.
GCC es casi estándar en el mundo de Linux, y agrega muchas características no estándar que se utilizan ampliamente en el software de Linux. Clang intenta ser compatible con GCC, pero a veces simplemente los ignora en silencio. Lo más importante, Clang no es compatible con OpenMP. Sin embargo, también tiene extensiones que no son compatibles con GCC, pero pueden ser útiles (por ejemplo, funciones intrínsecas add-with-carry __buildin_addc).
Si desea realizar una investigación del compilador, o simplemente tiene curiosidad acerca de cómo funciona, encontrará que el código fuente de Clang / LLVM es más accesible. El código Clang / LLVM es legible por humanos, no solo legible por el compilador.
(Se aplica el declarante AINAL) La licencia Clang / LLVM le da más libertad sobre lo que puede hacer con el código, por ejemplo, su uso en productos comerciales o de código cerrado. La licencia para las bibliotecas de tiempo de ejecución GCC agrega otra capa de restricciones, mientras que el tiempo de ejecución del compilador Clang (biblioteca compilador-rt) está bajo licencia MIT permisiva.
Resumen: compile con Clang cuando desarrolle el programa y con GCC para la compilación final (pero asegúrese de que sea más rápido y no se rompa). Quédese con Clang / LLVM si realiza una investigación de compilación.
Interesante, nunca supe que Clang tiene intrínseco add-with-carry. Pero debería ser __builtin_add, no __buildin_addc. De todos modos, Clang es lo suficientemente inteligente como para generar addccuando se encuentra con una amplia adición utilizando la comparación como carry
phuclv
Quiero decir __builtin_addcno__buildin_addc
phuclv
Las comparaciones de rendimiento aquí están desactualizadas. Según los puntos de referencia más recientes, el sonido metálico es más rápido que gcc en x86 / 64 en pruebas un poco más de la mitad (por ejemplo, openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Julio
3
Si tiene una nueva arquitectura de CPU o nuevas optimizaciones, y desea abrirlas en código bajo la GPL, puede contribuir con ellas a gcc. Sin embargo, gcc es menos modular, por lo que esto puede implicar más trabajo para agregar modificaciones / adiciones. Si desea contribuir con nuevas arquitecturas u optimizaciones a un proyecto de código abierto, pero bajo una licencia que no sea GPL, puede contribuir a LLVM / clang. Existen corporaciones cuyos departamentos legales solo permiten este último.
Respuestas:
gcc es muy maduro, fácil de instalar (al menos para la mayoría de los sistemas) y es el compilador predeterminado para muchos sistemas, por lo que en muchos casos la gente lo tiene instalado casi sin darse cuenta. Se ha portado a un billón de arquitecturas, por lo que es mucho más probable que funcione de inmediato si tiene que apuntar a hardware oscuro.
Clang es mucho más nuevo. Con frecuencia produce mensajes de error mucho mejores, especialmente para las plantillas de C ++. En muchos casos, se ejecuta mucho más rápido. Está construido principalmente como un conjunto de bibliotecas, por lo que hay muchos otros proyectos (por ejemplo, analizadores de código) que usan el mismo front-end, entienden las mismas entradas, etc. El uso de llvm como back-end le brinda cierta flexibilidad adicional en cómo se genera código a partir de él.
fuente
Clang tiene informes de errores mucho mejores. Por ejemplo, si comete un error tipográfico en el nombre de una función que llama, Clang informará que es probable que sea un error tipográfico (y sugiera el nombre correcto), mientras que GCC se quejará de un nombre de función desconocido.
GCC generalmente produce un código más rápido si apunta a x86 / x86-64. Para ARM la situación es ambigua, a menudo Clang se optimiza mejor. Además, AFAIK Clang no admite la optimización del tamaño del código.
GCC usa muchas heurísticas. Esto es bueno para el rendimiento (en un caso típico), pero horrible si desea hacer una optimización a nivel de fuente (por ejemplo, desenrollar bucles). Incluso pequeños cambios en el código fuente pueden hacer que GCC genere una salida completamente diferente. Clang es más predecible, y generalmente genera el código que espera.
A diferencia de Jerry Coffin, encuentro que construir GCC desde la fuente es mucho más difícil que Clang. El procedimiento de la página de inicio de Clang siempre funcionó para mí. Un manual similar para GCC nunca funcionó en el primer intento. GCC depende de versiones particulares de GMP, MPFR, MPC, Parma Polyhedra Library y CLooG, y necesitaba varias iteraciones para encontrar las versiones que funcionarían para un lanzamiento particular de GCC (sí, usar las últimas versiones de esas bibliotecas no funciona )
Tengo la sensación de que Clang está mejor probado que GCC. Aunque solo utilizo versiones oficiales de GCC, a veces produjo código defectuoso. Para Clang, generalmente uso la versión troncal (de nuevo, porque es fácil de construir), pero nunca la vi generar resultados incorrectos.
GCC es casi estándar en el mundo de Linux, y agrega muchas características no estándar que se utilizan ampliamente en el software de Linux. Clang intenta ser compatible con GCC, pero a veces simplemente los ignora en silencio. Lo más importante, Clang no es compatible con OpenMP. Sin embargo, también tiene extensiones que no son compatibles con GCC, pero pueden ser útiles (por ejemplo, funciones intrínsecas add-with-carry __buildin_addc).
Si desea realizar una investigación del compilador, o simplemente tiene curiosidad acerca de cómo funciona, encontrará que el código fuente de Clang / LLVM es más accesible. El código Clang / LLVM es legible por humanos, no solo legible por el compilador.
(Se aplica el declarante AINAL) La licencia Clang / LLVM le da más libertad sobre lo que puede hacer con el código, por ejemplo, su uso en productos comerciales o de código cerrado. La licencia para las bibliotecas de tiempo de ejecución GCC agrega otra capa de restricciones, mientras que el tiempo de ejecución del compilador Clang (biblioteca compilador-rt) está bajo licencia MIT permisiva.
Resumen: compile con Clang cuando desarrolle el programa y con GCC para la compilación final (pero asegúrese de que sea más rápido y no se rompa). Quédese con Clang / LLVM si realiza una investigación de compilación.
fuente
__builtin_add
, no__buildin_addc
. De todos modos, Clang es lo suficientemente inteligente como para generaraddc
cuando se encuentra con una amplia adición utilizando la comparación como carry__builtin_addc
no__buildin_addc
Si tiene una nueva arquitectura de CPU o nuevas optimizaciones, y desea abrirlas en código bajo la GPL, puede contribuir con ellas a gcc. Sin embargo, gcc es menos modular, por lo que esto puede implicar más trabajo para agregar modificaciones / adiciones. Si desea contribuir con nuevas arquitecturas u optimizaciones a un proyecto de código abierto, pero bajo una licencia que no sea GPL, puede contribuir a LLVM / clang. Existen corporaciones cuyos departamentos legales solo permiten este último.
fuente
Hoy (8/11/2011), GCC admite muchas más funciones de C ++ 0x que Clang. Si quieres esas características, es obvio; GCC es tu opción.
fuente