En ciencias de la computación , la recompilación dinámica (a veces abreviada como dynarec o el pseudo-acrónimo DRC ) es una característica de algunos emuladores y máquinas virtuales , donde el sistema puede recompilar alguna parte de un programa durante la ejecución . Al compilar durante la ejecución, el sistema puede adaptar el código generado para reflejar el entorno de tiempo de ejecución del programa y, potencialmente, producir código más eficiente mediante la explotación de información que no está disponible para un compilador estático tradicional .
Usos
La mayoría de los recompiladores dinámicos se utilizan para convertir código de máquina entre arquitecturas en tiempo de ejecución. Esta es una tarea que a menudo se necesita en la emulación de plataformas de juegos heredadas. En otros casos, un sistema puede emplear la recompilación dinámica como parte de una estrategia de optimización adaptativa para ejecutar una representación de programa portátil como los códigos de bytes de Java o .NET Common Language Runtime . Los depuradores de velocidad completa también utilizan la recompilación dinámica para reducir la sobrecarga de espacio incurrida en la mayoría de las técnicas de desoptimización y otras características como la migración dinámica de subprocesos .
Tareas
Las principales tareas que debe realizar un recompilador dinámico son:
- Lectura de código de máquina desde la plataforma fuente
- Emitiendo código de máquina para la plataforma de destino
Un recompilador dinámico también puede realizar algunas tareas auxiliares:
- Administrar una caché de código recompilado
- Actualización de recuentos de ciclos transcurridos en plataformas con registros de recuentos de ciclos
- Gestión de la verificación de interrupciones
- Proporcionar una interfaz para hardware de soporte virtualizado, por ejemplo, una GPU
- Optimización de estructuras de código de nivel superior para que se ejecuten de manera eficiente en el hardware de destino (ver más abajo)
Ejemplo
Suponga que un programa se está ejecutando en un emulador y necesita copiar una cadena terminada en nulo . El programa está compilado originalmente para un procesador muy simple. Este procesador solo puede copiar un byte a la vez, y debe hacerlo primero leyéndolo de la cadena de origen en un registro y luego escribiéndolo desde ese registro en la cadena de destino. El programa original podría verse así:
comienzo: mov A , [ primer puntero de cadena ] ; Coloque la ubicación del primer carácter de la cadena fuente ; en el registro A mov B , [ puntero de la segunda cadena ] ; Coloque la ubicación del segundo carácter de la cadena de destino ; en el bucle del registro B : mov C , [ A ] ; Copie el byte en la dirección del registro A para registrar C mov [ B ], C ; Copie el byte del registro C a la dirección del registro B inc A ; Incrementar la dirección en el registro A para apuntar ; el siguiente byte inc B ; Incrementar la dirección en el registro B para apuntar ; el siguiente byte cmp C , # 0 ; Compare los datos que acabamos de copiar a 0 (marcador de fin de cadena) jnz loop ; Si no era 0, entonces tenemos más para copiar, así que regrese ; y copiar el siguiente byte final: ; Si no hicimos un bucle, entonces debemos haber terminado ; así que continúa con otra cosa.
Es posible que el emulador se esté ejecutando en un procesador similar, pero extremadamente bueno para copiar cadenas, y el emulador sabe que puede aprovechar esto. Podría reconocer la secuencia de instrucciones de copia de cadena y decidir reescribirlas de manera más eficiente justo antes de la ejecución, para acelerar la emulación.
Digamos que hay una instrucción en nuestro nuevo procesador llamado movs , diseñado específicamente para copiar cadenas de manera eficiente. Nuestra instrucción teórica movs copia 16 bytes a la vez, sin tener que cargarlos en el registro C en el medio, pero se detendrá si copia un byte 0 (que marca el final de una cadena) y establece la bandera de cero. También sabe que las direcciones de las cadenas estarán en los registros A y B, por lo que incrementa A y B en 16 cada vez que se ejecuta, listo para la siguiente copia.
Nuestro nuevo código recompilado podría verse así:
comienzo: mov A , [ primer puntero de cadena ] ; Coloque la ubicación del primer carácter de la cadena fuente ; en el registro A mov B , [ puntero de la segunda cadena ] ; Coloque la ubicación del primer carácter de la cadena de destino ; en el bucle del registro B : movs [ B ], [ A ] ; Copie 16 bytes en la dirección del registro A a la dirección ; en el registro B, luego incremente A y B en un bucle de 16 jnz ; Si no se establece la bandera de cero, entonces no hemos llegado ; el final de la cadena, así que retroceda y copie un poco más. fin :; Si no hicimos un bucle, entonces debemos haber terminado ; así que continúa con otra cosa.
Hay un beneficio de velocidad inmediato simplemente porque el procesador no tiene que cargar tantas instrucciones para hacer la misma tarea, pero también porque es probable que el diseñador del procesador optimice la instrucción movs para que sea más eficiente que la secuencia utilizada en el primer ejemplo. Por ejemplo, puede hacer un mejor uso de la ejecución en paralelo en el procesador para incrementar A y B mientras todavía está copiando bytes.
Aplicaciones
Propósito general
- Muchas máquinas virtuales Java cuentan con recompilación dinámica.
- Rosetta de Apple para Mac OS X en x86, permite que el código PowerPC se ejecute en la arquitectura x86 .
- Versiones posteriores del emulador Mac 68K que se utilizan en el sistema operativo Mac clásico para ejecutar código 680x0 en el hardware PowerPC.
- Psyco , un compilador especializado para Python .
- El proyecto HP Dynamo , un ejemplo de optimizador dinámico binario transparente . [1]
- DynamoRIO , un sucesor de código abierto de Dynamo que funciona con los conjuntos de instrucciones ARM , x86-64 e IA-64 (Itanium). [2] [3]
- La máquina virtual Vx32 emplea la recompilación dinámica para crear entornos sandbox de arquitectura x86 independientes del sistema operativo para complementos de aplicaciones seguros .
- Microsoft Virtual PC para Mac, utilizado para ejecutar código x86 en PowerPC.
- QEMU , un emulador de sistema completo de código abierto.
- FreeKEYB, un controlador de consola y teclado DOS internacional con muchas mejoras de usabilidad, utilizó código de modificación automática y eliminación dinámica de código muerto para minimizar su imagen en memoria basada en su configuración de usuario (características seleccionadas, idiomas, diseños) y el entorno de ejecución real (variante del sistema operativo) y versión, controladores cargados, hardware subyacente), resolviendo automáticamente dependencias, reubicando y recombinando dinámicamente secciones de código en granularidad a nivel de bytes y optimizando cadenas de operaciones basadas en información semántica proporcionada en el código fuente, información de reubicación generada por herramientas especiales durante el ensamblaje e información de perfil obtenida en el momento de la carga. [4] [5]
- OVPsim , [6] un emulador de sistema completo disponible gratuitamente.
- VirtualBox utiliza la recompilación dinámica.
- Valgrind , una herramienta de programación para depuración de memoria , detección de fugas de memoria y creación de perfiles, utiliza la recompilación dinámica.
- Dynimize: virtualización del rendimiento de la CPU. Aplica la optimización guiada por perfiles para ejecutar procesos de Linux mediante la compilación JIT. [7]
Juego de azar
- MAME utiliza la recompilación dinámica en sus emuladores de CPU para MIPS, SuperH, PowerPC e incluso las unidades de procesamiento de gráficos Voodoo.
- Wii64, un emulador de Nintendo 64 para Wii.
- WiiSX, un emulador de Sony PlayStation para Nintendo Wii.
- Mupen64Plus , un emulador multiplataforma de Nintendo 64. [8]
- Yabause , un emulador multiplataforma de Saturno . [9]
- Se asume ampliamente que la funcionalidad de compatibilidad con versiones anteriores de Xbox 360 (es decir, ejecutar juegos escritos para la Xbox original ) utiliza la recopilación dinámica.
- PPSSPP , un emulador portátil de Sony PlayStation . Recompiladores para x86 y ARM.
- PSEmu Pro , un emulador de Sony PlayStation .
- Ultrahle , el primer emulador de Nintendo 64 en ejecutar completamente juegos comerciales.
- PCSX2 , [10] un emulador de Sony PlayStation 2 , tiene un recompilador llamado "microVU", el sucesor de "SuperVU".
- Dolphin , un emulador de Nintendo GameCube y Wii , tiene una opción dynarec.
- GCemu, [11] un emulador de Nintendo GameCube .
- NullDC , un emulador de Sega Dreamcast para x86.
- GEM, [12] un emulador de Nintendo Game Boy para MSX utiliza un recompilador dinámico optimizador.
- DeSmuME, [13] un emulador de Nintendo DS , tiene una opción dynarec.
- Psp de Soywiz, [14] un emulador portátil de Sony PlayStation , tiene una opción dynarec.
- RPCS3 , un emulador de Sony PlayStation 3 . Recompiladores de PPU y SPU en Cell Processor para x86-64
- Decaf-emu, un emulador de Wii U , usa recompilación dinámica (JIT) de PowerPC32 a hardware de código x86_64 usando la biblioteca libbinrec (la biblioteca en sí puede ejecutarse en cualquier arquitectura de hardware).
Ver también
- Recompilador binario
- Traducción binaria
- Comparación de software de virtualización de plataformas
- Recopilación justo a tiempo
- Instrumentación (programación informática)
Referencias
- ^ "Informe técnico de HP Labs sobre Dynamo" .
- ^ http://www.dynamorio.org/home.html
- ^ https://github.com/DynamoRIO/dynamorio
- ^ Paul, Matthias R .; Frinke, Axel C. (1997-10-13) [publicado por primera vez en 1991], FreeKEYB - Controlador de consola y teclado DOS mejorado (Manual del usuario) (v6.5 ed.) [1] (NB. FreeKEYB es un sucesor de K3PLUS configurable dinámicamente basado en Unicode que admite la mayoría de diseños de teclado , páginas de códigos y códigos de país . K3PLUS era un controlador de teclado extendido para DOS ampliamente distribuido en Alemania en su momento, con adaptaciones a un puñado de otros idiomas europeos disponibles. Ya admitía un subconjunto de las funciones de FreeKEYB, pero estaba configurado de forma estática y no admitía la eliminación dinámica de códigos muertos ).
- ^ Paul, Matthias R .; Frinke, Axel C. (2006-01-16), FreeKEYB - Controlador de consola y teclado DOS internacional avanzado (Manual del usuario) (v7 edición preliminar)
- ^ "OVPsim" .
- ^ "Dinimizar" .
- ^ Mupen64Plus
- ^ "SH2" .
- ^ "PCSX 2" .
- ^ petebernert. "GCemu" . SourceForge .
- ^ "Emulador de Gameboy para MSX | La nueva imagen" . GEM . Consultado el 12 de enero de 2014 .
- ^ "DeSmuME v0.9.9" .
- ^ Publicado por Carlos Ballesteros Velasco (28-07-2013). "Emulador de PSP de Soywiz: lanzamiento: Emulador de Psp de Soywiz 2013-07-28 (r525)" . Pspemu.soywiz.com . Consultado el 12 de enero de 2014 .
enlaces externos
- Tutorial de recompilador dinámico
- Publicaciones de blog sobre cómo escribir un recompilador dinámico de MIPS a PPC