2011-02-03 18 views
38

He hecho una buena cantidad de programación en C/C++ antes, pero hoy en día solo representa un pequeño porcentaje de la programación que hago (los lenguajes de scripting son mucho más adecuados para una gran parte del trabajo que hago). Trabajé en algunos proyectos de programación C en los últimos días y me sorprendió la cantidad de pequeños detalles sintácticos que olvidé. Lo que es peor es que cc/gcc suelen tener mensajes de error crípticos o no informativos sobre estos problemas (lo siento, no puedo recordar ningún ejemplo específico).¿Por qué no se usa clang más?

Me enteré del compilador clang no hace mucho tiempo y decidí probarlo. Los mensajes de error fueron mucho más claros y me ayudaron a identificar y solucionar los problemas en mi sintaxis. Mi pregunta es por qué esta herramienta no se usa/menciona más de lo que es? ¿Es tan nuevo en comparación con los sospechosos habituales (cc/gcc) o es que no admite las características que admiten o es más difícil de obtener? Me cuesta mucho creer que el último, ya que se instaló con las herramientas de desarrollo en mi iMac y requirió un solo comando (sudo apt-get install clang) para instalarlo en mi buzón de Ubuntu.

+1

Es mejor que espere a XCode4 y verá el uso del clang. cohete. – ismail

+0

Una nota: CLang es la producción madura para C, sin embargo, el soporte de C++ sigue siendo un progreso continuo, C++ 03 normalmente es bueno, pero C++ 0x se está quedando atrás de wrt VC++ y gcc. Sin embargo, se está desarrollando activamente. –

+1

Solía ​​programar C en GCC, porque, bueno, este * es * el compilador, creo que tengo que mirar un poco fuera de la caja, me gusta mucho la expresividad de las quejas del compilador, +1 por la introducción de este compilador. –

Respuesta

34

Mi pregunta es por qué esta herramienta no se usa/menciona más de lo que es?

Probablemente se deba a la historia y porque, en general, nos comportamos los humanos.

Tradicionalmente gcc ha sido el único compilador real (gratuito) que se puede usar prácticamente para compilar programas C en al menos todos los clones de * nix gratis. Es lo que prácticamente todo el sistema base y kernel de Linux, * BSD, ahora probablemente OSX, y otros están compilados.

Si bien los defectos están aquí y allá, básicamente esto significa: gcc works. Y si no está roto, no lo arregles. Fuera de esto, ahora tienes una gran base de usuarios, es fácil obtener ayuda con gcc, hay muchas personas que han usado gcc, que están trabajando en gcc, etc.

Generalmente, si quieres cambiar un gran comunidad de algo a lo que están acostumbrados, a algo más, que "otra cosa" tiene que ser "significativamente" mejor. Simplemente "mejor" a menudo no es razón suficiente.Creo que puedes encontrar ejemplos de esto en muchas áreas de la sociedad.

clang es más nuevo, algunas personas solo sospecharán si está a la altura de la tarea, si tiene errores, si produce un código más lento, etc. - parece ser de naturaleza humana sospechar - las cosas nuevas atemorizan . Muchos ni siquiera saben sobre clang, a muchos no les importa porque están contentos con gcc.

Sin embargo, si usted prefiere utilizar clang, vaya para ello - los mensajes de error son de hecho "mejor" y más fácil de entender vs gcc.

6

Mi pregunta es por qué esta herramienta no se usa/menciona más de lo que es? Es que es tan nuevo en comparación con los sospechosos habituales ...

Este es exactamente el motivo. Todavía es nuevo y la funcionalidad principal aún se está desarrollando activamente. Recuerde que los proyectos existentes pueden estar haciendo uso de características específicas del compilador, o utilizando bibliotecas que sí lo tienen, y los desarrolladores, en cualquier caso, son reacios a cambiar las herramientas de trabajo para las experimentales que pueden tener errores inesperados o rendimiento/tamaño/etc desconocidos. compensaciones, incluso cuando las nuevas herramientas mejoran cada día más.

+0

Tenga en cuenta también que el soporte C++ solo se ha completado MUY recientemente, y aún puede haber errores al acecho. Y los símbolos de depuración todavía necesitan trabajo también (he escuchado rumores acerca de que la salida del símbolo de depuración es 5 veces más grande que la de GCC ...) – bdonlan

+1

@bdonlan, el problema del tamaño del símbolo de depuración solo está en Linux por cierto. – ismail

+0

@bdonlan: Intenté decir eso con 'experimental', pero debe ser enfatizado. Gracias. –

7

LLVM ha existido por un tiempo, pero - al menos en mi zona de bosque - ha alcanzado recientemente prominencia recientemente, posiblemente debido al hecho de que Apple ha estado presionando fuertemente últimamente para reemplazar gcc con Clang en su propia cadena de herramientas.

Además, creo que la compatibilidad con C++ se ha convertido recientemente en calidad de producción. EDITAR: Parece que aún no es eso. (Consulte los comentarios a continuación.)

Otro factor podría ser que LLVM está ampliamente respaldado por un solo proveedor, hacia el cual los desarrolladores que no son de Apple tienen una desconfianza innata.

+3

No es grado de producción, solo característica completa (C++ 03). P.ej. no puede compilar Qt correctamente AFAIK (compila, pero las pruebas unitarias muestran regresiones). –

+0

@ Tamás: gracias por el comentario. He modificado mi respuesta. –

+5

