Tłumaczenie binarne - Binary translation

W informatyce , tłumaczenie binarny jest formą rekompilacji binarnym gdzie sekwencje instrukcji są przeliczane z źródło zestawu instrukcji do docelowego zestawu instrukcji. W niektórych przypadkach, takich jak symulacja zestawu instrukcji , docelowy zestaw instrukcji może być taki sam jak zestaw instrukcji źródłowych, zapewniając funkcje testowania i debugowania, takie jak śledzenie instrukcji, warunkowe punkty przerwania i wykrywanie punktów aktywnych.

Dwa główne typy to statyczne i dynamiczne tłumaczenie binarne. Tłumaczenie może odbywać się sprzętowo (na przykład przez obwody w CPU ) lub w oprogramowaniu (np. Silniki wykonawcze, rekompilator statyczny, emulatory).

Motywacja

Tłumaczenie binarne jest motywowane brakiem pliku binarnego dla platformy docelowej, brakiem kodu źródłowego do kompilacji dla platformy docelowej lub innymi trudnościami w kompilacji źródła dla platformy docelowej.

Statycznie rekompilowane pliki binarne działają potencjalnie szybciej niż ich odpowiednie emulowane pliki binarne, ponieważ narzut emulacji jest usuwany. Jest to podobne do ogólnej różnicy w wydajności między programami interpretowanymi i skompilowanymi.

Statyczne tłumaczenie binarne

Translator używający statycznej translacji binarnej ma na celu przekonwertowanie całego kodu pliku wykonywalnego na kod działający w architekturze docelowej bez konieczności uprzedniego uruchamiania kodu, tak jak ma to miejsce w przypadku dynamicznego tłumaczenia binarnego. Jest to bardzo trudne do wykonania poprawnie, ponieważ nie cały kod może zostać odnaleziony przez tłumacza. Na przykład niektóre części pliku wykonywalnego mogą być osiągalne tylko przez gałęzie pośrednie , których wartość jest znana tylko w czasie wykonywania.

Jeden z takich statycznych translatorów binarnych wykorzystuje uniwersalną technologię superoptymalizatora wizjera (opracowaną przez Sorava Bansala i Alexa Aikena z Uniwersytetu Stanforda ) w celu wykonania wydajnego tłumaczenia między prawdopodobnie wieloma parami źródła i celu, przy znacznie niskich kosztach rozwoju i wysokiej wydajności docelowego pliku binarnego. W eksperymentach z tłumaczeniem PowerPC na x86 niektóre pliki binarne przewyższały nawet wersje natywne, ale średnio działały z dwiema trzecimi szybkości natywnej.

Przykłady statycznych tłumaczeń binarnych

Firma Honeywell dostarczyła program o nazwie Liberator do swojej serii komputerów Honeywell 200 ; może tłumaczyć programy dla serii komputerów IBM 1400 na programy dla serii Honeywell 200.

W 2014 roku gra wideo StarCraft z 1998 roku w wersji ARM została wygenerowana w architekturze przez statyczną rekompilację i dodatkową inżynierię wsteczną oryginalnej wersji x86 . Społeczność komputerów kieszonkowych Pandory była w stanie samodzielnie opracować wymagane narzędzia i kilkakrotnie z powodzeniem uzyskać takie tłumaczenia.

Na przykład udana statyczna rekompilacja x86- x64 została wygenerowana dla proceduralnego generatora terenu gry wideo Cube World w 2014 roku.

Innym przykładem jest statycznie przekompilowana wersja gry wideo Super Mario Bros. z NES -na- x86, która została wygenerowana przy użyciu LLVM w 2013 roku.

W 2004 roku Scott Elliott i Phillip R. Hutchinson z Nintendo opracowali narzędzie do generowania kodu „C” z pliku binarnego Game Boy, który można następnie skompilować dla nowej platformy i powiązać z biblioteką sprzętową do użytku w systemach rozrywki lotniczej.

