meaning installed for c++ c compiler-construction clang

c++ - installed - ¿Por qué el clang no se usa más?



install clang windows 10 (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 ...

Esta es exactamente la razón. 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.

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 solía tener mensajes de error crípticos o no informativos sobre estos problemas (lo siento, no recuerdo ningún ejemplo específico).

Aprendí sobre el compilador de clang no hace mucho tiempo y decidí probar eso. 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.


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

Probablemente sea por la historia y porque, en general, los humanos nos comportamos.

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 funciona . 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 mucha gente que ha usado gcc, que está trabajando en gcc, etc.

En general, si quieres cambiar una gran comunidad de algo a lo que están acostumbrados, a otra cosa, esa "otra cosa" tiene que ser "significativamente" mejor. Simplemente "mejor" a menudo no es motivo 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 sospechoso en la naturaleza humana - las cosas nuevas dan miedo. Muchos ni siquiera saben sobre clang, a muchos no les importa porque están contentos con gcc.

Sin embargo, si prefieres usar clang, hazlo - los mensajes de error son de hecho "mejores" y más fáciles de entender contra gcc.


Como programador estudiantil, me parece una bendición total, principalmente debido a sus 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.


El frente de clang es relativamente nuevo. Por ejemplo, la versión 2.8 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 creciente adopción. 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á 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 una creciente adopción en compiladores personalizados para lenguajes tipo C (por ejemplo, compiladores de lenguaje shader para OpenCL)


Hoy, 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é.

En mi humilde opinión, parece que algunos pueblos 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 solo para ver cómo la diferencia a 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.

Había escrito una función trivial que imprimía 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 una exit(1) como última declaración en la función. Como el seguiente:

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 así el show clang

advertencia: la función ''error'' podría declararse con el atributo ''noreturn'' [-Wmissing-noreturn] `

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

Digo "parece agradable. Pero, ¿qué es el atributo ''no retorno''? Nunca escucharía o leería sobre esto. Salto a google y la búsqueda de clang could be declared with attribute ''noreturn'' (oh, sí, podría simplemente escribió el clang nonreturn attribute , pero lo olvidé) y encontré this enlace con una buena explicación de lo que este atributo y la posible ganancia de rendimiento pude obtener.

Entonces 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 un return en una función donde, evidentemente, se trata de un cambio definido como manejo predeterminado (como en la función de 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 nativo, pero a pesar de eso estoy tratando de expresarme aquí)


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

Además, creo que su soporte C ++ se ha convertido recientemente en grado de producción. EDITAR: Parece que aún no es eso. (Ver comentarios a continuación)

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