La mayoría de los compiladores tienen una interfaz, algunos códigos medios/estructuras de algún tipo, y el servidor. Cuando tomas tu programa C y usas clang y compilación de modo tal que terminas con un programa que no es JIT x86 y que puedes ejecutar, aún has pasado de frontend a middle to backend. Lo mismo ocurre con gcc, gcc va de frontend a un elemento central y un back-end. Lo central de Gccs no está muy abierto y se puede usar como LLVM.
Ahora una cosa que es divertida/interesante acerca de llvm, que no se puede hacer con otros, o al menos gcc, es que puedes tomar todos tus módulos de código fuente, compilarlos en llvms bytecode, unirlos en uno grande bytecode file, luego optimice todo, en lugar de optimización por archivo o por función que obtiene con otros compiladores, con llvm puede obtener cualquier nivel de optimización de programa parcial o compilado que desee. luego puede tomar ese bytecode y usar llc para exportarlo al ensamblador de destinos. Normalmente hago incrustado, así que tengo mi propio código de inicio, pero en teoría debería poder tomar ese archivo de ensamblador y compilar gcc y vincularlo y ejecutarlo. gcc myfile.s -o myfile.Imagino que hay una forma de obtener las herramientas de llvm para hacer esto y no tener que usar binutils o gcc, pero no me he tomado el tiempo.
Me gusta llvm porque siempre es un compilador cruzado, a diferencia de gcc no tienes que compilar uno nuevo para cada objetivo y lidiar con los matices para cada objetivo. No sé si tengo algún uso para JIT. Lo que digo es que lo uso como compilador cruzado y como compilador nativo.
Así que su primer caso es el frente, el medio, el final y el proceso está oculto para usted, comienza con la fuente y obtiene un binario, hecho. El segundo caso es si entiendo bien el frente y el medio y me detengo con un archivo que representa el medio. Luego, de medio a extremo (el procesador de destino específico) puede suceder justo a tiempo en el tiempo de ejecución. La diferencia en el back-end, la ejecución en tiempo real del lenguaje medio del caso dos, es probablemente diferente del backend del caso uno.
Así que para usar LLVM como JIT usted tiene que vincular en su aplicación, ¿verdad? ¿Hay aplicaciones que hacen eso? – zaharpopov