W 1995 roku Norman Ramsey z Bell Communications Research i Mary F. Fernandez z Wydziału Informatyki Uniwersytetu Princeton opracowali The New Jersey Machine-Code Toolkit, który zawierał podstawowe narzędzia do statycznego tłumaczenia asemblera.

Dynamiczne tłumaczenie binarne

Dynamiczne tłumaczenie binarne (DBT) analizuje krótką sekwencję kodu - zazwyczaj w kolejności pojedynczego bloku podstawowego - następnie tłumaczy ją i zapisuje w pamięci podręcznej wynikową sekwencję. Kod jest tłumaczony tylko wtedy, gdy został wykryty i gdy jest to możliwe, a instrukcje rozgałęzienia wskazują na już przetłumaczony i zapisany kod ( zapamiętanie ).

Dynamiczne tłumaczenie binarne różni się od prostej emulacji (eliminując główną pętlę odczytu, dekodowania i wykonywania emulatora - główne wąskie gardło wydajności), płacąc za to dużym narzutem podczas tłumaczenia. Mamy nadzieję, że ten narzut zostanie zamortyzowany, ponieważ przetłumaczone sekwencje kodu są wykonywane wiele razy.

Bardziej zaawansowane translatory dynamiczne stosują dynamiczną rekompilację, w której przetłumaczony kod jest instrumentowany, aby dowiedzieć się, które części są wykonywane wiele razy, a te części są agresywnie optymalizowane . Technika ta przypomina kompilator JIT , aw rzeczywistości takie kompilatory (np Sun „s HotSpot technology) można postrzegać jako dynamiczne tłumaczy z wirtualnego zestawu instrukcji (The kodu bajtowego ) do rzeczywistego.