+1, ¡y agregaría un segundo solo para la última observación! * respaldado por un único proveedor, hacia el cual los desarrolladores que no son de Apple tienen una desconfianza innata. * –

9

La parte delantera del clang es relativamente nueva. Por ejemplo, el 2.8 release en octubre de 2010 marca la finalización del soporte de C++ 98/03.

Parece probable que con el aumento de la madurez, habrá una adopción cada vez mayor. Por ejemplo, hay un trabajo continuo para hacer que el sistema operativo FreeBSD (y otros sistemas operativos BSD) se construya con clang, eliminando la dependencia de GCC/G ++.

Apple están presionando la combinación LLVM/clang. Parece probable que dejarán de respaldar su antigua rama de herramientas de GCC (basado en 4.2) y pasarán a depender únicamente de las herramientas clang para el desarrollo de OSX/iOS.

Clang también está viendo creciente adopción en los compiladores personalizados para idiomas como C (por ejemplo, los compiladores de lenguaje de sombreado para OpenCL)

3

Como programador estudiante se me hace un regalo del cielo totales, principalmente debido a su mensajes de error útiles y comprensibles. Lo uso principalmente para programar en C, aunque estoy empezando a ramificarme en C++ también usando Clang.

En cuanto a por qué no se menciona más, sospecho que es porque GCC se ha establecido durante tanto tiempo, para la mayoría de los usuarios es EL compilador. GCC para mí funciona bien, excepto por sus mensajes de error extremadamente crípticos que, como estudiante, me desaniman bastante.

En general, recomiendo Clang para que lo usen estudiantes y desarrolladores. Dado que ahora es el compilador oficial de Apple y Xcode, sospecho que su uso y reconocimiento de nombre se recuperarán rápidamente. FreeBSD parece haberlo adoptado también como compilador principal, aunque sospecho que tendrá menos impacto en su popularidad que su adopción por parte de Apple.

Adición: Debido a la competencia de Clang, la claridad de los mensajes de error en GCC 4.8 y 4.9 ha mostrado una mejora significativa; aunque todavía encuentro a Clang un poco más lúcido, la brecha se ha reducido significativamente.

2

Hoy en día, clang está reemplazando a gcc en la mayoría de los places. es decir, la mayoría del * sistema operativo tipo NIX y las distribuciones de Linux. Algunos ejemplos son FreeBSD, Minix y Mac (un poco obvio) clang que cambió clang como compilador por defecto. Algunos de mis amigos también, cuando los mostré.

Este en mi humilde opinión, parece que algunas personas tuvieron problemas con él, probablemente en versiones anteriores. Pero con la versión 3.0 de clang, no tengo ninguno de estos problemas. Como mencioné antes, lo estoy usando realmente en todos mis nuevos proyectos. Casi mi compilador predeterminado, a veces hago make C=gcc para ver cómo la diferencia de clang error/advertencia. Y ganar clang alguna vez. Con mejores explicaciones y hacer un gran esfuerzo para la optimización. Incluye sugerencias para extensiones de uso (algunas son gcc inerhid) del compilador a un mejor rendimiento en la generación de código.

Escribí una función trivial que imprime un mensaje de error. Pero me gustaría salir del programa después de haber impreso el mensaje de error en la salida estándar.Entonces, hago una modificación simple, pongo un exit(1) como última declaración en la función. Como el siguiente:

void error(const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    fprintf(stderr, "error: "); 
    vfprintf(stderr, fmt, ap); 
    va_end(ap); 
    exit(1); 
} 

Y lo que el espectáculo sonido metálico

advertencia: la función 'error' podría ser declarado con el atributo 'NoReturn' [-Wmissing-NoReturn] `

(gcc no lo produce ni siquiera con -Wall -Wextra -Wunreachable-code -O3 flags)

Digo "eso parece agradable. Pero, ¿qué es el atributo 'nonreturn'? Nunca escucho o leo sobre esto. Salto a google y busco clang could be declared with attribute 'noreturn' (ah, sí, podría escribir clang nonreturn attribute, pero lo olvido) y encontré this enlace con una buena explicación de lo que es este atributo y la posible ganancia de rendimiento que pude obtener.

Así que corro para agregar este atributo a mi prototipo de función (por supuesto, si es el compilador gcc o clang; las macros harán la detección de truco). Oh, sí, para mí, cualquier pequeña ganancia de rendimiento (por supuesto, sin hacer que el código sea ilegible) es una victoria.

Y no termina aquí, hace un año, hago return en una función donde, evidentemente, es un interruptor como el manejo predeterminado definido (como en la función error() aquí). Pero aun así, gcc clains acerca de la función sin valor de retorno (lo siento, no recuerdo exactamente el mensaje de error/advertencia) ¿cómo es posible? no hay más declaraciones después del cambio, si no hay coincidencia de caso, se ejecuta el valor predeterminado y realmente no importa las declaraciones a continuación, si las hay. Pero creo que es diferente, como yo, y dar una advertencia sobre esta declaración, ayudándome a crear un mejor código.

Y para este tipo de cosas muy pequeñas, me encanta el clang. (Nota: lo siento por mi inglés malo. El inglés no es mi idioma materno, pero a pesar de eso estoy tratando de expresarme aquí)

+2

De todas las áreas de un programa que necesitan "optimización", me imagino que el rendimiento de salir de la aplicación es de menor importancia. –

+0

La optimización aquí es 1) por el compilador cuando se ve el atributo "nonreturn"; 2) por mí cuando elimino el código muerto '-Wunreachable-code' – Jack

Cuestiones relacionadas