En informática , la traducción binaria es una forma de recompilación binaria en la que las secuencias de instrucciones se traducen desde un conjunto de instrucciones fuente (ISA) al conjunto de instrucciones destino, teniendo en cuenta el sistema operativo para el que se compiló el binario. En algunos casos, como en la simulación de conjuntos de instrucciones , el conjunto de instrucciones destino puede ser el mismo que el conjunto de instrucciones fuente, lo que proporciona funciones de prueba y depuración, como el seguimiento de instrucciones, los puntos de interrupción condicionales y la detección de puntos críticos .
Los dos tipos principales son la traducción binaria estática y la dinámica. La traducción se puede realizar en hardware (por ejemplo, mediante circuitos en una CPU ) o en software (por ejemplo, motores de tiempo de ejecución, recompiladores estáticos, emuladores; todos suelen ser lentos ).
Motivación
La traducción binaria se debe a la falta de un binario para una plataforma de destino, a la falta de código fuente para compilar para dicha plataforma o a cualquier otra dificultad para compilar el código fuente para la plataforma de destino.
Los binarios recompilados estáticamente se ejecutan potencialmente más rápido que sus respectivos binarios emulados, ya que se elimina la sobrecarga de la emulación. Esto es similar a la diferencia de rendimiento que existe en general entre los programas interpretados y los compilados.
Traducción binaria estática
Un traductor que utiliza traducción binaria estática tiene como objetivo convertir todo el código de un archivo ejecutable en código que se ejecute en la arquitectura y plataforma de destino sin necesidad de ejecutarlo previamente, como ocurre en la traducción binaria dinámica. Esto es muy difícil de lograr correctamente, ya que el traductor no puede descubrir todo el código. Por ejemplo, algunas partes del ejecutable solo son accesibles mediante bifurcaciones indirectas , cuyo valor se conoce únicamente en tiempo de ejecución.
Un traductor binario estático de este tipo utiliza la tecnología de superoptimización universal (desarrollada por Sorav Bansal y Alex Aiken de la Universidad de Stanford ) para realizar traducciones eficientes entre múltiples pares de origen y destino, con costos de desarrollo considerablemente bajos y un alto rendimiento del binario de destino. En experimentos de traducciones de PowerPC a x86, algunos binarios incluso superaron a las versiones nativas, pero en promedio se ejecutaron a dos tercios de la velocidad nativa. [ 1 ]
Ejemplos de traducciones binarias estáticas
En la década de 1960, Honeywell proporcionó un programa llamado Liberator para su serie de computadoras Honeywell 200 ; este programa podía traducir programas para la serie de computadoras IBM 1400 a programas para la serie Honeywell 200. [ 2 ]
En 1995, Norman Ramsey de Bell Communications Research y Mary F. Fernandez del Departamento de Ciencias de la Computación de la Universidad de Princeton desarrollaron The New Jersey Machine-Code Toolkit , que contenía las herramientas básicas para la traducción estática de código ensamblador. [ 3 ]
En 2004, Scott Elliott y Phillip R. Hutchinson de Nintendo desarrollaron una herramienta para generar código "C" a partir del binario de Game Boy , que luego podía compilarse para una nueva plataforma y vincularse con una biblioteca de hardware para su uso en sistemas de entretenimiento de aerolíneas. [ 4 ]
En 2014, se generó una versión con arquitectura ARM del videojuego StarCraft de 1998 mediante recompilación estática e ingeniería inversa adicional de la versión original x86 . [ 5 ] [ 6 ] La comunidad de la consola portátil Pandora fue capaz de desarrollar las herramientas necesarias [ 7 ] por su cuenta y lograr dichas traducciones con éxito en varias ocasiones. [ 8 ] [ 9 ]
Otro ejemplo es la versión recompilada estáticamente de NES a x86 del videojuego Super Mario Bros. que se generó utilizando LLVM en 2013. [ 10 ]
Por ejemplo, en 2014 se generó una recompilación estática exitosa de x86 a x64 para el generador de terreno procedural del videojuego Cube World. [ 11 ]
Traducción binaria dinámica
La traducción binaria dinámica (DBT) analiza una secuencia corta de código —normalmente del orden de un único bloque básico— , la traduce y almacena en caché la secuencia resultante. El código se traduce solo a medida que se descubre y cuando es posible, y las instrucciones de salto se configuran para que apunten al código ya traducido y guardado ( memoización ).
La traducción binaria dinámica difiere de la emulación simple (eliminando el bucle principal de lectura-decodificación-ejecución del emulador, un importante cuello de botella en el rendimiento), lo que conlleva una gran sobrecarga durante el tiempo de traducción. Se espera que esta sobrecarga se amortice a medida que las secuencias de código traducidas se ejecutan varias veces.
Los traductores dinámicos más avanzados emplean la recompilación dinámica, donde el código traducido se instrumenta para determinar qué partes se ejecutan con mayor frecuencia, y estas partes se optimizan de forma intensiva. Esta técnica recuerda a un compilador JIT , y de hecho, dichos compiladores (por ejemplo, la tecnología HotSpot de Sun ) pueden considerarse traductores dinámicos de un conjunto de instrucciones virtual (el código de bytes ) a uno real.
Ejemplos de traducciones binarias dinámicas en software
- Apple Computer implementó un emulador de traducción dinámica para el código M68K en su línea de Macintosh PowerPC [ 12 ] , que alcanzó un nivel muy alto de fiabilidad, rendimiento y compatibilidad (véase el emulador Mac 68K ). Esto permitió a Apple lanzar al mercado las máquinas con un sistema operativo parcialmente nativo , y los usuarios finales pudieron adoptar la nueva arquitectura, más rápida, sin arriesgar su inversión en software. En parte debido al éxito del emulador, muchas partes del sistema operativo permanecieron emuladas. La transición completa a un sistema operativo nativo para PowerPC no se produjo hasta el lanzamiento de Mac OS X (10.0) en 2001. (El entorno de ejecución " Classic " de Mac OS X continuó ofreciendo esta capacidad de emulación en las Mac PowerPC hasta Mac OS X 10.5 ).
- Mac OS X 10.4.4 para Macs con procesadores Intel introdujo la capa de traducción dinámica Rosetta para facilitar la transición de Apple del hardware basado en PPC a x86. Desarrollado para Apple por Transitive Corporation , el software Rosetta es una implementación de la solución QuickTransit de Transitive .
- Durante su ciclo de vida, QuickTransit también ofreció soporte para la traducción de SPARC → x86 , x86 → PowerPC y MIPS → Itanium 2 .
- DEC logró un éxito similar con sus herramientas de traducción para ayudar a los usuarios a migrar de la arquitectura CISC VAX a la arquitectura Alpha RISC .
- HP ARIES (Automatic Re-translation and Integrated Environment Simulation) es un sistema de traducción binaria dinámica de software [ 13 ] que combina una interpretación de código rápida con una traducción dinámica de dos fases para ejecutar de forma transparente y precisa aplicaciones HP 9000 HP-UX en HP-UX 11i para servidores HPE Integrity . [ 14 ] El intérprete rápido de ARIES emula un conjunto completo de instrucciones PA-RISC no privilegiadas sin intervención del usuario. Durante la interpretación, supervisa el patrón de ejecución de la aplicación y traduce solo el código ejecutado con frecuencia a código nativo de Itanium en tiempo de ejecución. ARIES implementa la traducción dinámica de dos fases, una técnica en la que el código traducido en la primera fase recopila información de perfil de tiempo de ejecución que se utiliza durante la traducción de la segunda fase para optimizar aún más el código traducido. ARIES almacena el código traducido dinámicamente en un búfer de memoria llamado caché de código. Las referencias posteriores a los bloques básicos traducidos se ejecutan directamente en la caché de código y no requieren interpretación ni traducción adicionales. Los destinos de los bloques de código traducidos se actualizan para garantizar que la ejecución tenga lugar en la caché de código la mayor parte del tiempo. Al finalizar 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 la emulación de entorno, que emula las llamadas al sistema, la entrega de señales, la gestión de excepciones, la gestión de subprocesos, la emulación de HP GDB para la depuración y la creación de archivos de volcado de memoria de una aplicación HP 9000 HP- UX.
- DEC creó el traductor binario FX!32 para convertir aplicaciones x86 a aplicaciones Alpha. [ 12 ]
- El software Wabi de Sun Microsystems incluía la traducción dinámica de instrucciones x86 a SPARC.
- En enero de 2000, Transmeta Corporation anunció un nuevo diseño de procesador llamado Crusoe . [ 15 ] [ 16 ] De las preguntas frecuentes [ 17 ] en su sitio web,
El microprocesador inteligente consta de un núcleo VLIW de hardware como motor y una capa de software denominada software de transformación de código. Este software actúa como una interfaz que transforma o traduce las instrucciones x86 a instrucciones nativas Crusoe. Además, incluye un compilador dinámico y un optimizador de código. El resultado es un mayor rendimiento con un consumo mínimo de energía. Esto permite a Transmeta desarrollar el hardware VLIW y el software de transformación de código de forma independiente, sin afectar a su amplia base de aplicaciones.
- Intel Corporation desarrolló e implementó una capa de ejecución IA-32 , un traductor binario dinámico diseñado para admitir aplicaciones IA-32 en sistemas basados en Itanium . Esta capa se incluyó en Microsoft Windows Server para la arquitectura Itanium , así como en varias distribuciones de Linux , incluidas Red Hat y Suse . Permitió que las aplicaciones IA-32 se ejecutaran más rápido que si utilizaran el modo IA-32 nativo en los procesadores Itanium.
- Dolphin (un emulador para GameCube / Wii ) realiza la recompilación JIT del código PowerPC a x86 y AArch64.
- Microsoft Virtual PC admite la traducción binaria para sistemas operativos invitados de 32 bits.
- Se sabe que VMware Workstation 12 o versiones anteriores admiten la traducción binaria para sistemas operativos invitados de 32 bits.
Ejemplos de traducciones binarias dinámicas en hardware
- El procesador Nvidia Tegra K1 Denver traduce las instrucciones ARM a través de un decodificador de hardware lento a sus instrucciones de microcódigo nativas y utiliza un traductor binario de software para el código de uso frecuente.
Véase también
Referencias
- ↑ Bansal, Sorav; Aiken, Alex (diciembre de 2008). "Traducción binaria mediante superoptimizadores de mirilla" (PDF) . Actas de la 8.ª conferencia USENIX sobre diseño e implementación de sistemas operativos . págs. 177–192 .
- ↑ Descripción resumida de la serie 200 de Honeywell (PDF) . Honeywell . Febrero de 1966. pág. 11.
Por ejemplo, el repertorio de instrucciones de los procesadores de la serie 200 es lo suficientemente similar al de otros sistemas de procesamiento, como la serie IBM 1400, como para permitir la traducción automática y única de programas escritos para estos sistemas de la competencia a un formato adecuado para su ejecución en sistemas de la serie 200 de mayor rendimiento.
- ↑ Ramsey, Norman; Fernandez, Mary F. (1995). "The New Jersey Machine-Code Toolkit" . Actas de TCON'95 Actas de la Conferencia Técnica USENIX de 1995. Asociación USENIX Berkeley, CA, EE. UU. pág. 24.
- ↑ US 7765539 , Elliott, Scott y Hutchinson, Phillip, "Sistema y método para la transcompilación de videojuegos", publicado en 2010
- ↑ Steinlechner, Peter (10 de marzo de 2014). "Starcraft für ARM-Handheld kompiliert" (en alemán). golem.de . Consultado el 25 de marzo de 2014 .
- ↑ notaz (2014-03-04). "StarCraft" . repo.openpandora.org . Recuperado el 2014-03-26 .
- ↑ notaz (2014-03-01). "ia32rtools/" . GitHub . Recuperado el 2015-01-09 .
- ↑ notaz (04/03/2014). "Starcraft" . openpandora.org . Consultado el 29/03/2014 .
La regla de "sin código fuente, no hay puerto" no es del todo cierta; se puede obtener algo similar (pero no idéntico) a un puerto mediante recompilación estática. M-HT hizo algo similar varias veces para algunos juegos de DOS. El juego también se convirtió para Android con un enfoque algo parecido.
- ↑ M-HT. "Warcraft: Orcos y Humanos" . repo.openpandora.org.
- ↑ Kelley, Andrew (2013-07-07). "Recompilación estática de juegos de NES en ejecutables nativos con LLVM y Go" . Consultado el 2013-08-08 .
Este artículo presenta una investigación original sobre la posibilidad de desensamblar y recompilar estáticamente juegos de Nintendo Entertainment System en ejecutables nativos.
- ↑ Kærlev, Mathias (14 de abril de 2014). "Recompilación práctica y portátil de X86" . Recuperado el 8 de agosto de 2014. Pero
entonces se presentó la idea de usar de alguna manera el código máquina x86 original. Sin embargo, para nuestro servidor abierto, también necesitamos admitir x86-64, y en ese caso, necesitamos absolutamente emulación o recompilación. […] La recompilación estática a ensamblador parecía una opción mucho mejor, pero para mantenerla portátil, necesitaríamos escribir backends para x86, x86-64 y posiblemente ARM/PowerPC.
- 1 2 Wharton, John Harrison (1994-08-01). «Gary Kildall, pionero de la industria, muere a los 52 años: creó los primeros lenguajes para microcomputadoras y sistemas operativos de disco» . Microprocessor Report . 8 (10). MicroDesign Resources Inc. (MDR). Archivado del original el 18/11/2016 . Recuperado el 18/11/2016 .
[…] Irónicamente, muchas de las técnicas que
Gary
desarrolló se están redescubriendo ahora, diez años después.
Apple
y
DEC
promocionan
la recompilación binaria
como una «nueva» tecnología para portar software existente a la arquitectura
PowerPC
o
Alpha
. De hecho,
DRI
introdujo un recompilador binario
de 8080
a
8086
a principios de la década de 1980. […]
- ↑ Carlson, Jim; Huck, Jerry (2003). Itanium Rising: Breaking Through Moore's Second Law of Computing Power . Prentice Hall PTR. ISBN 978-0-13046415-6. Consultado el 09-01-2015 .
- ↑ "HP ARIES Traductor binario dinámico" . HP . Archivado del original el 10/01/2015 . Consultado el 09/01/2015 .
- ↑ Stokes, Jon. "Transmeta Crusoe explorada" . Ars Technica . Consultado el 9 de enero de 2015 .
- ↑ Hughes, Rob (2000-01-20). "El microprocesador Crusoe de Transmeta" . geek.com . Archivado del original el 27-09-2007.
- ↑ "Preguntas frecuentes sobre el procesador Transmeta Crusoe" . Transmeta . 2007. Archivado del original el 10 de enero de 2007.
Lecturas adicionales
- Haber, Gadi (2010). "Introducción a la traducción binaria" (PDF) . Intel . Archivado del original (PDF) el 9 de marzo de 2016. Recuperado el 30 de marzo de 2014 .
- Bansal, Sorav; Aiken, Alex (diciembre de 2008). "Traducción binaria mediante superoptimizadores de mirilla" . Departamento de Ciencias de la Computación e Ingeniería . Instituto Indio de Tecnología de Delhi . Recuperado el 30 de marzo de 2014 .
- Baraz, Leonid; Devor, Tevi; Etzion, Orna; Goldenberg, Shalom; Skaletsky, Alex; Wang, Yun; Zemach, Yigal (2003). «Capa de ejecución IA-32: un traductor dinámico de dos fases diseñado para soportar aplicaciones IA-32 en sistemas basados en Itanium» . Actas del 36.º Simposio Internacional Anual IEEE/ACM sobre Microarquitectura . MICRO 36. Washington, DC, EE. UU.: IEEE Computer Society . págs. 191–. ISBN 978-0-7695-2043-8.
- Toal, Graham. "Guía práctica para escritores de emuladores sobre la traducción binaria estática" .
- Chernoff, Antón; Herdeg, Mark; Gancho, Ray; Reeve, Chris; Rubin, normando; Tye, Tony; Yadavalli, S. Bharadwaj; Yates, Juan (1998). "FX!32: un traductor binario dirigido a perfiles" . Micro IEEE . 18 (2): 56– 64. doi : 10.1109/40.671403 . ISSN 0272-1732 .
- Souza, Maxwell; Nicácio, Daniel; Araújo, Guido (23/06/2010) [19/06/2010]. ISAMAP: Mapeo de instrucciones impulsado por traducción dinámica . Arquitectura de computadoras - Talleres internacionales ISCA 2010. Saint-Malo, Francia. pp. 117–. ISBN 9783642243226.
- Chen, Yu-hsin (2009-06-20) [2009-06-18]. "Traducción binaria dinámica de código x86-32 a código x86-64 para virtualización" (PDF) . Instituto Tecnológico de Massachusetts .
- Software de emulación
- Intérpretes (informática)
- Virtualización