LLVM vs clang en OS X

133

Tengo una pregunta sobre llvm, clang y gcc en OS X.

¿Cuál es la diferencia entre llvm-gcc 4.2, llvm 2.0 y clang? Sé que todos se basan en llvm, pero ¿en qué se diferencian?

Además de una compilación más rápida, ¿cuál es la ventaja de llvm sobre gcc?

dominik
fuente
9
llvm es solo un backend, no puede haber un compilador de llvm independiente ... solo hay diferentes interfaces para él, como gcc y clang.
smerlin
44
@smerlin: "compilador llvm" es el nombre comercial de Apple para clang + llvm: developer.apple.com/technologies/tools/…
Stephen Canon
Otros detalles aquí: stackoverflow.com/a/26724886/1938163
Marco A.

Respuestas:

201

LLVM originalmente significaba "máquina virtual de bajo nivel", aunque ahora solo se destaca a sí misma ya que se ha convertido en algo más que una máquina virtual tradicional. Es un conjunto de bibliotecas y herramientas, así como una representación intermedia estandarizada, que se puede utilizar para ayudar a construir compiladores y compiladores justo a tiempo. No puede compilar nada más que su propia representación intermedia por sí sola; necesita una interfaz específica de idioma para hacerlo. Si las personas solo se refieren a LLVM, probablemente se refieran solo a la biblioteca y las herramientas de bajo nivel. Algunas personas pueden referirse a Clang o llvm-gcc incorrectamente como "LLVM", lo que puede causar cierta confusión.

llvm-gcc es una versión modificada de GCC, que utiliza LLVM como su back-end en lugar del propio GCC. Ahora está en desuso, a favor de DragonEgg, que utiliza el nuevo sistema de complementos de GCC para hacer lo mismo sin bifurcar GCC.

Clang es un compilador completamente nuevo de C / C ++ / Objective-C, que utiliza su propio frontend y LLVM como back-end. Las ventajas que ofrece son mejores mensajes de error, un tiempo de compilación más rápido y una forma más fácil de que otras herramientas se conecten al proceso de compilación (como el depurador LLDB y el analizador estático Clang ). También es razonablemente modular, por lo que puede usarse como una biblioteca para otro software que necesita analizar código C, C ++ u Objective-C.

Cada uno de estos enfoques (GCC simple, GCC + LLVM y Clang) tiene sus ventajas y desventajas. Los últimos conjuntos de puntos de referencia que he visto mostraron que GCC produce código ligeramente más rápido en la mayoría de los casos de prueba (aunque LLVM tuvo una ligera ventaja en algunos), mientras que LLVM y Clang dieron tiempos de compilación significativamente mejores. GCC y los combos GCC / LLVM tienen la ventaja de que se ha probado mucho más código y funciona en el sabor GCC de C; hay algunas extensiones específicas del compilador que solo tiene GCC, y algunos lugares donde el estándar permite que la implementación varíe pero el código depende de una implementación en particular. Si obtiene una gran cantidad de código C heredado, es mucho más probable que funcione en GCC que en Clang, aunque esto mejora con el tiempo.

Brian Campbell
fuente
13
Para agregar a esta maravillosa respuesta: clang también es un conjunto de bibliotecas (llamado libclang) que puede usar para cosas como análisis de código, autocompletado, resaltado de sintaxis, etc. Esto es muy útil para IDEs.
55
Al compilar para MacOS X o iOS, tenga en cuenta que Clang es el software que Apple usa para construir todo su software MacOS X e iOS, incluido el sistema operativo, y que Clang es lo que obtiene automáticamente, sin esfuerzo, y lo que todo el mundo alguna vez hubiera pedir ayuda está utilizando. Apple nunca ha admitido gcc pasado gcc 4.2, y ya no envía ninguna versión de gcc.
gnasher729
1
@ gnasher729 Sí, esta respuesta se escribió hace 3 años, cuando Apple todavía enviaba llvm-gcc y Clang, con llvm-gcc como compilador predeterminado. Los tiempos han cambiado desde entonces.
Brian Campbell
54

Hay 2 cosas diferentes aquí.

LLVM es un compilador de back-end destinado a construir compiladores sobre él. Se trata de optimizaciones y producción de código adaptado a la arquitectura de destino.

CLang es un front-end que analiza el código C, C ++ y Objective C y lo traduce en una representación adecuada para LLVM.

llvm gcc era una versión inicial de un compilador C ++ basado en llvm basado en gcc 4.2, que ahora está en desuso ya que CLang puede analizar todo lo que podría analizar, y más.

Finalmente, la principal diferencia entre CLang y gcc no radica en el código producido sino en el enfoque. Si bien gcc es monolítico, CLang se ha creado como un conjunto de bibliotecas. Este diseño modular permite grandes oportunidades de reutilización para IDE o herramientas de finalización, por ejemplo.

Por el momento, el código producido por gcc 4.6 es generalmente un poco más rápido, pero CLang está cerrando la brecha.

Matthieu M.
fuente
5

llvm-gcc-4.2 usa el front-end GCC para analizar su código, luego genera la salida compilada usando LLVM.

El "llvm compiler 2.0" usa el front-end clang para analizar su código y genera la salida compilada usando LLVM. "clang" es en realidad solo el nombre de este front-end, pero a menudo se usa casualmente como un nombre para el compilador en su conjunto.

Stephen Canon
fuente