Двоичная трансляция
Двоичная трансляция (англ. binary translation) — эмуляция одного набора инструкций на другом за счёт трансляции машинного кода. Последовательности инструкций переводятся из исходного набора в целевой набор инструкций. Двоичная трансляция позволяет выполнять приложения одной архитектуры при работе на второй, причём для оптимизирующих двоичных компиляторов скорость выполнения кода зачастую выше оригинала.
Двоичная трансляция может быть статической и динамической. Динамическая компиляция происходит незаметно для пользователя при запуске приложения. Статический компилятор делает из двоичного кода исходной архитектуры готовое полноценное приложение для целевой архитектуры. При статической динамической трансляции весь исходный исполняемый файл транслируется в исполнимый файл для целевой архитектуры. Это весьма непростая задача — выполнить данную трансляцию абсолютно корректно, так как не весь код сразу считывается транслятором. Например, некоторые части исполнимого кода доступны лишь через косвенные переходы, чьи параметры становятся известны лишь во время исполнения.
С другой стороны, динамическая трансляция рассматривает короткие последовательности кода (как правило, это базовый блок: цикл или метод), транслирует его и кэширует результирующую последовательность. Код транслируется не весь, а по мере считывания и, соответственно, возможности его трансляции, и для инструкций ветвления создается контрольная точка в транслируемом коде.
Динамическая двоичная трансляция отличается от простой эмуляции удалением основного цикла эмулятора «считывание-декодирование-исполнение» (что является основным его узким местом), расплачиваясь за это большими накладными нагрузками во время процесса трансляции. Эти накладные расходы (нагрузки) несколько нивелируются в дальнейшем благодаря тому, что оттранслированный код будет исполняться несколько раз (то есть без повторной трансляции).
Более совершенные динамические трансляторы применяют динамическую рекомпиляцию: транслируемый код инструментируется на предмет выяснения «температуры кода», то есть того, какие фрагменты выполняются довольно часто, и к ним применяется агрессивная оптимизация. Такой подход напоминает JIT-компилятор, и в сущности, такие компиляторы (как например, технология HotSpot от корпорации Sun) можно рассматривать как динамические трансляторы из виртуального набора инструкций (байт-код) в реальный.
Реализации
Apple реализовала эмулятор с динамической трансляцией кода 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.
Sun (SPARC→x86), IBM (x86→Power Architecture, PowerVM Lx86) и SGI (MIPS→Itanium2)[1] также применяли технологию QuickTransit от фирмы Transitive.
DEC реализовала трансляторы для перехода с CISC-архитектуры VAX к RISC-архитектуре Alpha. Также DEC реализовала двоичный транслятор FX!32 для преобразования приложений архитектуры x86 в приложения для Alpha.
Транслятор Lintel фирмы МЦСТ позволяет запускать x86-приложения на процессоре Эльбрус 2000 (архитектура e2k).
Intel использовала транслятор Intel IA-32 EL для запуска 32-разрядных x86-приложений на процессорах семейства Itanium.
В январе 2000 года Transmeta анонсировала проект обновленного процессора, получившего название Transmeta Crusoe[2][3]. Как следует из FAQ[4] со встроенным программным уровнем Code Morphing, обеспечивающим динамическую двоичную трансляцию x86-инструкций в инструкции Crusoe.
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 также реализует эмуляцию окружения (Environment Emulation), которая эмулирует системные вызовы приложений HP 9000 HP-UX, передачу сигналов, управление исключениями, управление потоками, эмуляцию HP GNU Debugger для отладки, и создание core-файлов для приложения.
В китайских микропроцессорах серии Loongson используется система двоичной трансляции qemu с модификациями от производителя процессоров ICT. В процессор MIPS-подобной архитектуры добавлено около 200 инструкций для упрощения эмуляции x86.
Наиболее развитый свободный программный динамический транслятор — QEMU. В нём поддерживается трансляция для большого количества платформ, причем в любых комбинациях эмулируемой и эмулирующей архитектур.
См. также
- JIT-компиляция
- Морфинг программного кода
Примечания
- Архивированная копия (недоступная ссылка). Дата обращения: 1 августа 2009. Архивировано 6 июля 2009 года.
- Ars Technica: Transmeta Crusoe Explored — Page 1 — (1/2000)
- ChipGeek — Transmeta’s Crusoe Microprocessor
- Transmeta Corporation : crusoe
Литература
- Максименков Д. А. Система генерации тестов со случайным набором команд в кодах x86 // Информационные технологии : doc. — 2008. — № 6.
Ссылки
- Технология двоичной трансляции. Сущность, сферы применения и особенности реализации — статья на сайте iXBT.com
- http://www.transitive.com
- http://bellard.org/qemu/
- https://web.archive.org/web/20090207082851/http://www.itee.uq.edu.au/~csmweb/decompilation/bintrans.html (somewhat dated)
- http://www.gtoal.com/sbt/ Static Binary Translation HOWTO
- https://web.archive.org/web/20091003210932/http://www.itee.uq.edu.au/~cristina/uqbt.html University of Queensland Binary Translator
- https://web.archive.org/web/20090106000726/http://www.experimentalstuff.com/Technologies/Walkabout/ Walkabout — Binary Translation research by Sun and University collaborators
- http://csdl.computer.org/comp/mags/mi/1998/02/m2056abs.htm - FX!32, an x86 to Alpha binary translator developed by DEC
- http://www.hp.com/go/aries