stringtranslate.com

Traducción binaria

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 de origen al conjunto de instrucciones de destino. En algunos casos, como la simulación del conjunto de instrucciones , el conjunto de instrucciones de destino puede ser el mismo que el conjunto de instrucciones de origen, 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 puede realizarse en hardware (por ejemplo, mediante circuitos en una CPU ) o en software (por ejemplo, motores de tiempo de ejecución, recompiladores estáticos, 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 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 emulación. Esto es similar a la diferencia de rendimiento entre los programas interpretados y compilados en general.

Traducción binaria estática

Un traductor que utiliza la 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, es posible que algunas partes del ejecutable solo sean accesibles a través de ramas indirectas , cuyo valor se conoce solo en tiempo de ejecución.

Un traductor binario estático de este tipo utiliza la tecnología de superoptimizador 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 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 funcionaron a dos tercios de la velocidad nativa. [1]

Ejemplos de traducciones binarias estáticas

Honeywell proporcionó un programa llamado Liberator para su serie de computadoras Honeywell 200 ; podía traducir programas para la serie de computadoras IBM 1400 en programas para la serie Honeywell 200. [2]

En 2014, se generó una versión de arquitectura ARM del videojuego StarCraft de 1998 mediante recompilación estática e ingeniería inversa adicional de la versión x86 original. [3] [4] La comunidad portátil Pandora fue capaz de desarrollar las herramientas necesarias [5] por su cuenta y lograr dichas traducciones con éxito varias veces. [6] [7]

Por ejemplo, en 2014 se generó una recompilación estática exitosa de x86 a x64 para el generador de terreno procedimental del videojuego Cube World. [8]

Otro ejemplo es la versión recompilada estáticamente de NES a x86 del videojuego Super Mario Bros. que se generó bajo el uso de LLVM en 2013. [9]

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 con una biblioteca de hardware para su uso en sistemas de entretenimiento de aerolíneas. [10]

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 el New Jersey Machine-Code Toolkit que tenía las herramientas básicas para la traducción de ensamblaje estático. [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 ) y 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 bifurcación se crean para apuntar al código ya traducido y guardado ( memoización ).

La traducción binaria dinámica difiere de la emulación simple (elimina el bucle principal de lectura-decodificación-ejecución del emulador, un importante cuello de botella en el rendimiento), y esto se paga con 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 una recompilació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 de forma agresiva. 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 virtuales (el bytecode ) a uno real.

Ejemplos de traducciones binarias dinámicas en software

Ejemplos de traducciones binarias dinámicas en hardware

Véase también

Referencias

  1. ^ Bansal, Sorav; Aiken, Alex (diciembre de 2008). "Traducción binaria mediante superoptimizadores de mirilla" (PDF) . Actas de la octava conferencia USENIX sobre diseño e implementación de sistemas operativos . pp. 177–192.
  2. ^ 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 varios otros sistemas de procesamiento, a saber, la serie IBM 1400, como para permitir la traducción automatizada y única de programas escritos para estos sistemas competitivos a un formato adecuado para su ejecución en sistemas de la serie 200 de mayor rendimiento.
  3. ^ 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 .
  4. ^ notaz (4 de marzo de 2014). "StarCraft". repo.openpandora.org . Consultado el 26 de marzo de 2014 .
  5. ^ notaz (1 de marzo de 2014). "ia32rtools/". GitHub . Consultado el 9 de enero de 2015 .
  6. ^ notaz (4 de marzo de 2014). "Starcraft". openpandora.org . Consultado el 29 de marzo de 2014. La regla " sin código fuente, no hay puerto" no es completamente cierta, se puede obtener algo similar (pero no lo mismo) como puerto a través de una recompilación estática. M-HT hizo cosas similares varias veces para algunos juegos de DOS. El juego también se convirtió para Android con un enfoque bastante similar.
  7. ^ M-HT. "Warcraft: Orcos y humanos". repo.openpandora.org.
  8. ^ Kærlev, Mathias (14 de abril de 2014). "Recompilación X86 práctica y portátil" . Consultado el 8 de agosto de 2014. Pero entonces se nos ocurrió la idea de usar de alguna manera el código de máquina x86 original . Sin embargo, para nuestro servidor abierto, también necesitamos compatibilidad 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.
  9. ^ 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 desensamblar y recompilar estáticamente juegos de Nintendo Entertainment System en ejecutables nativos.
  10. ^ US 7765539, Elliott, Scott y Hutchinson, Phillip, "Sistema y método para transcompilar videojuegos", publicado en 2010 
  11. ^ Ramsey, Norman; Fernandez, Mary F. (1995). "El kit de herramientas de código de máquina de Nueva Jersey". Actas TCON'95 Actas de la Conferencia técnica de USENIX de 1995. Asociación USENIX Berkeley, CA, EE. UU., pág. 24.
  12. ^ ab Wharton, John Harrison (1994-08-01). "Gary Kildall, pionero de la industria, murió a los 52 años: creó los primeros lenguajes de microcomputadoras, sistemas operativos de disco". Microprocessor Report . 8 (10). MicroDesign Resources Inc. (MDR). Archivado desde el original el 2016-11-18 . Consultado el 2016-11-18 . […] Irónicamente, muchas de las técnicas que Gary inició 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 software existente a la arquitectura PowerPC o Alpha . En realidad, DRI introdujo un recompilador binario de 8080 a 8086 a principios de los años 1980. […]
  13. ^ Carlson, Jim; Huck, Jerry (2003). Itanium Rising: rompiendo con la segunda ley de Moore sobre potencia de computación. Prentice Hall PTR. ISBN 978-0-13046415-6. Recuperado el 9 de enero de 2015 .
  14. ^ "Traductor binario dinámico HP ARIES". HP . Archivado desde el original el 10 de enero de 2015 . Consultado el 9 de enero de 2015 .
  15. ^ Stokes, Jon. "Transmeta Crusoe Explored". Ars Technica . Consultado el 9 de enero de 2015 .
  16. ^ Hughes, Rob (20 de enero de 2000). "El microprocesador Crusoe de Transmeta". geek.com . Archivado desde el original el 27 de septiembre de 2007.
  17. ^ "Preguntas frecuentes sobre el procesador Transmeta Crusoe". Transmeta . 2007. Archivado desde el original el 10 de enero de 2007.

Lectura adicional