Compilación anticipada
# Compilación anticipada

En informática, Compilación anticipada (AOT por sus siglas en inglés, ahead-of-time) es el acto de compilar un lenguaje de programación de alto nivel como C o C++, o un lenguaje intermedio como Java bytecode o el Common Intermediate Language (CIL) de .NET, a un código de máquina nativo (dependiente del sistema) con la intención de ejecutar el archivo binario resultante nativamente.

AOT produce código máquina optimizado, igual que un compilador nativo "estándar". La diferencia es que AOT transforma el bytecode de una máquina virtual (VM) a código máquina.

## Reducción de la sobrecarga en tiempo de ejecución

Algunos lenguajes de programación con código gestionado que pueden ser compilados a un lenguaje intermedio hacen uso del justo-en-tiempo (JIT). Esto, en resumen, compila código intermedio a código máquina para una ejecución nativa mientras el código intermedio se está ejecutando, lo cual puede hacer disminuir el rendimiento de una aplicación. La compilación anticipada elimina la necesidad de este paso al ejecutar la compilación antes de la ejecución en vez de hacerlo durante la ejecución.

La compilación anticipada de lenguajes dinámicamente tipados a código de máquina nativa u otros bytecodes de máquina virtual es posible sólo en un número limitado de casos. Por ejemplo, el compilador AOT del HiPE para Erlang puede hacerlo gracias a avanzadas técnicas de reconstrucción de tipos estáticos y especulación de tipos.

En la mayoría de los casos, el uso de programas y librerías compilados con AOT proporciona una reducción considerable del entorno de ejecución, ahorrando así espacio de disco, memoria, batería y tiempo de arranque (eliminación de la fase de JIT), etc. Gracias a este motivo, pueden ser muy útil en dispositivos móviles o embebidos.

## Compensaciones en la ejecución

Los compiladores AOT consiguen complejas y avanzadas optimizaciones de código qué en la mayoría de los casos serían demasiado costosas de hacer con JIT. Por otro lado, AOT normalmente no puede ejecutar algunas optimizaciones posibles en JIT, como , optimizaciones guiadas por perfil, propagación pseudo-constante o funciones indirectas/virtuales en línea.

Además, los compiladores JIT pueden optimizar especulativamente código "caliente" haciendo especulaciones con el código. El código generado puede ser empeorado si una suposición especulativa resulta ser errónea más adelante. Estas operaciones hacen daño al rendimiento del software ejecutado hasta que el código es optimizado de nuevo por optimización adatativa. Un compilador AOT no puede hacer tales suposiciones y necesita recopilar tanta información como sea posible en tiempo de compilación. No puede usar tanto código especializado porque podría no saber realmente que tipos se usarían en un determinado método. Tales problemas pueden ser aliviados usando optimizaciones guiadas por perfil. Pero incluso así, el código generado no puede adaptarse a un nuevo perfil de ejecución como un compilador JIT haría.

