La compilación dinámica es un proceso utilizado por algunas implementaciones de lenguajes de programación para obtener rendimiento durante la ejecución del programa. Aunque la técnica se originó en Self , [ cita requerida ] el lenguaje más conocido que utiliza esta técnica es Java . Dado que el código de máquina emitido por un compilador dinámico se construye y optimiza en tiempo de ejecución del programa, el uso de la compilación dinámica permite optimizaciones de eficiencia que no están disponibles para los programas compilados estáticamente (es decir, los compilados por un "compilador por lotes", como se escribe a continuación ) excepto mediante la duplicación de código o la metaprogramación .
Los entornos de tiempo de ejecución que utilizan la compilación dinámica suelen hacer que los programas se ejecuten lentamente durante los primeros minutos y, luego, la mayor parte de la compilación y recompilación se realiza y se ejecuta rápidamente. Debido a este retraso de rendimiento inicial, la compilación dinámica no es deseable en ciertos casos. En la mayoría de las implementaciones de compilación dinámica, algunas optimizaciones que podrían realizarse en el tiempo de compilación inicial se retrasan hasta una compilación posterior en tiempo de ejecución , lo que provoca más ralentizaciones innecesarias. La compilación justo a tiempo es una forma de compilación dinámica.
Compilación incremental
Una técnica estrechamente relacionada es la compilación incremental . Se utiliza un compilador incremental en POP-2 , POP-11 , Forth , algunas versiones de Lisp , por ejemplo, Maclisp y al menos una versión del lenguaje de programación ML ( Poplog ML). Esto requiere que el compilador del lenguaje de programación sea parte del sistema de ejecución. En consecuencia, el código fuente se puede leer en cualquier momento, desde el terminal, desde un archivo, o posiblemente desde una estructura de datos construida por el programa en ejecución, y traducido a un bloque de código de máquina o función (que puede reemplazar una función anterior del mismo nombre), que está inmediatamente disponible para su uso por parte del programa. Debido a la necesidad de velocidad de compilación durante el desarrollo y las pruebas interactivas, es probable que el código compilado no esté tan optimizado como el código producido por un 'compilador por lotes' estándar, que lee el código fuente y produce archivos objeto que posteriormente se pueden vincular y correr. Sin embargo, un programa compilado de forma incremental normalmente se ejecutará mucho más rápido que una versión interpretada del mismo programa. Por tanto, la compilación incremental proporciona una combinación de los beneficios de los lenguajes interpretados y compilados. Para ayudar a la portabilidad, generalmente es deseable que el compilador incremental opere en dos etapas, es decir, primero compilando en algún lenguaje intermedio independiente de la plataforma y luego compilando a partir de ese en código de máquina para la máquina host. En este caso, la migración solo requiere cambiar el compilador 'back-end'. A diferencia de la compilación dinámica, como se definió anteriormente, la compilación incremental no implica más optimizaciones después de la primera ejecución del programa.
Ver también
- Los procesadores Transmeta compilan dinámicamente código x86 en código VLIW .
- Recopilación dinámica
- Recopilación justo a tiempo
enlaces externos
- El proyecto de compilación dinámica de UW
- Emulación de arquitectura mediante compilación dinámica
- SCIRun
- Artículo " Compilación dinámica, reflexión y aplicaciones personalizables " por David B. Scofield y Eric Bergman-Terrell
- Artículo " XML de alto rendimiento: compilación dinámica de expresiones XPath " por Daniel Cazzulino
- Matthew R. Arnold , Stephen Fink , David P. Grove , Michael Hind y Peter F. Sweeney , A Survey of Adaptive Optimization in Virtual Machines , Proceedings of the IEEE, 92 (2), febrero de 2005, páginas 449-466.