Tradução binária - Binary translation

Na computação , a tradução binária é uma forma de recompilação binária onde sequências de instruções são traduzidas de um conjunto de instruções de origem para o conjunto de instruções de destino . Em alguns casos, como simulação de conjunto de instruções , o conjunto de instruções de destino pode ser o mesmo que o conjunto de instruções de origem, fornecendo recursos de teste e depuração, como rastreamento de instrução, pontos de interrupção condicionais e detecção de hot spot .

Os dois tipos principais são tradução binária estática e dinâmica. A tradução pode ser feita em hardware (por exemplo, por circuitos em uma CPU ) ou em software (por exemplo, motores de tempo de execução, recompilador estático, emuladores).

Motivação

A tradução binária é motivada pela falta de um binário para uma plataforma de destino, a falta de código-fonte para compilar para a plataforma de destino ou outra dificuldade em compilar a fonte para a plataforma de destino.

Binários recompilados estaticamente são executados potencialmente mais rápido do que seus respectivos binários emulados, pois a sobrecarga de emulação é removida. Isso é semelhante à diferença de desempenho entre programas interpretados e compilados em geral.

Tradução binária estática

Um tradutor que usa tradução binária estática tem como objetivo converter todo o código de um arquivo executável em código que é executado na arquitetura de destino, sem ter que executar o código primeiro, como é feito na tradução binária dinâmica. Isso é muito difícil de fazer corretamente, pois nem todo o código pode ser descoberto pelo tradutor. Por exemplo, algumas partes do executável podem ser alcançadas apenas por meio de ramificações indiretas , cujo valor é conhecido apenas em tempo de execução.

Um tal tradutor binário estático usa a tecnologia de olho mágico superotimizador universal (desenvolvida por Sorav Bansal e Alex Aiken da Universidade de Stanford ) para realizar uma tradução eficiente entre possivelmente muitos pares de origem e destino, com custos de desenvolvimento consideravelmente baixos e alto desempenho do binário alvo. Em experimentos de conversão de PowerPC para x86, alguns binários até superaram as versões nativas, mas, em média, funcionaram a dois terços da velocidade nativa.

Exemplos para traduções binárias estáticas

A Honeywell forneceu um programa chamado Liberator para sua série Honeywell 200 de computadores; ele poderia traduzir programas para a série de computadores IBM 1400 em programas para a série Honeywell 200.

Em 2014, uma versão de arquitetura ARM do videogame StarCraft de 1998 foi gerada por recompilação estática e engenharia reversa adicional da versão x86 original . A comunidade de dispositivos portáteis Pandora foi capaz de desenvolver as ferramentas necessárias por conta própria e realizar essas traduções com sucesso várias vezes.

Por exemplo, uma recompilação estática de x86 para x64 bem-sucedida foi gerada para o gerador de terreno procedural do videogame Cube World em 2014.

Outro exemplo é a versão NES -to- x86 estaticamente recompilada do videogame Super Mario Bros. que foi gerado sob o uso do LLVM em 2013.

Em 2004, Scott Elliott e Phillip R. Hutchinson da Nintendo desenvolveram uma ferramenta para gerar código "C" a partir do binário do Game Boy que poderia então ser compilado para uma nova plataforma e vinculado a uma biblioteca de hardware para uso em sistemas de entretenimento de companhias aéreas.

Em 1995, Norman Ramsey da Bell Communications Research e Mary F. Fernandez do Departamento de Ciência da Computação da Universidade de Princeton desenvolveram o kit de ferramentas de código de máquina de New Jersey, que tinha as ferramentas básicas para tradução de montagens estáticas.

Tradução binária dinâmica

A tradução binária dinâmica (DBT) examina uma sequência curta de código - normalmente na ordem de um único bloco básico - e a traduz e armazena em cache a sequência resultante. O código só é traduzido à medida que é descoberto e quando possível, e as instruções de desvio são feitas para apontar para o código já traduzido e salvo ( memoização ).

A tradução binária dinâmica difere da emulação simples (eliminando o loop principal de leitura-decodificação-execução do emulador - um grande gargalo de desempenho), pagando por isso por uma grande sobrecarga durante o tempo de tradução. Esperançosamente, essa sobrecarga é amortizada, pois as sequências de código traduzidas são executadas várias vezes.

Tradutores dinâmicos mais avançados empregam recompilação dinâmica em que o código traduzido é instrumentado para descobrir quais partes são executadas um grande número de vezes, e essas partes são otimizadas agressivamente. Esta técnica é uma reminiscência de um compilador JIT e, de fato, tais compiladores (por exemplo , a tecnologia HotSpot da Sun ) podem ser vistos como tradutores dinâmicos de um conjunto de instruções virtual ( bytecode ) para um real.

