llvm - una - justo a tiempo ejemplos practicos pdf
¿Por qué llvm se considera inadecuado para implementar un JIT? (6)
¿Por qué LLVM no es adecuado para construir un JIT?
Escribí HLVM , una máquina virtual de alto nivel con un rico sistema de tipo estático que incluye tipos de valores, eliminación de llamadas de cola, impresión genérica, C FFI y subprocesos POSIX con soporte para compilación estática y JIT. En particular, HLVM ofrece un rendimiento increíble para una máquina virtual de alto nivel. Incluso implementé una interfaz interactiva similar a ML con tipos de variante y coincidencia de patrones usando el compilador JIT, como se ve en esta demostración de álgebra computacional . Todos mis trabajos combinados relacionados con HLVM solo alcanzan unas pocas semanas de trabajo (y no soy un científico informático, solo un aficionado).
Creo que los resultados hablan por sí mismos y demuestran inequívocamente que LLVM es perfectamente adecuado para la compilación de JIT.
Muchos lenguajes dinámicos implementan (o quieren implementar) un compilador JIT para acelerar sus tiempos de ejecución. Inevitablemente, alguien de la galería de maní pregunta por qué no usan LLVM. La respuesta es a menudo, "LLVM no es adecuado para construir un JIT". (Por ejemplo, el comentario de Armin Rigo here. )
¿Por qué LLVM no es adecuado para construir un JIT?
Nota: Sé que LLVM tiene su propio JIT. Si LLVM solía ser inadecuado, pero ahora es adecuado, indique qué cambió. No estoy hablando de ejecutar LLVM Bytecode en LLVM JIT, estoy hablando de usar las bibliotecas LLVM para implementar un JIT para un lenguaje dinámico.
Actualización: a partir del 7/2014, LLVM ha agregado una función llamada "Puntos de parche", que se utilizan para admitir caches en línea polimórficos en FTL JavaScript JIT de Safari. Esto cubre exactamente el caso de uso que se quejó sobre el comentario de Armin Rigo en la pregunta original.
Hay algunas notas sobre LLVM en la publicación de blog post-mortem de Unladen Swallow: http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html .
Desafortunadamente, LLVM en su estado actual está realmente diseñado como un optimizador de compilador estático y back-end. La generación y optimización de código LLVM es buena pero costosa. Todas las optimizaciones están diseñadas para trabajar en IR generado por lenguajes estáticos similares a C. La mayoría de las optimizaciones importantes para optimizar Python requieren un conocimiento de alto nivel de cómo el programa se ejecutó en iteraciones previas, y LLVM no nos ayudó a hacerlo.
Hay una presentation sobre el uso de LLVM como un JIT respaldado donde la dirección de muchas de las inquietudes planteadas sobre por qué es malo, la mayoría parece reducirse a que las personas construyan un compilador estático como JIT en lugar de construir un JIT real.
Lleva mucho tiempo iniciar es la mayor queja, sin embargo, esto no es tan problemático si hiciste lo que hace Java y comienzas en modo de intérprete, y utilizas LLVM para compilar las partes más utilizadas del programa.
Además, mientras hay argumentos como este dispersos por Internet, Mono ha estado utilizando LLVM como un compilador JIT con éxito desde hace un tiempo (aunque vale la pena señalar que se trata de su propio backend más rápido pero menos eficiente, y también modificaron partes de LLVM).
Para los lenguajes dinámicos, LLVM podría no ser la herramienta adecuada, solo porque fue diseñada para optimizar los lenguajes de programación del sistema como C y C ++ que están fuertemente / estáticamente tipados y admiten características de muy bajo nivel. En general, las optimizaciones realizadas en C realmente no hacen que los lenguajes dinámicos sean rápidos, porque solo está creando una forma eficiente de ejecutar un sistema lento. Los JIT de lenguaje dinámico moderno hacen cosas como incluir funciones que solo se conocen en el tiempo de ejecución u optimizar según el tipo de variable que la mayoría de las veces tiene, para lo que LLVM no está diseñado.
Para una queja más detallada sobre LLVM IR ver aquí: LLVM IR es un compilador IR .