En informática , la traducción binaria es una forma de recompilación binaria en la que las secuencias de instrucciones se traducen de un conjunto de instrucciones de origen al conjunto de instrucciones de destino . En algunos casos, como la simulación de conjuntos de instrucciones , el conjunto de instrucciones de destino puede ser el mismo que el conjunto de instrucciones de origen, proporcionando funciones de prueba y depuración como seguimiento de instrucciones, puntos de interrupción condicionales y detección de puntos calientes .
Los dos tipos principales son la traducción binaria estática y 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, recompilador estático, emuladores).
Motivación
La traducción binaria está motivada por la falta de un binario para una plataforma de destino, la falta de código fuente para compilar para la plataforma de destino o la dificultad de 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 emulación. Esto es similar a la diferencia de rendimiento entre programas interpretados y compilados en general.
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 ejecuta en la arquitectura de destino sin tener que ejecutar el código primero, como se hace en la traducción binaria dinámica. Esto es muy difícil de hacer correctamente, ya que el traductor no puede descubrir todo el código. Por ejemplo, algunas partes del ejecutable pueden ser accesibles solo a través de ramas indirectas , cuyo valor solo se conoce en tiempo de ejecución.
Uno de estos traductores binarios estáticos utiliza la tecnología de mirilla superoptimizadora universal (desarrollada por Sorav Bansal y Alex Aiken de la Universidad de Stanford ) para realizar una traducción eficiente entre posiblemente muchos pares de origen y destino, con costos de desarrollo considerablemente bajos y 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.
Ejemplos de traducciones binarias estáticas
Honeywell proporcionó un programa llamado Liberator para su serie de computadoras Honeywell 200 ; podría traducir programas para la serie de computadoras IBM 1400 en programas para la serie Honeywell 200. [1]
En 2014, se generó una versión de arquitectura ARM del videojuego StarCraft de 1998 mediante la recopilación estática y la ingeniería inversa adicional de la versión x86 original . [2] [3] La comunidad de dispositivos portátiles de Pandora fue capaz de desarrollar las herramientas necesarias [4] por su cuenta y lograr tales traducciones con éxito varias veces. [5] [6]
Por ejemplo, se generó una recopilación estática de x86 a x64 con éxito para el generador de terreno procedimental del videojuego Cube World en 2014. [7]
Otro ejemplo es la versión NES -to- x86 recompilada estáticamente del videojuego Super Mario Bros. que se generó con el uso de LLVM en 2013. [8]
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 podría compilarse para una nueva plataforma y vincularse a una biblioteca de hardware para su uso en sistemas de entretenimiento de aerolíneas. [9]
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 tenía las herramientas básicas para la traducción de ensamblajes estáticos. [10]
Traducción binaria dinámica
La traducción binaria dinámica (DBT) examina una secuencia corta de código, generalmente del orden de un solo bloque básico, luego la traduce y almacena en caché la secuencia resultante. El código solo se traduce a medida que se descubre y cuando es posible, y las instrucciones de la rama se hacen para apuntar al código ya traducido y guardado ( memorización ).
La traducción binaria dinámica difiere de la emulación simple (eliminando el bucle principal de lectura, decodificación y ejecución del emulador, un cuello de botella importante en el rendimiento), y esto se paga con una gran sobrecarga durante el tiempo de traducción. Se espera que esta sobrecarga se amortice ya que las secuencias de código traducidas se ejecutan varias veces.
Los traductores dinámicos más avanzados emplean la recopilación dinámica en la que el código traducido se instrumenta para averiguar qué partes se ejecutan una gran cantidad de veces, y estas partes se optimizan agresivamente. Esta técnica recuerda a un compilador JIT y, de hecho, dichos compiladores (por ejemplo , la tecnología HotSpot de Sun ) pueden verse como traductores dinámicos de un conjunto de instrucciones virtuales (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 código M68K en su línea PowerPC de Macintosh , [11] que logró un nivel muy alto de confiabilidad, desempeño y compatibilidad (ver Emulador Mac 68K ). Esto permitió a Apple llevar las máquinas al mercado con solo 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 porque el emulador tuvo tanto éxito, muchas partes del sistema operativo permanecieron emuladas. No se realizó una transición completa a un sistema operativo (SO) nativo de PowerPC 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 PowerPC Macs hasta Mac OS X 10,5 .)
- Mac OS X 10.4.4 para Mac basadas en 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 la vida útil de su producto, QuickTransit también proporcionó compatibilidad con traducción 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 . [ cita requerida ]
- HP ARIES (Retraducción automática y simulación de entorno integrado) es un sistema de traducción binaria dinámica de software [12] que combina la interpretación rápida de código con la traducción dinámica de dos fases para ejecutar de forma transparente y precisa aplicaciones HP 9000 HP-UX en HP-UX 11i para HPE Servidores de integridad . [13] El intérprete rápido ARIES emula un conjunto completo de instrucciones PA-RISC sin privilegios sin la 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 que se ejecuta con frecuencia al código nativo de Itanium en tiempo de ejecución. ARIES implementa la traducción dinámica en dos fases, una técnica en la que el código traducido en la primera fase recopila información del perfil en 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 adicionales a los bloques básicos traducidos se ejecutan directamente en la caché de código y no requieren interpretación o traducción adicional. Los destinos de los bloques de código traducidos se revisan para garantizar que la ejecución se lleve a cabo en la caché de código la mayor parte del tiempo. Al final de 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 Environment Emulation que emula las llamadas al sistema de una aplicación HP 9000 HP-UX , entrega de señal, administración de excepciones, administración de subprocesos, emulación de HP GDB para depuración y creación de archivos centrales para la aplicación.
- DEC creó el traductor binario FX! 32 para convertir aplicaciones x86 en aplicaciones Alpha. [11]
- El software Wabi de Sun Microsystems incluía traducción dinámica de x86 a instrucciones SPARC.
- En enero de 2000, Transmeta Corporation anunció un nuevo diseño de procesador llamado Crusoe . [14] [15] De las preguntas frecuentes [16] en su sitio web,
El microprocesador inteligente consta de un núcleo VLIW de hardware como motor y una capa de software llamada software Code Morphing. El software Code Morphing actúa como un shell […] transformando o traduciendo instrucciones x86 a instrucciones nativas de Crusoe. Además, el software Code Morphing contiene un compilador dinámico y un optimizador de código […] El resultado es un mayor rendimiento con la menor cantidad de energía. […] [Esto] permite a Transmeta desarrollar el hardware VLIW y el software Code Morphing por separado sin afectar la enorme base de aplicaciones de software.
- 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 , que se incluyó en Microsoft Windows Server para la arquitectura Itanium , así como en varias versiones de Linux , incluyendo Red Hat y Suse . Permitió que las aplicaciones IA-32 se ejecutaran más rápido de lo que lo harían con 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.
Ejemplos de traducciones binarias dinámicas en hardware
- Las CPU Intel x86 desde el Pentium Pro traducen las complejas instrucciones CISC x86 a más microoperaciones internas similares a RISC .
- Nvidia Tegra K1 Denver traduce las instrucciones ARM a través de un descodificador de hardware lento a sus instrucciones de microcódigo nativo y utiliza un traductor binario de software para código activo. [ cita requerida ]
Ver también
- Optimización binaria
- Recopilación binaria
- Recopilación dinámica
- Recopilación justo a tiempo
- Simulador de conjunto de instrucciones
- Emulador
- Máquina virtual
- Comparación de software de virtualización de plataformas
- Memoria de las sombras
Referencias
- ^ Descripción resumida de Honeywell Series 200 (PDF) . Honeywell . Febrero de 1966. p. 11.
Por ejemplo, el repertorio de instrucciones de los procesadores de la serie 200 es lo suficientemente similar a los de varios otros sistemas de procesamiento, a saber, la serie IBM 1400, para permitir la traducción automática y única de programas escritos para estos sistemas competitivos a una forma adecuada. para ejecución en sistemas Serie 200 de mayor rendimiento.
- ^ 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 (4 de marzo de 2014). "StarCraft" . repo.openpandora.org . Consultado el 26 de marzo de 2014 .
- ^ notaz (1 de marzo de 2014). "ia32rtools /" . GitHub . Consultado el 9 de enero de 2015 .
- ^ notaz (4 de marzo de 2014). "Starcraft" . openpandora.org . Consultado el 29 de marzo de 2014 .
La regla "sin fuente, sin puerto" no es completamente cierta, puede obtener algo similar (pero no lo mismo) que un puerto a través de la recompilación estática. M-HT hizo varias veces cosas similares para algunos juegos de DOS. El juego también se convirtió para Android con un enfoque algo similar.
- ^ M-HT. "Warcraft: Orcos y humanos" . repo.openpandora.org.
- ^ Kærlev, Mathias (14 de abril de 2014). "Recopilación de X86 Práctica y Portátil" . Consultado el 8 de agosto de 2014 .
pero luego se presentó la idea de usar de alguna manera el código de máquina x86 original. Sin embargo, para nuestro servidor abierto, también necesitamos ser compatible con x86-64, y en ese caso, necesitamos absolutamente emulación o recompilación. […] La recompilación estática en 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.
- ^ Kelley, Andrew (7 de julio de 2013). "Recompilación estática de juegos de NES en ejecutables nativos con LLVM y Go" . Consultado el 8 de agosto de 2013 .
Este artículo presenta una investigación original sobre la posibilidad de desmontar y recompilar estáticamente juegos de Nintendo Entertainment System en ejecutables nativos.
- ^ US 7765539 , Elliott, Scott & Phillip Hutchinson, "Sistema y método para trans-compilar videojuegos", publicado en 2010
- ^ Ramsey, Norman; Fernández, Mary F. (1995). "Kit de herramientas de código de máquina de Nueva Jersey" . Proceeding TCON'95 Proceedings of the USENIX 1995 Technical Conference Proceedings . Asociación USENIX Berkeley, CA, EE.UU .: 24.
- ^ a b Wharton, John Harrison (1 de agosto de 1994). "Gary Kildall, pionero de la industria, muerto a los 52: creó los primeros lenguajes de microcomputadoras, sistemas operativos de disco" . Informe del microprocesador . MicroDesign Resources Inc. (MDR). 8 (10). Archivado desde el original el 18 de noviembre de 2016 . Consultado el 18 de noviembre de 2016 .
[…] Irónicamente, muchas de las técnicas en las que Gary fue pionero se están redescubriendo ahora, diez años después. Apple y DEC están promocionando la recompilación binaria como una "nueva" tecnología para trasladar el software existente a la arquitectura PowerPC o Alpha . En realidad, DRI introdujo un recompilador binario 8080 -to- 8086 a principios de la década de 1980. […]
- ^ Carlson, Jim; Huck, Jerry (2003). Itanium Rising: Rompiendo la Segunda Ley del Poder Informático de Moore . PTR de Prentice Hall. ISBN 978-0-13046415-6. Consultado el 9 de enero de 2015 .
- ^ "Traductor binario dinámico HP ARIES" . HP . Consultado el 9 de enero de 2015 .
- ^ Stokes, Jon. "Transmeta Crusoe Explorado" . Ars Technica . Consultado el 9 de enero de 2015 .
- ^ Hughes, Rob (20 de enero de 2000). "Microprocesador Crusoe de Transmeta" . geek.com . Archivado desde el original el 27 de septiembre de 2007.
- ^ "Preguntas frecuentes sobre el procesador Transmeta Crusoe FAQ" . Transmeta . 2007. Archivado desde el original el 10 de enero de 2007 .
Otras lecturas
- Haber, Gadi (2010). "Introducción a la traducción binaria" (PDF) . Intel . Archivado desde el original (PDF) el 2016-03-09 . Consultado el 30 de marzo de 2014 .
- Bansal, Sorav; Aiken, Alex (diciembre de 2008). "Traducción binaria utilizando superoptimizadores de mirilla" . Departamento de Ingeniería y Ciencias de la Computación . Instituto Indio de Tecnología de Delhi . Consultado 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 : 191–. ISBN 978-0-7695-2043-8.
- Toal, Graham. "CÓMO de un escritor emulador para traducción binaria estática" .
- Chernoff, Anton; Herdeg, Mark; Hookway, Ray; Reeve, Chris; Rubin, Norman; Tye, Tony; Yadavalli, S. Bharadwaj; Yates, John (1998). "FX! 32: un traductor binario dirigido por perfiles" . IEEE Micro . 18 (2): 56–64. doi : 10.1109 / 40.671403 . ISSN 0272-1732 .
- Souza, Maxwell; Nicácio, Daniel; Araújo, Guido (23 de junio de 2010) [19 de junio de 2010]. ISAMAP: Mapeo de instrucciones impulsado por traducción dinámica . Arquitectura de Computadores - Talleres Internacionales ISCA 2010. Saint-Malo, Francia. págs. 117–. ISBN 9783642243226.
- Chen, Yu-hsin (20 de junio de 2009) [18 de junio de 2009]. "Traducción binaria dinámica de código x86-32 a código x86-64 para virtualización" (PDF) . Instituto de Tecnología de Massachusetts .