Exemplos para traduções binárias dinâmicas em software

  • A Apple Computer implementou um emulador de tradução dinâmica para o código M68K em sua linha PowerPC de Macintoshes , que alcançou um nível muito alto de confiabilidade, desempenho e compatibilidade (veja emulador Mac 68K ). Isso permitiu que a Apple colocasse as máquinas no mercado apenas com um sistema operacional parcialmente nativo , e os usuários finais pudessem adotar a nova e mais rápida arquitetura sem arriscar seu investimento em software. Em parte porque o emulador foi muito bem-sucedido, muitas partes do sistema operacional permaneceram emuladas. Uma transição completa para um sistema operacional (OS) nativo PowerPC não foi feita até o lançamento do Mac OS X (10.0) em 2001. (O ambiente de execução " Classic " do Mac OS X continuou a oferecer esta capacidade de emulação em Macs PowerPC até o Mac OS X 10.5 .)
  • O Mac OS X 10.4.4 para Macs baseados em Intel introduziu a camada de tradução dinâmica Rosetta para facilitar a transição da Apple de hardware baseado em PPC para x86. Desenvolvido para a Apple pela Transitive Corporation , o software Rosetta é uma implementação da solução QuickTransit da Transitive .
  • Durante a vida útil do produto, o QuickTransit também forneceu suporte para tradução SPARCx86 , x86 → PowerPC e MIPSItanium 2 .
  • A DEC alcançou sucesso semelhante com suas ferramentas de tradução para ajudar os usuários a migrar da arquitetura CISC VAX para a arquitetura Alpha RISC .
  • HP ARIES (Retrotradução automática e simulação de ambiente integrado) é um sistema de tradução binária dinâmica de software que combina interpretação rápida de código com tradução dinâmica de duas fases para executar aplicativos HP 9000 HP-UX de maneira transparente e precisa no HP-UX 11i para servidores de integridade HPE . O interpretador rápido ARIES emula um conjunto completo de instruções PA-RISC não privilegiadas sem intervenção do usuário. Durante a interpretação, ele monitora o padrão de execução do aplicativo e converte apenas o código executado com frequência em código Itanium nativo em tempo de execução. ARIES implementa tradução dinâmica de duas fases, uma técnica em que o código traduzido na primeira fase coleta informações de perfil de tempo de execução que são usadas durante a tradução da segunda fase para otimizar ainda mais o código traduzido. ARIES armazena o código traduzido dinamicamente em um buffer de memória chamado cache de código. Outras referências a blocos básicos traduzidos são executados diretamente no cache de código e não requerem interpretação ou tradução adicional. Os destinos dos blocos de código traduzidos são corrigidos para garantir que a execução ocorra no cache de código na maior parte do tempo. No final da emulação, ARIES descarta todo o código traduzido sem modificar o aplicativo original. O mecanismo de emulação ARIES também implementa a Emulação de Ambiente que emula chamadas de sistema do aplicativo HP 9000 HP-UX , entrega de sinal, gerenciamento de exceção, gerenciamento de threads, emulação de HP GDB para depuração e criação de arquivo principal para o aplicativo.
  • A DEC criou o tradutor binário FX! 32 para converter aplicativos x86 em aplicativos Alpha.
  • O software Wabi da Sun Microsystems incluiu tradução dinâmica de instruções x86 para SPARC.
  • Em janeiro de 2000, a Transmeta Corporation anunciou um novo design de processador chamado Crusoe . Do FAQ em seu site,

    O microprocessador inteligente consiste em um núcleo VLIW de hardware como seu mecanismo e uma camada de software chamada software Code Morphing. O software Code Morphing atua como um shell [...] transformando ou traduzindo instruções x86 para instruções Crusoe nativas. Além disso, o software Code Morphing contém um compilador dinâmico e otimizador de código [...] O resultado é um desempenho aprimorado com a menor quantidade de energia. […] [Isso] permite que a Transmeta desenvolva o hardware VLIW e o software Code Morphing separadamente, sem afetar a enorme base de aplicativos de software.

  • A Intel Corporation desenvolveu e implementou um IA-32 Execution Layer - um tradutor binário dinâmico projetado para oferecer suporte a aplicativos IA-32 em sistemas baseados em Itanium , que foi incluído na arquitetura do Microsoft Windows Server para Itanium , bem como em vários sabores de Linux , incluindo Red Hat e Suse . Ele permitiu que os aplicativos IA-32 rodassem mais rápido do que fariam usando o modo nativo IA-32 em processadores Itanium.
  • Dolphin (um emulador para GameCube / Wii ) realiza recompilação JIT de código PowerPC para x86 e AArch64.

Exemplos para traduções binárias dinâmicas em hardware

  • x86 CPUs Intel desde o Pentium Pro traduzir complexos CISC instruções x86 a mais RISC internos -como micro-operações .
  • O Nvidia Tegra K1 Denver traduz as instruções ARM de um decodificador de hardware lento para suas instruções de microcódigo nativas e usa um tradutor binário de software para código quente.

Veja também

Referências

Leitura adicional