2012-04-22 22 views
8

Para escribir un compilador, ¿cuáles son las ventajas y desventajas de utilizar LLVM IR contra C para un idioma de destino? Sé que ambos se usan, y me imagino que el código de la máquina final sería similar si tuviera que utilizar clang para compilar C. Entonces, ¿qué otras cosas hay que considerar?Idioma de salida del compilador - LLVM IR vs C

Respuesta

7

He utilizado LLVM IR para algunos extremos del compilador y he trabajado con compiladores que usan C como back-end. Una cosa que encontré que le dio al LLVM IR una ventaja es que está tipada. Es difícil hacer una salida completamente mal formada sin obtener errores de las bibliotecas LLVM.

También es más fácil mantener una estrecha correlación entre el código fuente y el IR para la depuración, en mi opinión.

Además, obtendrá todas las geniales herramientas de línea de comandos de LLVM para analizar y procesar el IR que emite su interfaz.

+1

¿Qué quiere decir IR está escrito? ¿No está tipado C también? – Dan

+3

Derecha, C está escrito. Pero no obtiene una indicación del error hasta que intente compilar el código C. Con LLVM IR obtienes una indicación del error cuando generas el IR. Mucho más fácil de depurar. –

0

Arquitecturas y sistemas operativos para los que no existe CLANG obviamente, o para los que está en estado experimental.

C es más ampliamente aceptado, pero LLVM IR le permite alimentar con cuchara el motor LLVM. No todos los caminos hacia IR son iguales.

1

dudo puede implementar soporte de depuración adecuado para su idioma cuando la orientación C.

+0

Esa fue exactamente la razón por la que he estado buscando este hilo. No veo forma de que haya "mapas de origen" en los símbolos de depuración, porque hay cambios incompatibles hacia atrás en los generadores de símbolos de depuración de los compiladores de C. Uno tendría que actualizar el software de asignación de símbolos de depuración con cada cambio de compiladores C admitidos. –

2

ventajas llvm:

  1. JIT - se puede compilar y ejecutar el código de forma dinámica. Claro que lo mismo es posible con C (por ejemplo, usando un tcc incrustado), pero es una opción mucho menos robusta y portátil.
  2. Puede ejecutar sus propias pasadas de optimización sobre el IR generado.
  3. Reflection de free - inspeccionar el código generado es mucho más fácil con LLVM.
  4. La biblioteca LLVM no es tan grande como la mayoría de los compiladores de C (sin contar tcc, por supuesto).

inconvenientes llvm:

  1. Código no es portátil, usted tiene que cambiar ligeramente dependiendo de su objetivo. Existe un subconjunto algo portátil de LLVM, pero sigue siendo una práctica poco fiable.
  2. La dependencia del tiempo de ejecución en las bibliotecas C++ puede ser un problema.
+0

se le olvidó: si quiere C interoperabilidad (¿qué idioma no?) Usted mismo tiene que codificar todos esos C ABI desagradables porque llvm no hace eso por sí mismo (divide ese trabajo 50/50 con clang) – cap

Cuestiones relacionadas