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.