En informática, la compilación anticipada ( compilación AOT ) es el acto de compilar un lenguaje de programación (a menudo) de nivel superior a un lenguaje (a menudo) de nivel inferior antes de la ejecución de un programa, generalmente en tiempo de compilación, para reducir la cantidad de trabajo que se debe realizar en tiempo de ejecución .
Se asocia comúnmente con la compilación de un lenguaje de programación de alto nivel, como C o C++ , o una representación intermedia, como el código de bytes de Java o el lenguaje intermedio común (CIL), a código máquina nativo, de modo que el archivo binario resultante pueda ejecutarse de forma nativa, como un compilador nativo estándar. En este contexto, suele considerarse lo opuesto a la compilación justo a tiempo (JIT).
En términos más generales, los lenguajes de destino de una compilación AOT no son necesariamente específicos del código máquina nativo , sino que se definen de forma bastante arbitraria. Algunos artículos académicos usan este término para referirse al acto de compilar el bytecode de Java a C [ 1 ] o al momento en que se ejecuta la canalización de optimización. [ 2 ] Un proyecto académico [ 3 ] usa este término para referirse al acto de precompilar JavaScript a un IR optimizado dependiente de la máquina para V8 (motor JavaScript) [ 4 ] y a un bytecode independiente de la máquina para JavaScriptCore . [ 5 ] Algunas implementaciones de lenguajes industriales (por ejemplo, Clojure [ 6 ] y el motor JavaScript Hermes [ 7 ] ) usan este término para referirse al acto de precompilar el lenguaje fuente a bytecode específico de la VM. Angular (framework web) usa este término para referirse a la conversión de su plantilla HTML y TypeScript a JavaScript . [ 8 ]
De hecho, dado que toda compilación estática se realiza técnicamente de forma anticipada, esta terminología se utiliza a menudo para destacar ejemplos en los que existen ventajas de rendimiento significativas con respecto a la precompilación. Por consiguiente, rara vez se hace referencia a la compilación de Java a bytecode Java como AOT, ya que suele ser un requisito, no una optimización.
Sobrecarga de tiempo de ejecución reducida
Algunos lenguajes de programación con un entorno de ejecución de código administrado que se puede compilar a una representación intermedia utilizan la compilación justo a tiempo (JIT). Esta compila brevemente el código intermedio a código máquina para su ejecución nativa mientras el código intermedio se está ejecutando, lo que puede ralentizar el rendimiento de la aplicación. La compilación anticipada elimina la necesidad de este paso, ya que se realiza antes de la ejecución en lugar de durante la misma.
La compilación anticipada de lenguajes de tipado dinámico a código máquina nativo u otro bytecode estático de máquina virtual solo es posible en un número limitado de casos. Por ejemplo, el compilador AOT del Proyecto Erlang de Alto Rendimiento (HiPE) para el lenguaje Erlang puede hacerlo gracias a técnicas avanzadas de reconstrucción de tipos estáticos y especulación de tipos.
En la mayoría de los casos, con programas y bibliotecas compilados completamente mediante AOT, es posible eliminar parte del entorno de ejecución , lo que permite ahorrar espacio en disco, memoria, batería y tiempos de arranque (sin fase de calentamiento JIT), entre otros beneficios. Por ello, puede resultar útil en dispositivos integrados o móviles.
Compromisos de rendimiento
Los compiladores AOT pueden realizar optimizaciones de código complejas y avanzadas que, en la mayoría de los casos, resultarían demasiado costosas con JIT. En cambio, AOT generalmente no puede realizar algunas optimizaciones posibles con JIT, como la optimización guiada por perfil en tiempo de ejecución (PGO), la propagación de pseudoconstantes o la inserción en línea de funciones virtuales indirectas . AOT debe compilar para una arquitectura de destino, mientras que JIT puede compilar el código para aprovechar al máximo la CPU en la que se ejecuta, incluso años después del lanzamiento del software.
Además, los compiladores JIT pueden optimizar de forma especulativa el código crítico mediante suposiciones. El código generado puede desoptimizarse si una suposición especulativa resulta ser errónea. Esta operación ralentiza el rendimiento del software en ejecución hasta que el código se optimiza de nuevo mediante optimización adaptativa . Un compilador AOT no puede realizar tales suposiciones y necesita inferir la mayor cantidad de información posible en tiempo de compilación. Necesita recurrir a código menos especializado porque no puede saber qué tipos pasarán por un método. Estos problemas pueden mitigarse mediante optimizaciones guiadas por perfiles. Pero incluso en este caso, el código generado no puede adaptarse dinámicamente al perfil de tiempo de ejecución cambiante como lo haría un compilador JIT.
Compromisos de almacenamiento
Véase también
- Compilador asm.js ( JavaScript )
- Bartok ( CIL )
- Excelsior JET ( Java )
- Compilador GNU para Java
- IL2CPU (CIL)
- Generador de imágenes nativas (CIL)
- RubyMotion ( Rubí )
Referencias
- ↑ Jung, Dong-Heon; Park, Jong Kuk; Bae, Sung-Hwan; Lee, Jaemok; Moon, Soo-Mook (22 de octubre de 2006). "Manejo eficiente de excepciones en el compilador de código de bytes de Java a C con compilación anticipada para sistemas embebidos" . Actas de la 6.ª Conferencia Internacional ACM e IEEE sobre Software Embebido - EMSOFT '06 . Seúl, Corea: Association for Computing Machinery. págs. 188–194 . doi : 10.1145/1176887.1176915 . ISBN 978-1-59593-542-7. S2CID 15591457 .
- ↑ Chambers, Craig (14 de enero de 2002). «Compilación por etapas» . Actas del taller ACM SIGPLAN de 2002 sobre evaluación parcial y manipulación de programas basada en semántica . PEPM '02. Portland, Oregón: Association for Computing Machinery. págs. 1-8 . doi : 10.1145/503032.503045 . ISBN 978-1-58113-455-1. S2CID 18546907 .
- ↑ Zhuykov, R.; Sharygin, E. (2017-01-01). "Compilación anticipada de programas JavaScript" . Programming and Computer Software . 43 (1): 51– 59. doi : 10.1134/S036176881701008X . ISSN 1608-3261 . S2CID 2338849 .
- ↑ ispras/v8-aotc , Instituto Ivannikov de Programación de Sistemas de la Academia Rusa de Ciencias, 30 de enero de 2021 , consultado el 17 de marzo de 2021.
- ↑ ispras/webkit-aotc , Instituto Ivannikov de Programación de Sistemas de la Academia Rusa de Ciencias, 30 de enero de 2021 , consultado el 17 de marzo de 2021.
- ↑ "Clojure - Compilación anticipada y generación de clases" . clojure.org . Consultado el 17 de marzo de 2021 .
- ↑ "Hermes: Un nuevo motor JavaScript de código abierto optimizado para aplicaciones móviles" . Ingeniería de Facebook . 12 de julio de 2019. Consultado el 17 de marzo de 2021 .
- ↑ "Angular" . angular.io . Consultado el 17 de marzo de 2021 .
Enlaces externos
- Velocidad: NGen impulsa tu rendimiento con nuevas y potentes funciones – Revista MSDN, abril de 2005
- Mono AOT
- Excelsior JET – Implementación certificada de Java SE con compilador AOT
- Compilador GNU para Java
- Compilación AOT de asm.js
- Java en tiempo real, Parte 2: Comparación de técnicas de compilación – IBM developerWorks, abril de 2007
- Mejorando el rendimiento de Swing: compilación JIT frente a compilación AOT – Revista LinuxWorld, noviembre de 2004. Archivado el 12 de junio de 2008 en Wayback Machine.
- Manta
- Compiladores