Двоичная трансляция

В компьютерной области под двоичной трансляцией (от англ. binary translation) понимают эмуляцию одного набора инструкций на другом за счет трансляции машинного кода. Последовательности инструкций переводятся из исходного набора (source) в целевой (target) набор инструкций. ДТ позволяет выполнять приложения одной архитектуры при работе на второй, причём для оптимизирующих двоичных компиляторов скорость выполнения кода зачастую выше оригинала.

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

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

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

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

Реализации

  • Apple Computer реализовала эмулятор с динамической трансляцией кода M68K в своей линейке компьютеров Macintosh с процессорами PowerPC, что позволило достичь весьма высокого уровня надежности, производительности и совместимости (см. Mac 68K emulator). Это позволило Apple вывести машины на рынок с только частично родной операционной системой, а конечные пользователи могли попробовать новую, более быструю архитектуру, не рискуя своими вложениями в обновление ПО. «Частично» потому что эмулятор был настолько успешным, что многие части операционной системы продолжили эмулироваться. Окончательный переход к родной для PowerPC операционной системе произошёл лишь с выпуском Mac OS X (10.0) в 2001 году, но внутри этой новой ОС среда исполнения «Classic» все ещё поддерживала эмуляцию возможностей PowerPC Mac.
  • Позже Apple реализовала уровень трансляции Rosetta (включен в выпуски Mac OS 10.4) для Intel-ориентированных Mac, который использовался для упрощения перехода от PPC к x86, что может служить примером динамической трансляции. Разработанный для Apple корпорацией Transitive программный пакет Rosetta является реализацией решения QuickTransit самой же Transitive, который может использоваться для динамической трансляции между платформами на основе архитектур SPARC, PowerPC, MIPS, Itanium и x86.
  • DEC достигла подобного успеха со своими инструментами трансляции, помогающим пользователям перейти с CISC-архитектуры VAX к RISC-архитектуре Alpha.
  • DEC создала двоичный транслятор FX!32 для преобразования приложений архитектуры x86 в приложения для Alpha.
  • Lintel фирмы ЗАО МЦСТ, использование x86-приложений на процессоре Эльбрус 2000 (E2k)
  • IA-32 EL (Execution Layer) фирмы Intel, использование x86-приложений на процессорах семейства Itanium
  • В марте 2006 года Intel объявила о своих планах по поддержке двоичного транслятора Transitive в будущих моделях процессоров серий Itanium и Xeon.
  • Sun, IBM и SGI также воспользовались технологией QuickTransit от Transitive. SPARC→x86 в случае Sun, x86→Power Architecture для IBM (называется PowerVM Lx86), и MIPS→Itanium2 для SGI.
  • В январе 2000 года Transmeta Corporation анонсировала проект обновленного процессора, получившего название Transmeta Crusoe. Как следует из FAQ на их веб-сайте,

    Умный микропроцессор содержит аппаратное VLIW-ядро в качестве движка и программный уровень, называемый Code Morphing. Программа Code Morphing выступает в качестве оболочки … преобразования или трансляции x86-инструкций в родные инструкции для Crusoe. Более того, ПО Code Morphing содержит динамический компилятор и оптимизатор кода … Результатом является увеличенная производительность при сравнимом энергопотреблении. … [Это] позволяет Transmeta совершенствовать аппаратную часть VLIW и ПО Code Morphing по отдельности без затрагивания большой базы программных приложений.

    .
  • HP ARIES (Automatic Re-translation and Integrated Environment Simulation) — система динамической двоичной трансляции, объяединяющая быструю интерпретацию кода с двухфазовой динамической трансляцией для прозрачного и точного выполнения приложений HP 9000 HP-UX на HP-UX 11i для серверов HP Integrity. Быстрый интерператор ARIES эмулирует полный набор непривилегированных PA-RISC-инструкций без вмешательства пользователя. В ходе интерпретации отслеживается схема выполнения приложения и транслируется только часто используемый код в родной код Itanium в ходе выполнения. ARIES реализует двухфазную динамическую трансляцию — технику, при которой транслируемый код во время первой фазы собирает информацию о профиле запуска, которая затем используется во второй фазе трансляции для последующей оптимизации транслируемого кода. ARIES хранит динамически оттранслированный код в буфере памяти, называемом кэшем кода или кэшем фрагментов. Дальнейшие ссылки на оттранслированные базовые блоки обрабатываются напрямую в кэше кода и не требуют дополнительной интерпертации или трансляции. Целевые блоки транслируемого кода помечаются для обеспечения выполнения в кэше кода в большинстве случаев. При завершении эмуляции ARIES отбрасывает весь оттранслированный код без модификации оригинального приложения. Движок эмуляции ARIES также реализует эмуляцию окружения (Environment Emulation), которая эмулирует системные вызовы приложений HP 9000 HP-UX, передачу сигналов, управление исключениями, управление потоками, эмуляцию HP GNU Debugger для отладки, и создание core-файлов для приложения.
  • Среди программных динамических трансляторов можно отметить qemu. Он поддерживает трансляцию для большого количества платформ, причем в любых комбинациях эмулируемой и эмулирующей архитектур.
  • В китайских микропроцессорах серии Loongson используется система двоичной трансляции qemu с модификациями от производителя процессоров ICT. В процессор MIPS-подобной архитектуры добавлено около 200 инструкций для упрощения эмуляции x86.