En ciencias de la computación, la compilación anticipada ( compilación AOT ) es el acto de compilar un lenguaje de programación (a menudo) de nivel superior en un lenguaje de nivel (a menudo) inferior antes de la ejecución de un programa, generalmente en tiempo de compilación, para Reducir la cantidad de trabajo necesario para realizar en tiempo de ejecución .
Muy a menudo, se asocia con el acto de compilar un lenguaje de programación de nivel superior , como C o C ++ , o una representación intermedia como el código de bytes de Java o el código de lenguaje intermedio común (CIL) de .NET Framework , en un lenguaje nativo (dependiente del sistema). ) código de máquina para que el archivo binario resultante se pueda ejecutar de forma nativa, como un compilador nativo estándar . Cuando se usa en este contexto específico, a menudo se ve como lo opuesto a la compilación justo a tiempo (JIT).
Hablando de manera más general, los lenguajes de destino de una compilación AOT no son necesariamente específicos del código de máquina nativo , sino que se definen de manera bastante arbitraria. Algunos artículos académicos usan esta palabra para referirse al acto de compilar el código de bytes de Java en C [1] o el momento en que se realiza la optimización. [2] Un proyecto académico [3] utiliza esta palabra para referirse al acto de precompilar JavaScript en un IR optimizado dependiente de la máquina para V8 (motor JavaScript) [4] y en un código de bytes independiente de la máquina para JavaScriptCore . [5] Algunas implementaciones de lenguajes industriales (por ejemplo, Closure [6] y Hermes JavaScript engine [7] ) usan esta palabra para referirse al acto de precompilar el lenguaje fuente en un código de bytes específico de VM. Angular (marco web) usa esta palabra para significar la conversión de su plantilla HTML y TypeScript a JavaScript . [8]
De hecho, dado que todas las compilaciones estáticas se realizan técnicamente con anticipación, esta redacción en particular se usa a menudo para enfatizar algún tipo de ventajas de rendimiento del acto de tal compilación previa. Por lo tanto, el acto de compilar Java en código de bytes de Java rara vez se denomina AOT, ya que generalmente es un requisito, no una optimización.
Sobrecarga de tiempo de ejecución reducida
Algunos lenguajes de programación con un tiempo de ejecución de código administrado que se puede compilar en una representación intermedia, usan la compilación Just - In -Time (JIT). Esto, brevemente, compila el código intermedio en código de máquina para una ejecución nativa mientras se ejecuta el código intermedio, lo que puede ralentizar el rendimiento de una aplicación. La compilación anticipada elimina la necesidad de este paso al ocurrir antes de la ejecución en lugar de durante la ejecución.
La compilación anticipada para lenguajes tipados dinámicamente en código de máquina nativo u otro código de bytes de VM estático solo es posible en un número limitado de casos. [ cita requerida ] Por ejemplo, el compilador AOT de High Performance Erlang Project (HiPE) para el lenguaje Erlang puede hacer esto debido a las técnicas avanzadas de reconstrucción de tipos estáticos y las especulaciones de tipos.
En la mayoría de las situaciones con programas y bibliotecas totalmente compilados AOT, es posible eliminar una fracción útil de un entorno de tiempo de ejecución , ahorrando así espacio en disco, memoria, duración de la batería y tiempos de inicio (sin fase de calentamiento JIT), etc. Debido a esto, puede ser útil en dispositivos integrados o móviles.
Compensación de rendimiento
Los compiladores de AOT pueden realizar optimizaciones de código complejas y avanzadas , que en la mayoría de los casos de JITing se considerarán demasiado costosas. En contraste, AOT generalmente no puede realizar algunas optimizaciones posibles en JIT, como optimización guiada por perfil en tiempo de ejecución (PGO), propagación pseudoconstante o alineación de función virtual indirecta . AOT debe compilarse en una arquitectura de destino, mientras que un JIT puede compilar el código para hacer el mejor uso de la CPU real en la que se está ejecutando, incluso años después de que se haya lanzado el software.
Además, los compiladores JIT pueden optimizar especulativamente el código activo haciendo suposiciones sobre el código. El código generado se puede desoptimizar si una suposición especulativa resulta errónea posteriormente. Dicha operación ralentiza el rendimiento del software en ejecución hasta que el código se optimiza nuevamente mediante la optimización adaptativa . Un compilador AOT no puede hacer tales suposiciones y necesita inferir tanta información como sea posible en el momento de la compilación. Necesita recurrir a código menos especializado porque no puede saber qué tipos pasarán por un método. Estos problemas pueden aliviarse mediante optimizaciones guiadas por perfiles. Pero incluso en este caso, el código generado no se puede adaptar dinámicamente al perfil de tiempo de ejecución cambiante como lo haría un compilador JIT.
Compensaciones de almacenamiento
Ver también
- compilador asm.js ( JavaScript )
- Bartok ( CIL )
- Excelsior JET ( Java )
- Compilador GNU para Java
- IL2CPU (CIL)
- Generador de imágenes nativas (CIL)
- RubyMotion ( Ruby )
- SharpOS AOT (CIL)
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 Java bytecode-to-c adelantado para sistemas embebidos" . Actas de la sexta conferencia internacional ACM & IEEE sobre software integrado . EMSOFT '06. Seúl, Corea: Asociación de Maquinaria de Computación: 188-194. doi : 10.1145 / 1176887.1176915 . ISBN 978-1-59593-542-7.
- ^ Chambers, Craig (14 de enero de 2002). "Recopilación escenificada" . Actas del taller ACM SIGPLAN de 2002 sobre evaluación parcial y manipulación de programas basada en semántica . PEPM '02. Portland, Oregon: Asociación de Maquinaria de Computación: 1–8. doi : 10.1145 / 503032.503045 . ISBN 978-1-58113-455-1.
- ^ Zhuykov, R .; Sharygin, E. (1 de enero de 2017). "Compilación anticipada de programas JavaScript" . Programación y software informático . 43 (1): 51–59. doi : 10.1134 / S036176881701008X . ISSN 1608-3261 .
- ^ ispras / v8-aotc , Ivannikov Institute for System Programming of the Russian Academy of Sciences, 2021-01-30 , consultado el 2021-03-17
- ^ ispras / webkit-aotc , Ivannikov Institute for System Programming of the Russian Academy of Sciences, 2021-01-30 , consultado 2021-03-17
- ^ "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 . 2019-07-12 . Consultado el 17 de marzo de 2021 .
- ^ "Angular" . angular.io . Consultado el 17 de marzo de 2021 .
enlaces externos
- Velocidad: NGen acelera su 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
- Mejora del rendimiento del swing: compilación JIT vs AOT - LinuxWorld Magazine, noviembre de 2004
- Manta