Przykłady dynamicznych tłumaczeń binarnych w oprogramowaniu

  • Apple Computer wprowadziła dynamicznego tłumaczenia emulator dla m68k kodu w ich PowerPC linii Macintosh , które osiągnęły bardzo wysoki poziom niezawodności, wydajności i kompatybilności (patrz Mac 68K ). Pozwoliło to Apple na wprowadzenie na rynek maszyn z tylko częściowo natywnym systemem operacyjnym , a użytkownicy końcowi mogli przyjąć nową, szybszą architekturę bez ryzyka inwestycji w oprogramowanie. Częściowo dlatego, że emulator był tak udany, wiele części systemu operacyjnego pozostało emulowanych. Pełne przejście na natywny system operacyjny (OS) PowerPC nastąpiło dopiero po wydaniu systemu Mac OS X (10.0) w 2001 r. ( Środowisko wykonawcze Mac OS X „ Classic ” nadal oferowało tę możliwość emulacji na komputerach PowerPC Mac do czasu wprowadzenia systemu Mac OS X 10.5 .)
  • W systemie Mac OS X 10.4.4 dla komputerów Mac z procesorem Intel wprowadzono dynamiczną warstwę tłumaczenia Rosetta , aby ułatwić Apple przejście ze sprzętu opartego na PPC na x86. Opracowane dla Apple przez Transitive Corporation oprogramowanie Rosetta jest implementacją rozwiązania QuickTransit firmy Transitive .
  • QuickTransit przez cały okres eksploatacji zapewniał również obsługę tłumaczeń SPARCx86 , x86 → PowerPC i MIPSItanium 2 .
  • DEC osiągnął podobny sukces dzięki swoim narzędziom tłumaczeniowym, które pomagają użytkownikom w migracji z architektury CISC VAX do architektury Alpha RISC .
  • HP ARIES (Automatic Re-translation and Integrated Environment Simulation) to dynamiczny system tłumaczenia binarnego oprogramowania, który łączy szybką interpretację kodu z dwufazową dynamiczną translacją w celu przejrzystego i dokładnego wykonywania aplikacji HP 9000 HP-UX na HP-UX 11i dla serwerów HPE Integrity . Szybki interpreter ARIES emuluje pełny zestaw nieuprzywilejowanych instrukcji PA-RISC bez interwencji użytkownika. Podczas interpretacji monitoruje wzorzec wykonywania aplikacji i tłumaczy tylko często wykonywany kod na natywny kod Itanium w czasie wykonywania. ARIES implementuje dwufazowe tłumaczenie dynamiczne, technikę, w której przetłumaczony kod w pierwszej fazie zbiera informacje o profilu w czasie wykonywania, które są wykorzystywane podczas tłumaczenia drugiej fazy w celu dalszej optymalizacji przetłumaczonego kodu. ARIES przechowuje kod tłumaczony dynamicznie w buforze pamięci zwanym pamięcią podręczną kodu. Dalsze odniesienia do przetłumaczonych bloków podstawowych są wykonywane bezpośrednio w pamięci podręcznej kodu i nie wymagają dodatkowej interpretacji ani tłumaczenia. Cele przetłumaczonych bloków kodu są naprawiane wstecz, aby zapewnić wykonanie przez większość czasu w pamięci podręcznej kodu. Pod koniec emulacji ARIES odrzuca cały przetłumaczony kod bez modyfikowania oryginalnej aplikacji. Silnik emulacji ARIES implementuje również emulację środowiska, która emuluje wywołania systemowe aplikacji HP 9000 HP-UX , dostarczanie sygnałów, zarządzanie wyjątkami, zarządzanie wątkami, emulację HP GDB do debugowania i tworzenie podstawowych plików dla aplikacji.
  • DEC stworzył translator binarny FX! 32 do konwersji aplikacji x86 na aplikacje Alpha.
  • Sun Microsystems ' Wabi oprogramowanie dołączone tłumaczenie dynamiczny od x86 do instrukcji SPARC.
  • W styczniu 2000 r. Transmeta Corporation ogłosiła nowatorski projekt procesora o nazwie Crusoe . Z często zadawanych pytań na ich stronie internetowej,

    Inteligentny mikroprocesor składa się ze sprzętowego rdzenia VLIW jako jego silnika i warstwy oprogramowania zwanej oprogramowaniem Code Morphing. Oprogramowanie Code Morphing działa jak powłoka […] morfująca lub tłumacząca instrukcje x86 na natywne instrukcje Crusoe. Ponadto oprogramowanie Code Morphing zawiera dynamiczny kompilator i optymalizator kodu […] Rezultatem jest zwiększona wydajność przy najmniejszej ilości energii. […] [To] pozwala firmie Transmeta osobno rozwijać sprzęt VLIW i oprogramowanie Code Morphing bez wpływu na ogromną bazę aplikacji.

  • Firma Intel Corporation opracowała i wdrożyła warstwę wykonawczą IA-32 - dynamiczny translator binarny przeznaczony do obsługi aplikacji IA-32 w systemach z procesorem Itanium , który został uwzględniony w Microsoft Windows Server dla architektury Itanium , a także w kilku odmianach systemu Linux , w tym Red Hat and Suse . Pozwoliło to aplikacjom IA-32 działać szybciej niż przy użyciu natywnego trybu IA-32 na procesorach Itanium.
  • Dolphin (emulator dla GameCube / Wii ) wykonuje rekompilację JIT kodu PowerPC do x86 i AArch64.

Przykłady dynamicznych tłumaczeń binarnych w sprzęcie

  • Procesory Intel x86 od czasu Pentium Pro tłumaczą złożone instrukcje CISC x86 na wewnętrzne mikro operacje podobne do RISC .
  • Nvidia Tegra K1 Denver tłumaczy instrukcje ARM przez powolny dekoder sprzętowy na jego natywne instrukcje mikrokodu i używa programowego translatora binarnego dla gorącego kodu.

Zobacz też

Bibliografia

Dalsza lektura