Двоичный перевод - Binary translation

В вычислениях , бинарное перевод является формой двоичной перекомпиляции , где последовательности инструкций переводятся из исходных набора команд к цели набору команд. В некоторых случаях, таких как моделирование набора инструкций , целевой набор инструкций может быть таким же, как исходный набор инструкций, обеспечивая функции тестирования и отладки, такие как трассировка инструкций, условные точки останова и обнаружение горячих точек .

Двумя основными типами являются статическая и динамическая двоичная трансляция. Трансляция может выполняться аппаратно (например, схемами в ЦП ) или программно (например, механизмами времени выполнения, статическим рекомпилятором, эмуляторами).

Мотивация

Двоичная трансляция мотивируется отсутствием двоичного кода для целевой платформы, отсутствием исходного кода для компиляции для целевой платформы или иными трудностями при компиляции исходного кода для целевой платформы.

Статически перекомпилированные двоичные файлы работают потенциально быстрее, чем их соответствующие эмулированные двоичные файлы, поскольку накладные расходы на эмуляцию устранены. Это похоже на разницу в производительности между интерпретируемыми и скомпилированными программами в целом.

Статическая двоичная трансляция

Транслятор, использующий статическую двоичную трансляцию, нацелен на преобразование всего кода исполняемого файла в код, который выполняется в целевой архитектуре, без необходимости сначала запускать код, как это делается при динамической двоичной трансляции. Это очень сложно сделать правильно, так как не весь код может быть обнаружен переводчиком. Например, некоторые части исполняемого файла могут быть доступны только через косвенные ветви , значение которых известно только во время выполнения.

В одном из таких статических двоичных трансляторов используется технология универсального супероптимизатора- глазка (разработанная Соравом Бансалом и Алексом Эйкеном из Стэнфордского университета ) для выполнения эффективного перевода между, возможно, множеством исходных и целевых пар, со значительно низкими затратами на разработку и высокой производительностью целевого двоичного файла. В экспериментах по преобразованию PowerPC в x86 некоторые двоичные файлы даже превосходили собственные версии, но в среднем они работали со скоростью две трети от исходной скорости.

Примеры статических двоичных переводов

Honeywell предоставила программу под названием Liberator для компьютеров серии Honeywell 200 ; он мог переводить программы для компьютеров серии IBM 1400 в программы для серии Honeywell 200.

В 2014 году версия видеоигры StarCraft 1998 года с архитектурой ARM была создана путем статической перекомпиляции и дополнительного реверс-инжиниринга исходной версии x86 . Pandora карманным сообщество может развивать необходимые инструменты сами по себе и достижения таких переводов успешно несколько раз.

Например, успешная статическая перекомпиляция x86 в x64 была сгенерирована для процедурного генератора ландшафта видеоигры Cube World в 2014 году.

Другим примером является статически перекомпилированная версия видеоигры Super Mario Bros. для NES- to- x86, созданная с использованием LLVM в 2013 году.

В 2004 году Скотт Эллиотт и Филип Р. Хатчинсон из Nintendo разработали инструмент для генерации кода «C» из двоичного файла Game Boy, который затем можно было скомпилировать для новой платформы и связать с аппаратной библиотекой для использования в развлекательных системах авиакомпаний.

В 1995 году Норман Рэмси из Bell Communications Research и Мэри Фернандес из факультета компьютерных наук Принстонского университета разработали The New Jersey Machine-Code Toolkit, в котором были базовые инструменты для статической трансляции ассемблера.

Динамическая двоичная трансляция

Динамическая двоичная трансляция (DBT) рассматривает короткую последовательность кода - обычно порядка одного базового блока - затем транслирует ее и кэширует полученную последовательность. Код переводится только тогда, когда он обнаруживается и когда это возможно, а инструкции ветвления указываются на уже переведенный и сохраненный код ( мемоизация ).

Динамическая двоичная трансляция отличается от простой эмуляции (устранение основного цикла чтения-декодирования-выполнения эмулятора - основного узкого места производительности), оплачиваемого большими накладными расходами во время трансляции. Мы надеемся, что эти накладные расходы окупятся, поскольку переведенные кодовые последовательности выполняются несколько раз.

Более продвинутые динамические трансляторы используют динамическую перекомпиляцию, при которой переведенный код инструментируется для определения того, какие части выполняются много раз, и эти части агрессивно оптимизируются . Этот метод напоминает JIT компилятором , а на самом деле такие компиляторы (например , Sun «s HotSpot технологии) можно рассматривать как динамические переводчиков из набора виртуальных команд ( байт - кода ) к реальному.

