for compiler-construction llvm compiler-theory

compiler-construction - for - llvm 4.0 3



¿Cuál es la razón para la creación de LLVM? (3)

Hay un par de diferencias entre LLVM y "un compilador regular", 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 el código a "código de bits", un formato que puede volver a analizar más adelante.
  • LLVM proporciona un compilador justo a tiempo (JIT) para que pueda volver a analizar los programas mientras se ejecutan, al igual que lo hace la JVM.
  • LLVM está muy bien diseñado:
    • Sus componentes son modulares y bien separados.
    • tiene 3 formatos para su representación intermedia (representación textual, binaria y en memoria), que son equivalentes,
    • Su representación intermedia utiliza el formulario SSA,
    • Su representación intermedia tiene un sistema tipográfico.

En cuanto a Javascript y otros lenguajes dinámicos, estamos viendo mucho interés en LLVM de la comunidad de lenguajes dinámicos, 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 los ejecutables de ejecución larga 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 utilizando 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 del trabajo del grupo de investigación de Vikram Adve sobre la compilación de por vida (lo que significa JIT y optimización de tiempo de enlace). Después de su doctorado, Chris Lattner se mudó a Apple, lo que está impulsando el proyecto en gran medida (probablemente porque tiene licencia BSD, lo que les ha causado problemas en el pasado con gcc, que es GPL).

¿Cuáles son las diferencias entre un LLVM y un compilador regular?
¿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 la creación de uno?
Conozco el Libro del Dragón para compiladores, pero ¿existe algo así para un LLVM?

EDITAR: He encontrado this interesante proyecto.


Nada es un compilador regular. Su principal motivo de creación fue crear una plataforma para la investigación de compiladores. Por lo tanto, está diseñado para ser muy modular, de modo que pueda trabajar en esa 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 de LLVM (cualquier teoría que lea en el libro de dragones o cualquier otro libro de compiladores debe ser directamente aplicable). De hecho, aunque no he buscado en LLVM por un tiempo, su documentación era bastante pobre.


No soy un desarrollador en absoluto, pero: incluso si gpl forzó a NeXt a publicar su tiempo de ejecución ObjC en los años 80, la razón principal para que Apple financie a 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 "fix it"). Eso es lo que entendí de mis lecturas.