В вычислениях двоичное преобразование представляет собой форму двоичной перекомпиляции, где последовательности инструкций транслируются из исходного набора инструкций в целевой набор инструкций. В некоторых случаях, таких как моделирование набора инструкций, целевой набор инструкций может быть таким же, как исходный набор инструкций, обеспечивая функции тестирования и отладки, такие как трассировка инструкций, условные точки останова и горячая точка обнаружение.
Двумя основными типами являются статическая и динамическая двоичная трансляция. Трансляция может выполняться аппаратно (например, схемами в CPU ) или программно (например, механизмами времени выполнения, статическим рекомпилятором, эмуляторами).
Двоичная трансляция мотивирована отсутствием двоичного кода для целевой платформы, отсутствием исходного кода код для компиляции для целевой платформы или другие трудности при компиляции исходного кода для целевой платформы.
Статически перекомпилированные двоичные файлы работают потенциально быстрее, чем их соответствующие эмулированные двоичные файлы, поскольку накладные расходы на эмуляцию устранены. Это похоже на разницу в производительности между интерпретируемыми и скомпилированными программами в целом.
Транслятор, использующий статическую двоичную трансляцию, нацелен на преобразование всего кода исполняемого файла в код, который выполняется в целевой архитектуре без необходимости запуска сначала код, как это делается при динамической двоичной трансляции. Это очень сложно сделать правильно, так как не весь код может быть обнаружен переводчиком. Например, некоторые части исполняемого файла могут быть доступны только через косвенные ветви, значение которых известно только во время выполнения.
Один такой статический двоичный транслятор использует универсальную технологию superoptimizer peephole (разработанную Алексом Айкеном из Стэнфордского университета ) для эффективного перевода между возможно, много исходных и целевых пар со значительно низкими затратами на разработку и высокой производительностью целевого двоичного файла. В экспериментах по преобразованию PowerPC в x86 некоторые двоичные файлы даже превосходили собственные версии, но в среднем они работали со скоростью две трети от исходной скорости.
Honeywell предоставила программу под названием Liberator для своих компьютеров серии Honeywell 200 ; он мог переводить программы для компьютеров IBM 1400 series в программы для Honeywell серии 200.
В 2014 году ARM-архитектура версия 1998 видеоигра StarCraft была создана путем статической перекомпиляции и дополнительного обратного проектирования исходной x86 версии. Сообщество портативных устройств Pandora способно самостоятельно разработать необходимые инструменты и несколько раз успешно выполнить такие переводы.
Например, успешный переход с x86 на x64 статическая перекомпиляция была сгенерирована для процедурного генератора ландшафта видеоигры Cube World в 2014 году.
Другим примером является NES -to- x86 статически перекомпилированная версия видеоигры Super Mario Bros., созданная с использованием LLVM в 2013 году.
В 2004 году Скотт Эллиотт и Филипп Р. Хатчинсон из Nintendo разработал инструмент для генерации кода «C» из двоичного файла Game Boy, который затем можно было скомпилировать для новой платформы и связать с аппаратной библиотекой для использования в авиалиниях. развлекательные системы.
В 1995 году Норман Рэмси из Bell Communications Research и Мэри Фернандес из Департамента компьютерных наук Принстонского университета разработали The New Jersey Machine-Code Toolkit. это было базовые инструменты для статической трансляции ассемблера.
Динамическая двоичная трансляция (DBT) рассматривает короткую последовательность кода - обычно порядка одного базового блока - затем переводит и кэширует полученную последовательность. Код переводится только тогда, когда он обнаруживается и когда это возможно, а инструкции ветвления указываются на уже переведенный и сохраненный код (мемоизация ).
Динамическое двоичное преобразование отличается от простой эмуляции (устранение основного цикла чтения-декодирования-выполнения в эмуляторе - основного узкого места производительности), которое оплачивается большими накладными расходами во время преобразования. Мы надеемся, что эти накладные расходы окупятся, поскольку переведенные кодовые последовательности выполняются несколько раз.
Более продвинутые динамические трансляторы используют динамическую перекомпиляцию, при которой переведенный код инструментируется для определения того, какие части выполняются большое количество раз, и эти части оптимизированы агрессивно. Этот метод напоминает JIT-компилятор, и на самом деле такие компиляторы (например, HotSpot от Sun ) можно рассматривать как динамические трансляторы из виртуальной инструкции. установить (байт-код ) на реальный.
Интеллектуальный микропроцессор состоит из аппаратного ядра VLIW в качестве ядра и программного уровня, называемого программным обеспечением для преобразования кода. Программное обеспечение Code Morphing действует как оболочка […] морфинга или перевода инструкций x86 в собственные инструкции Crusoe. Кроме того, программа Code Morphing содержит динамический компилятор и оптимизатор кода […] В результате повышается производительность при минимальной мощности. […] [Это] позволяет Transmeta отдельно развивать аппаратное обеспечение VLIW и программное обеспечение Code Morphing, не затрагивая огромную базу программных приложений.