Pregunta

¿Cuáles son las diferencias entre un LLVM y un compilador normal?
¿Es más dinámico y, por lo tanto, puede usarse para compilar lenguajes normalmente muy dinámicos (es decir, Javascript) en código binario estático? ¿Cuáles son los principios detrás de crear uno?
Conozco el Libro del Dragón para compiladores, pero ¿existe tal cosa para un LLVM?

EDITAR: He encontrado este proyecto interesante.

¿Fue útil?

Solución

Hay un par de diferencias entre LLVM y "un compilador normal", que supongo que significa "gcc":

  • LLVM está diseñado para el análisis de todo el programa (también conocido como análisis de tiempo de enlace), por lo que, opcionalmente, puede compilar código en '' código de bits '', un formato que puede volver a analizar más tarde.
  • LLVM proporciona un compilador justo a tiempo (JIT) para que pueda volver a analizar los programas mientras se ejecutan, tal como lo hace JVM.
  • LLVM está muy bien diseñado:
    • sus componentes son modulares y bien separados,
    • tiene 3 formatos para su representación intermedia (textual, binaria y una representación en memoria), que son equivalentes,
    • su representación intermedia utiliza el formulario SSA,
    • su representación intermedia tiene un sistema de tipos.

En cuanto a Javascript y otros lenguajes dinámicos, estamos viendo mucho interés en LLVM de la comunidad de lenguaje dinámico, con las implementaciones de Python y Ruby probándolo. Sin embargo, estos no intentan ser compiladores estáticos. Están enfocados en usar el JIT. En particular, están optimizando ejecutables de larga ejecución utilizando un "intérprete de modo mixto", donde inicialmente interpretan los programas y luego los compilan utilizando LLVM en tiempo de ejecución. No he visto un motor javascript usando LLVM, pero probablemente haya uno. Simplemente no creará ejecutables estáticos, excepto en circunstancias inusuales, o para versiones reducidas de Javascript.

En cuanto a la razón de la creación de LLVM, comenzó como parte de Vikram Adve El trabajo del grupo de investigación de sobre compilación de por vida (lo que significa JIT y optimización del tiempo de enlace). Después de su doctorado, Chris Lattner se mudó a Apple, que está avanzando mucho en el proyecto (probablemente porque tiene licencia BSD, lo que les ha causado problemas en el pasado con gcc, que es GPL).

Otros consejos

Nada es un compilador regular. Su razón principal para la creación fue crear una plataforma para la investigación del compilador. Por lo tanto, está diseñado para ser muy modular para que pueda trabajar en la parte del compilador que se ocupa de su investigación y no tener que preocuparse por otras partes del compilador. No hay un compilador de dragones al igual que no hay un libro LLVM (cualquier teoría que leas en el libro de dragones o en cualquier otro libro de compilación debería ser directamente aplicable). De hecho, aunque no he buscado LLVM en mucho tiempo, su documentación era bastante pobre.

No soy un desarrollador en absoluto, pero: incluso si gpl obligó a NeXt a publicar su tiempo de ejecución ObjC en los años 80, la razón principal por la que Apple financia otro compilador (GPL o no) es su voluntad de integrarse con el IDE. GCC demostró tener demasiada inercia en esta área, y GCC no es lo suficientemente modular como para permitir la reutilización de las partes del código (función xcode "arreglarlo"). Eso es lo que entendí de mis lecturas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top