В вычислениях , бинарное перевод является формой двоичной перекомпиляции , где последовательности инструкций переводятся из исходных набора команд к цели набору команд. В некоторых случаях, таких как моделирование набора инструкций , целевой набор инструкций может быть таким же, как исходный набор инструкций, обеспечивая функции тестирования и отладки, такие как трассировка инструкций, условные точки останова и обнаружение горячих точек .
Двумя основными типами являются статическая и динамическая двоичная трансляция. Трансляция может выполняться аппаратно (например, схемами в ЦП ) или программно (например, механизмами времени выполнения, статическим рекомпилятором, эмуляторами).
Мотивация
Двоичная трансляция мотивируется отсутствием двоичного кода для целевой платформы, отсутствием исходного кода для компиляции для целевой платформы или иными трудностями при компиляции исходного кода для целевой платформы.
Статически перекомпилированные двоичные файлы работают потенциально быстрее, чем соответствующие им эмулированные двоичные файлы, поскольку накладные расходы на эмуляцию устранены. Это похоже на разницу в производительности между интерпретируемыми и скомпилированными программами в целом.
Статическая двоичная трансляция
Транслятор, использующий статическую двоичную трансляцию, нацелен на преобразование всего кода исполняемого файла в код, который выполняется в целевой архитектуре, без необходимости сначала запускать код, как это делается при динамической двоичной трансляции. Это очень сложно сделать правильно, так как не весь код может быть обнаружен переводчиком. Например, некоторые части исполняемого файла могут быть доступны только через косвенные ветви , значение которых известно только во время выполнения.
В одном из таких статических двоичных трансляторов используется универсальная технология глазка супероптимизатора (разработанная Соравом Бансалом и Алексом Айкеном из Стэнфордского университета ) для выполнения эффективного перевода между, возможно, множеством исходных и целевых пар, при значительно низких затратах на разработку и высокой производительности целевого двоичного файла. В экспериментах по преобразованию PowerPC в x86 некоторые двоичные файлы даже превосходили собственные версии, но в среднем они работали со скоростью две трети от исходной скорости.
Примеры статических двоичных переводов
Honeywell предоставила программу под названием Liberator для своих компьютеров Honeywell серии 200 ; он мог переводить программы для компьютеров серии IBM 1400 в программы для серии Honeywell 200. [1]
В 2014 году версия видеоигры StarCraft 1998 года с архитектурой ARM была создана путем статической перекомпиляции и дополнительного реверс-инжиниринга исходной версии x86 . [2] [3] Pandora карманным сообщество может развивать необходимые инструменты [4] сами по себе и достижению таких переводов успешно несколько раз. [5] [6]
Например, успешная статическая перекомпиляция x86 в x64 была сгенерирована для процедурного генератора ландшафта видеоигры Cube World в 2014 году [7].
Другой пример - статически перекомпилированная версия видеоигры Super Mario Bros. для NES- to- x86, созданная с использованием LLVM в 2013 году. [8]
В 2004 году Скотт Эллиотт и Филип Р. Хатчинсон из Nintendo разработали инструмент для генерации кода «C» из двоичного файла Game Boy, который затем можно было скомпилировать для новой платформы и связать с аппаратной библиотекой для использования в развлекательных системах авиакомпаний. [9]
В 1995 году Норман Рэмси из Bell Communications Research и Мэри Фернандес из факультета компьютерных наук Принстонского университета разработали The New Jersey Machine-Code Toolkit, в котором были базовые инструменты для статической трансляции ассемблера. [10]
Динамическая двоичная трансляция
Динамическая двоичная трансляция (DBT) смотрит на короткую последовательность кода - обычно порядка одного базового блока - затем транслирует ее и кэширует полученную последовательность. Код переводится только по мере его обнаружения и когда это возможно, а инструкции ветвления указываются на уже переведенный и сохраненный код ( мемоизация ).
Динамическая двоичная трансляция отличается от простой эмуляции (устранение основного цикла чтения-декодирования-выполнения эмулятора - основного узкого места производительности), оплачиваемого большими накладными расходами во время трансляции. Мы надеемся, что эти накладные расходы окупятся, поскольку переведенные кодовые последовательности выполняются несколько раз.
Более продвинутые динамические трансляторы используют динамическую перекомпиляцию, при которой переведенный код инструментируется для определения того, какие части выполняются большое количество раз, и эти части агрессивно оптимизируются . Этот метод напоминает JIT компилятором , а на самом деле такие компиляторы (например , Sun «s HotSpot технологии) можно рассматривать как динамические переводчиков из набора виртуальных команд ( байт - кода ) к реальному.
Примеры динамических двоичных переводов в программном обеспечении
- Apple Computer реализован динамический перевод эмулятор для M68K кода в их PowerPC линии Макинтошей , [11] , которая достигла очень высокого уровня надежности, производительности и совместимости (см 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 на протяжении всего срока службы продукта также обеспечивала поддержку перевода SPARC → x86 , x86 → PowerPC и MIPS → Itanium 2 .
- DEC добилась аналогичного успеха со своими инструментами перевода, которые помогли пользователям перейти от архитектуры CISC VAX к архитектуре Alpha RISC . [ необходима цитата ]
- HP ARIES (Automatic Re-translation and Integrated Environment Simulation) - это программная [12] система динамической двоичной трансляции, которая сочетает в себе быструю интерпретацию кода с двухфазным динамическим переводом для прозрачного и точного выполнения приложений HP 9000 HP-UX на HP-UX 11i для HPE Серверы целостности . [13] Быстрый интерпретатор ARIES эмулирует полный набор непривилегированных инструкций PA-RISC без вмешательства пользователя. Во время интерпретации он отслеживает схему выполнения приложения и переводит только часто выполняемый код в собственный код Itanium во время выполнения. ARIES реализует двухэтапную динамическую трансляцию, методику, при которой транслируемый код на первом этапе собирает информацию профиля времени выполнения, которая используется во время трансляции второго этапа для дальнейшей оптимизации переведенного кода. ARIES хранит динамически транслируемый код в буфере памяти, называемом кешем кода. Дальнейшие ссылки на переведенные базовые блоки выполняются непосредственно в кэше кода и не требуют дополнительной интерпретации или перевода. Цели переведенных блоков кода исправлены, чтобы гарантировать, что выполнение происходит в кэше кода большую часть времени. В конце эмуляции ARIES отбрасывает весь переведенный код, не изменяя исходное приложение. Механизм эмуляции ARIES также реализует эмуляцию среды, которая эмулирует системные вызовы приложения HP 9000 HP-UX , доставку сигналов, управление исключениями, управление потоками, эмуляцию HP GDB для отладки и создание файла ядра для приложения.
- DEC создала двоичный транслятор FX! 32 для преобразования приложений x86 в приложения Alpha. [11]
- Sun Microsystems " Ваби программное обеспечение включает динамический перевод с х86 инструкций SPARC.
- В январе 2000 года корпорация Transmeta объявила о новом дизайне процессора под названием Crusoe . [14] [15] Из FAQ [16] на их веб-сайте,
Интеллектуальный микропроцессор состоит из аппаратного ядра 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 через медленный аппаратный декодер в собственные инструкции микрокода и использует программный двоичный транслятор для горячего кода. [ необходима цитата ]
Смотрите также
- Бинарная оптимизация
- Бинарная перекомпиляция
- Динамическая перекомпиляция
- Своевременная компиляция
- Симулятор набора инструкций
- Эмулятор
- Виртуальная машина
- Сравнение программного обеспечения для виртуализации платформ
- Теневая память
Рекомендации
- ^ Краткое описание Honeywell Series 200 (PDF) . Honeywell . Февраль 1966 г. с. 11.
Например, репертуар команд процессоров Series 200 достаточно похож на таковой в нескольких других системах обработки, а именно, в серии IBM 1400, чтобы обеспечить возможность автоматического одноразового перевода программ, написанных для этих конкурирующих систем, в форму, подходящую для для исполнения в высокопроизводительных системах Series 200.
- ^ Штайнлехнер, Питер (10 марта 2014 г.). "Starcraft für ARM-Handheld kompiliert" (на немецком языке). golem.de . Проверено 25 марта 2014 .
- ^ notaz (04.03.2014). «Старкрафт» . repo.openpandora.org . Проверено 26 марта 2014 .
- ^ notaz (01.03.2014). "ia32rtools /" . GitHub . Проверено 9 января 2015 .
- ^ notaz (04.03.2014). «Старкрафт» . openpandora.org . Проверено 29 марта 2014 .
Правило «без источника, без порта» не совсем верно, вы можете получить что-то похожее (но не то же самое), что и порт, путем статической перекомпиляции. Подобные вещи несколько раз проделывала M-HT для некоторых игр для DOS. Игра также была конвертирована для Android с похожим подходом.
- ^ M-HT. «Варкрафт: Орки и люди» . repo.openpandora.org.
- ^ Кёрлев, Матиас (14 апреля 2014 г.). «Практическая и портативная перекомпиляция X86» . Проверено 8 августа 2014 .
но потом возникла идея как-то использовать исходный машинный код x86. Однако для нашего открытого сервера нам также необходимо поддерживать x86-64, и в этом случае нам абсолютно необходима эмуляция или перекомпиляция. […] Статическая перекомпиляция на ассемблер казалась гораздо лучшим вариантом, но для сохранения переносимости нам нужно было бы написать бэкенд для x86, x86-64 и, возможно, ARM / PowerPC.
- ^ Келли, Эндрю (2013-07-07). «Статическая перекомпиляция игр NES в собственные исполняемые файлы с помощью LLVM и Go» . Проверено 8 августа 2013 .
В этой статье представлено оригинальное исследование возможности статического дизассемблирования и перекомпиляции игр Nintendo Entertainment System в собственные исполняемые файлы.
- ^ США 7765539 , Эллиотт, Скотт и Филипп Hutchinson, «Система и способ для транс-компиляции видеоигр», выпущенный 2010
- ^ Рэмси, Норман; Фернандес, Мэри Ф. (1995). "Набор инструментов машинного кода Нью-Джерси" . Proceeding TCON'95 Proceedings of the USENIX 1995 Technical Conference Proceedings . Ассоциация USENIX Беркли, Калифорния, США: 24.
- ^ а б Уортон, Джон Харрисон (1994-08-01). «Гэри Килдалл, пионер отрасли, умер в 52 года: создал первые языки для микрокомпьютеров, дисковые операционные системы» . Отчет микропроцессора . MicroDesign Resources Inc. (MDR). 8 (10). Архивировано 18 ноября 2016 года . Проверено 18 ноября 2016 .
[…] По иронии судьбы, многие методы, впервые разработанные Гэри, открываются заново сейчас, десять лет спустя. Apple и DEC рекламируют двоичную перекомпиляцию как «новую» технологию для переноса существующего программного обеспечения на архитектуру PowerPC или Alpha . На самом деле, DRI ввел 8080 -До- 8086 двоичную рекомпилятор в начале 1980 - х годов. […]
- ^ Карлсон, Джим; Гек, Джерри (2003). Подъем Itanium: прорыв второго закона Мура о вычислительной мощности . Prentice Hall PTR. ISBN 978-0-13046415-6. Проверено 9 января 2015 .
- ^ "Динамический двоичный транслятор HP ARIES" . HP . Проверено 9 января 2015 .
- ^ Стоукс, Джон. "Transmeta Crusoe Explored" . Ars Technica . Проверено 9 января 2015 .
- ^ Хьюз, Роб (2000-01-20). «Микропроцессор Transmeta Crusoe» . geek.com . Архивировано из оригинала на 2007-09-27.
- ^ «Часто задаваемые вопросы по процессору Transmeta Crusoe, FAQ» . Transmeta . 2007. Архивировано из оригинала на 2007-01-10.
дальнейшее чтение
- Хабер, Гади (2010). «Введение в двоичный перевод» (PDF) . Intel . Архивировано из оригинального (PDF) 09 марта 2016 года . Проверено 30 марта 2014 .
- Бансал, Сорав; Айкен, Алекс (декабрь 2008 г.). «Двоичный перевод с использованием супероптимизаторов Peephole» . Департамент компьютерных наук и инженерии . Индийский технологический институт Дели . Проверено 30 марта 2014 .
- Бараз, Леонид; Девор, Теви; Эцион, Орна; Гольденберг, Шалом; Скалецкий, Алексей; Ван, Юнь; Земач, Игаль (2003). «Уровень выполнения IA-32: двухфазный динамический транслятор, разработанный для поддержки приложений IA-32 в системах на базе Itanium» . Материалы 36-го ежегодного международного симпозиума IEEE / ACM по микроархитектуре . MICRO 36. Вашингтон, округ Колумбия, США: Компьютерное общество IEEE : 191–. ISBN 978-0-7695-2043-8.
- Тоул, Грэм. "HOWTO автора эмулятора для статического двоичного перевода" .
- Чернов, Антон; Хердег, Марк; Hookway, Рэй; Рив, Крис; Рубин, Норман; Тай, Тони; Ядавалли, С. Бхарадвадж; Йейтс, Джон (1998). «FX! 32: Двоичный переводчик с профильным профилем» . IEEE Micro . 18 (2): 56–64. DOI : 10.1109 / 40.671403 . ISSN 0272-1732 .
- Соуза, Максвелл; Никасиу, Даниэль; Араужо, Гвидо (23 июня 2010 г.) [19 июня 2010 г.]. ISAMAP: Отображение инструкций, управляемое динамической трансляцией . Компьютерная архитектура - Международные семинары ISCA 2010. Сен-Мало, Франция. С. 117–. ISBN 9783642243226.
- Чен Ю-синь (20.06.2009) [18.06.2009]. «Динамическое двоичное преобразование кода x86-32 в код x86-64 для виртуализации» (PDF) . Массачусетский технологический институт .