Примеры динамических двоичных переводов в программном обеспечении

  • Apple Computer реализован динамический перевод эмулятор для M68K кода в их PowerPC линии Макинтошей , которая достигла очень высокого уровня надежности, производительности и совместимости (см Mac 68K эмулятор ). Это позволило Apple вывести на рынок машины только с частично встроенной операционной системой , а конечные пользователи могли принять новую, более быструю архитектуру, не рискуя вложениями в программное обеспечение. Отчасти из-за того, что эмулятор был настолько успешным, многие части операционной системы оставались эмулированными. Полный переход на собственную операционную систему (ОС) PowerPC не производился до выпуска Mac OS X (10.0) в 2001 году. (« Классическая » среда выполнения Mac OS X продолжала предлагать эту возможность эмуляции на PowerPC Mac до тех пор, пока Mac OS Х 10.5 .)
  • Mac OS X 10.4.4 для компьютеров Mac на базе Intel представила уровень динамической трансляции Rosetta, чтобы упростить переход Apple с оборудования на базе PPC на x86. Программное обеспечение Rosetta, разработанное для Apple компанией Transitive Corporation , является реализацией решения Transitive QuickTransit .
  • QuickTransit в течение всего срока службы продукта также обеспечивала поддержку перевода SPARCx86 , x86 → PowerPC и MIPSItanium 2 .
  • Компания DEC добилась аналогичного успеха со своими инструментами перевода, которые помогли пользователям перейти с архитектуры CISC VAX на архитектуру Alpha RISC .
  • HP ARIES (автоматический повторный перевод и интегрированное моделирование среды) - это программная система динамического двоичного перевода, которая сочетает быструю интерпретацию кода с двухфазным динамическим преобразованием для прозрачного и точного выполнения приложений HP 9000 HP-UX на HP-UX 11i для серверов HPE Integrity . Быстрый интерпретатор ARIES эмулирует полный набор непривилегированных инструкций PA-RISC без вмешательства пользователя. Во время интерпретации он отслеживает схему выполнения приложения и переводит только часто выполняемый код в собственный код Itanium во время выполнения. ARIES реализует двухэтапную динамическую трансляцию, методику, при которой транслируемый код на первом этапе собирает информацию профиля времени выполнения, которая используется во время трансляции второго этапа для дальнейшей оптимизации переведенного кода. ARIES хранит динамически транслируемый код в буфере памяти, называемом кешем кода. Дальнейшие ссылки на переведенные базовые блоки выполняются непосредственно в кэше кода и не требуют дополнительной интерпретации или перевода. Цели переведенных блоков кода исправлены, чтобы гарантировать, что выполнение происходит в кэше кода большую часть времени. В конце эмуляции ARIES удаляет весь переведенный код, не изменяя исходное приложение. Механизм эмуляции ARIES также реализует эмуляцию среды, которая эмулирует системные вызовы приложения HP 9000 HP-UX , доставку сигналов, управление исключениями, управление потоками, эмуляцию HP GDB для отладки и создание файла ядра для приложения.
  • DEC создала двоичный транслятор FX! 32 для преобразования приложений x86 в приложения Alpha.
  • Sun Microsystems " Ваби программное обеспечение включает динамический перевод с х86 инструкций SPARC.
  • В январе 2000 года корпорация Transmeta объявила о новом дизайне процессора под названием Crusoe . Из FAQ на их веб-сайте,

    Интеллектуальный микропроцессор состоит из аппаратного ядра VLIW в качестве движка и программного уровня, называемого программным обеспечением для преобразования кода. Программное обеспечение Code Morphing действует как оболочка […] морфинга или преобразования инструкций x86 в собственные инструкции Crusoe. Кроме того, программа Code Morphing содержит динамический компилятор и оптимизатор кода […] В результате повышается производительность при минимальной мощности. […] [Это] позволяет Transmeta развивать оборудование VLIW и программное обеспечение Code Morphing отдельно, не затрагивая огромную базу программных приложений.

  • Корпорация Intel разработала и внедрила IA-32 Execution Layer - динамический двоичный транслятор, предназначенный для поддержки приложений IA-32 в системах на базе Itanium , который был включен в Microsoft Windows Server для архитектуры Itanium , а также в несколько разновидностей Linux , включая Red Hat и Suse . Это позволило приложениям IA-32 работать быстрее, чем при использовании собственного режима IA-32 на процессорах Itanium.
  • Dolphin (эмулятор для GameCube / Wii ) выполняет JIT-перекомпиляцию кода PowerPC для x86 и AArch64.

Примеры динамических двоичных переводов в аппаратном обеспечении

  • Процессоры Intel x86, начиная с Pentium Pro, преобразуют сложные инструкции CISC x86 во внутренние микрооперации, подобные RISC .
  • Nvidia Tegra K1 Denver переводит инструкции ARM через медленный аппаратный декодер в собственные инструкции микрокода и использует программный двоичный транслятор для горячего кода.

Смотрите также

Ссылки

дальнейшее чтение