Traducción binaria ( eng. traducción binaria ): emulación de un conjunto de instrucciones en otro debido a la traducción del código de máquina . Las secuencias de instrucciones se traducen del conjunto de origen al conjunto de instrucciones de destino. La traducción binaria le permite ejecutar aplicaciones de una arquitectura mientras se ejecuta en la segunda y, para optimizar los compiladores binarios, la velocidad de ejecución del código suele ser mayor que la original.
La traducción binaria puede ser estática o dinámica. La compilación dinámica ocurre de forma invisible para el usuario cuando se inicia la aplicación. Un compilador estático convierte el código binario de la arquitectura de origen en una aplicación completa lista para usar para la arquitectura de destino. En la traducción dinámica estática, todo el ejecutable de origen se traduce en un ejecutable para la arquitectura de destino. Esta es una tarea muy difícil: realizar esta traducción de manera absolutamente correcta, ya que el traductor no lee inmediatamente todo el código. Por ejemplo, algunas partes del código ejecutable solo son accesibles a través de saltos indirectos , cuyos parámetros solo se conocen en tiempo de ejecución.
Por otro lado, la traducción dinámica considera secuencias cortas de código (generalmente un bloque básico : un bucle o un método), lo traduce y almacena en caché la secuencia resultante. El código no se traduce en su totalidad, pero a medida que se lee y, en consecuencia, la posibilidad de su traducción, y para las instrucciones de bifurcación, se crea un punto de control en el código traducido.
La traducción binaria dinámica se diferencia de la emulación simple en que elimina el bucle principal del emulador de lectura, decodificación y ejecución (que es su principal cuello de botella), pagando esto con una gran sobrecarga durante el proceso de traducción. Esta sobrecarga (carga) se nivela un poco en el futuro debido al hecho de que el código traducido se ejecutará varias veces (es decir, sin volver a traducir).
Los traductores dinámicos más avanzados utilizan la recompilación dinámica : el código que se está traduciendo se instrumenta para averiguar la "temperatura del código", es decir, qué fragmentos se ejecutan con bastante frecuencia, y se les aplica una optimización agresiva . Este enfoque recuerda a un compilador JIT y, en esencia, dichos compiladores (como la tecnología HotSpot de Sun ) pueden considerarse como traductores dinámicos de un conjunto de instrucciones virtuales ( código de bytes ) a uno real.
Apple implementó el emulador de traducción de código en vivo M68K en su línea de computadoras Macintosh con procesadores PowerPC , que lograron un nivel muy alto de confiabilidad, rendimiento y compatibilidad (ver Emulador Mac 68K ). Esto permitió a Apple lanzar máquinas al mercado con solo un sistema operativo parcialmente nativo , y los usuarios finales pudieron probar la arquitectura nueva y más rápida sin arriesgar su inversión en actualizaciones de software. "En parte" porque el emulador tuvo tanto éxito que muchas partes del sistema operativo continuaron siendo emuladas. La transición final al sistema operativo PowerPC nativo no se produjo hasta el lanzamiento de Mac OS X (10.0) en 2001, pero dentro de este nuevo sistema operativo, el tiempo de ejecución " Classic " aún admitía la emulación de las capacidades de PowerPC Mac.
Más tarde, Apple implementó la capa de traducción de Rosetta (incluida en las versiones de Mac OS 10.4 ) para las Mac centradas en Intel, que se utilizó para facilitar la transición de PPC a x86, un ejemplo de traducción dinámica. Desarrollada para Apple por Transitive , Rosetta es una implementación de la solución QuickTransit de Transitive que se puede usar para traducir dinámicamente entre plataformas basadas en las arquitecturas SPARC, PowerPC, MIPS, Itanium y x86.
Sun ( SPARC → x86 ), IBM (x86 → Power Architecture , PowerVM Lx86 ) y SGI ( MIPS → Itanium2 ) [1] también utilizaron la tecnología QuickTransit de Transitive.
DEC implementó traductores para migrar de la arquitectura CISC VAX a la arquitectura RISC Alpha . DEC también implementó el traductor binario FX!32 para convertir aplicaciones de arquitectura x86 en aplicaciones Alpha.
El traductor MCST Lintel le permite ejecutar aplicaciones x86 en el procesador Elbrus 2000 (arquitectura e2k ).
Intel usó el traductor Intel IA-32 EL para ejecutar aplicaciones x86 de 32 bits en la familia de procesadores Itanium .
En enero de 2000, Transmeta anunció un diseño para un procesador actualizado llamado Transmeta Crusoe [2] [3] . Como se deduce de las preguntas frecuentes [4] con el nivel de programa integrado Code Morphing, que proporciona una traducción binaria dinámica de instrucciones x86 a instrucciones Crusoe.
HP ARIES (retraducción automática y simulación de entorno integrado ) es un sistema dinámico de traducción binaria que combina una interpretación rápida de código con una traducción dinámica de dos fases para ejecutar aplicaciones HP 9000 HP-UX de forma transparente y precisa en HP-UX 11i para servidores HP Integrity . El intérprete ARIES emula el conjunto completo de instrucciones PA-RISC sin privilegios sin la intervención del usuario, mientras que solo el código de uso frecuente se traduce a código Itanium : se utiliza la traducción dinámica en dos fases, en la que se recopila información sobre el perfil de lanzamiento en el primer paso. ARIES almacena el código traducido dinámicamente en un búfer de memoria llamado caché de código o caché de fragmentos. Los bloques de código de destino que se traducen se marcan para garantizar la ejecución en la caché de código en la mayoría de los casos. Cuando se completa la emulación, ARIES descarta todo el código traducido sin modificar la aplicación original. El motor de emulación ARIES también implementa Emulación de entorno, que emula llamadas al sistema de aplicaciones HP 9000 HP-UX , señalización, manejo de excepciones, subprocesos, emulación HP GNU Debugger para la depuración y generación de archivos centrales para la aplicación.
Los microprocesadores chinos de la serie Loongson utilizan el sistema de traducción binaria qemu con modificaciones del fabricante de procesadores ICT. Se han agregado aproximadamente 200 instrucciones al procesador de arquitectura similar a MIPS para simplificar la emulación x86.
El traductor dinámico de software libre más desarrollado es QEMU . Admite la traducción para una gran cantidad de plataformas y en cualquier combinación de arquitecturas emuladas y emuladas.