Форма двоичной перекомпиляции
В вычислительной технике двоичная трансляция — это форма двоичной перекомпиляции , при которой последовательности инструкций транслируются из исходного набора инструкций в целевой набор инструкций. В некоторых случаях, таких как моделирование набора инструкций , целевой набор инструкций может совпадать с исходным набором инструкций, что обеспечивает функции тестирования и отладки, такие как трассировка инструкций, условные точки останова и обнаружение горячих точек .
Два основных типа — статическая и динамическая двоичная трансляция. Трансляция может осуществляться аппаратно (например, схемами в ЦП ) или программно (например, движками времени выполнения, статическим рекомпилятором, эмуляторами).
Мотивация
Двоичная трансляция обусловлена отсутствием двоичного файла для целевой платформы, отсутствием исходного кода для компиляции для целевой платформы или иными трудностями компиляции исходного кода для целевой платформы.
Статически перекомпилированные двоичные файлы работают потенциально быстрее, чем соответствующие им эмулированные двоичные файлы, поскольку накладные расходы на эмуляцию удалены. Это похоже на разницу в производительности между интерпретируемыми и скомпилированными программами в целом.
Статическая двоичная трансляция
Транслятор, использующий статическую двоичную трансляцию, стремится преобразовать весь код исполняемого файла в код, который выполняется на целевой архитектуре без необходимости предварительного запуска кода, как это делается при динамической двоичной трансляции. Это очень сложно сделать правильно, поскольку не весь код может быть обнаружен транслятором. Например, некоторые части исполняемого файла могут быть доступны только через косвенные ветви , значение которых известно только во время выполнения.
Один из таких статических бинарных трансляторов использует технологию универсального супероптимизатора peephole (разработанную Соравом Бансалом и Алексом Эйкеном из Стэнфордского университета ) для выполнения эффективного перевода между, возможно, многими исходными и целевыми парами, со значительно низкими затратами на разработку и высокой производительностью целевого бинарного файла. В экспериментах по переводу с PowerPC на x86 некоторые бинарные файлы даже превзошли собственные версии, но в среднем они работали на двух третях собственной скорости. [1]
Примеры статических бинарных трансляций
Компания Honeywell разработала программу Liberator для своих компьютеров серии Honeywell 200 ; она могла транслировать программы для компьютеров серии IBM 1400 в программы для серии Honeywell 200. [2]
В 2014 году версия видеоигры StarCraft 1998 года на архитектуре ARM была создана путем статической перекомпиляции и дополнительного обратного проектирования оригинальной версии x86 . [3] [4]
Сообщество владельцев портативных устройств Pandora смогло самостоятельно разработать необходимые инструменты [5] и успешно выполнить такие переводы несколько раз. [6] [7]
Например, успешная статическая перекомпиляция x86-to- x64 была создана для процедурного генератора ландшафта видеоигры Cube World в 2014 году. [8]
Другим примером является статически перекомпилированная с NES на x86 версия видеоигры Super Mario Bros. , которая была создана с использованием LLVM в 2013 году. [9]
В 2004 году Скотт Эллиотт и Филипп Р. Хатчинсон из Nintendo разработали инструмент для генерации кода «C» из двоичного файла Game Boy , который затем можно было скомпилировать для новой платформы и связать с аппаратной библиотекой для использования в развлекательных системах авиакомпаний. [10]
В 1995 году Норман Рэмси из Bell Communications Research и Мэри Ф. Фернандес из факультета компьютерных наук Принстонского университета разработали The New Jersey Machine-Code Toolkit , который содержал основные инструменты для статической трансляции ассемблера. [11]
Динамическая двоичная трансляция
Динамическая двоичная трансляция (DBT) смотрит на короткую последовательность кода — обычно порядка одного базового блока — затем транслирует ее и кэширует полученную последовательность. Код транслируется только по мере его обнаружения и когда это возможно, а инструкции ветвления указывают на уже транслированный и сохраненный код ( мемориализация ).
Динамическая двоичная трансляция отличается от простой эмуляции (устраняя основной цикл чтения-декодирования-выполнения эмулятора — основное узкое место производительности), за что приходится платить большими накладными расходами во время трансляции. Эти накладные расходы, как мы надеемся, амортизируются, поскольку транслируемые последовательности кода выполняются несколько раз.
Более продвинутые динамические трансляторы используют динамическую перекомпиляцию , когда транслируемый код инструментируется для выяснения того, какие части выполняются большое количество раз, и эти части агрессивно оптимизируются . Эта техника напоминает JIT-компилятор , и на самом деле такие компиляторы (например, технология HotSpot от Sun ) можно рассматривать как динамические трансляторы из виртуального набора инструкций ( байт-кода ) в реальный.
Примеры динамических двоичных трансляций в программном обеспечении
- Apple Computer реализовала динамический транслирующий эмулятор для кода M68K в своей линейке PowerPC Macintoshes , [12] что позволило достичь очень высокого уровня надежности, производительности и совместимости (см. Эмулятор Mac 68K ). Это позволило Apple вывести машины на рынок только с частично собственной операционной системой , и конечные пользователи могли принять новую, более быструю архитектуру, не рискуя своими инвестициями в программное обеспечение. Отчасти потому, что эмулятор был настолько успешным, многие части операционной системы оставались эмулированными. Полный переход на собственную операционную систему (ОС) PowerPC не был осуществлен до выпуска Mac OS X (10.0) в 2001 году. (Среда выполнения Mac OS X " Classic " продолжала предлагать эту возможность эмуляции на PowerPC Mac до Mac OS X 10.5 .)
- Mac OS X 10.4.4 для компьютеров Mac на базе Intel представила динамический слой трансляции Rosetta , чтобы облегчить переход Apple с оборудования на базе PPC на x86. Разработанное для Apple компанией Transitive Corporation , программное обеспечение Rosetta является реализацией решения QuickTransit от Transitive .
- QuickTransit на протяжении всего жизненного цикла продукта также обеспечивал поддержку трансляции SPARC → x86 , x86→ PowerPC и MIPS → Itanium 2 .
- Компания DEC достигла аналогичного успеха с помощью своих инструментов перевода, помогающих пользователям перейти с архитектуры CISC VAX на архитектуру Alpha RISC . [ необходима ссылка ]
- HP ARIES (автоматическая повторная трансляция и интегрированное моделирование среды) — это программная [13] динамическая двоичная система трансляции, которая объединяет быструю интерпретацию кода с двухфазной динамической трансляцией для прозрачного и точного выполнения приложений HP 9000 HP-UX на HP-UX 11i для серверов HPE Integrity . [14] Быстрый интерпретатор ARIES эмулирует полный набор непривилегированных инструкций PA-RISC без вмешательства пользователя. Во время интерпретации он отслеживает шаблон выполнения приложения и транслирует только часто выполняемый код в собственный код Itanium во время выполнения. ARIES реализует двухфазную динамическую трансляцию, метод, при котором транслируемый код на первом этапе собирает информацию о профиле времени выполнения, которая используется во время трансляции на втором этапе для дальнейшей оптимизации транслируемого кода. ARIES сохраняет динамически транслируемый код в буфере памяти, называемом кэшем кода. Дальнейшие ссылки на транслируемые базовые блоки выполняются непосредственно в кэше кода и не требуют дополнительной интерпретации или трансляции. Цели транслируемых блоков кода подвергаются обратному исправлению, чтобы гарантировать, что выполнение происходит в кэше кода большую часть времени. В конце эмуляции ARIES отбрасывает весь транслированный код, не изменяя исходное приложение. Механизм эмуляции ARIES также реализует эмуляцию среды, которая эмулирует системные вызовы приложения HP 9000 HP-UX , доставку сигналов, управление исключениями, управление потоками, эмуляцию HP GDB для отладки и создание файла ядра для приложения.
- Компания DEC создала двоичный транслятор FX!32 для преобразования приложений x86 в приложения Alpha. [12]
- Программное обеспечение Wabi от Sun Microsystems включало динамическую трансляцию инструкций из x86 в SPARC.
- В январе 2000 года корпорация Transmeta анонсировала новый дизайн процессора под названием Crusoe . [15] [16] Из раздела FAQ [17] на их веб-сайте,
Интеллектуальный микропроцессор состоит из аппаратного ядра VLIW в качестве своего движка и программного слоя, называемого программным обеспечением Code Morphing. Программное обеспечение 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.
- Microsoft Virtual PC поддерживает двоичную трансляцию для 32-разрядных гостевых операционных систем.
- Известно, что VMware Workstation 12 и более ранние версии поддерживают двоичную трансляцию для 32-разрядных гостевых операционных систем.
Примеры динамических двоичных трансляций в оборудовании
- Nvidia Tegra K1 Denver транслирует инструкции ARM через медленный аппаратный декодер в собственные инструкции микрокода и использует программный двоичный транслятор для горячего кода. [ необходима ссылка ]
Смотрите также
Ссылки
- ^ Бансал, Сорав; Айкен, Алекс (декабрь 2008 г.). «Двоичная трансляция с использованием супероптимизаторов Peephole» (PDF) . Труды 8-й конференции USENIX по проектированию и внедрению операционных систем . стр. 177–192.
- ^ Honeywell Series 200 Summary Description (PDF) . Honeywell . Февраль 1966 г. стр. 11.
Например, набор инструкций процессоров Series 200 достаточно похож на набор инструкций нескольких других систем обработки данных, а именно серии IBM 1400, что позволяет автоматически однократно транслировать программы, написанные для этих конкурирующих систем, в форму, подходящую для выполнения на более производительных системах Series 200.
- ^ Штайнлехнер, Питер (10 марта 2014 г.). «Starcraft für ARM-Handheld kompiliert» (на немецком языке). golem.de . Проверено 25 марта 2014 г.
- ^ notaz (2014-03-04). "StarCraft". repo.openpandora.org . Получено 2014-03-26 .
- ^ notaz (2014-03-01). "ia32rtools/". GitHub . Получено 2015-01-09 .
- ^ notaz (2014-03-04). "Starcraft". openpandora.org . Получено 2014-03-29 .
Правило "нет исходников, нет порта" не совсем верно, вы можете получить что-то похожее (но не то же самое) в качестве порта с помощью статической перекомпиляции. Подобная работа была проделана несколько раз M-HT для некоторых игр DOS. Игра также была конвертирована для Android с использованием несколько похожего подхода.
- ^ M-HT. "Warcraft: Орки и люди". repo.openpandora.org.
- ^ Kærlev, Mathias (2014-04-14). "Practical and Portable X86 Recompilation" . Получено 2014-08-08 .
но затем возникла идея каким-то образом использовать исходный машинный код x86. Однако для нашего открытого сервера нам также нужна поддержка x86-64, и в этом случае нам абсолютно необходима эмуляция или перекомпиляция. […] Статическая перекомпиляция в ассемблер показалась гораздо лучшим вариантом, но чтобы сохранить ее переносимость, нам пришлось бы писать бэкэнды для x86, x86-64 и, возможно, ARM/PowerPC.
- ^ Келли, Эндрю (2013-07-07). "Статическая перекомпиляция игр NES в собственные исполняемые файлы с помощью LLVM и Go" . Получено 2013-08-08 .
В этой статье представлены оригинальные исследования, касающиеся возможности статической дизассемблирования и перекомпиляции игр Nintendo Entertainment System в собственные исполняемые файлы.
- ^ US 7765539, Эллиотт, Скотт и Хатчинсон, Филлип, «Система и метод транскомпиляции видеоигр», выпущенный в 2010 г.
- ^ Рэмси, Норман; Фернандес, Мэри Ф. (1995). "The New Jersey Machine-Code Toolkit". Труды TCON'95 Труды технической конференции USENIX 1995 года . Ассоциация USENIX Беркли, Калифорния, США. стр. 24.
- ^ ab Wharton, John Harrison (1994-08-01). "Гэри Килдалл, пионер отрасли, умер в возрасте 52 лет: создал первые языки микрокомпьютеров, дисковые операционные системы". Microprocessor Report . 8 (10). MicroDesign Resources Inc. (MDR). Архивировано из оригинала 2016-11-18 . Получено 2016-11-18 .
[…] По иронии судьбы, многие из методов, которые
Гэри
был пионером, сейчас заново открываются, десять лет спустя.
Apple
и
DEC
рекламируют
двоичную перекомпиляцию
как "новую" технологию для переноса существующего программного обеспечения на архитектуру
PowerPC
или
Alpha
. На самом деле,
DRI
представила двоичный рекомпилятор
8080
в
8086
в начале 1980-х годов. […]
- ^ Карлсон, Джим; Хак, Джерри (2003). Itanium Rising: Breaking Through Moore's Second Law of Computing Power. Prentice Hall PTR. ISBN 978-0-13046415-6. Получено 2015-01-09 .
- ^ "HP ARIES Dynamic Binary Translator". HP . Архивировано из оригинала 2015-01-10 . Получено 2015-01-09 .
- ^ Стоукс, Джон. «Transmeta Crusoe Explored». Ars Technica . Получено 09.01.2015 .
- ^ Хьюз, Роб (2000-01-20). "Transmeta's Crusoe Microprocessor". geek.com . Архивировано из оригинала 27-09-2007.
- ^ "Часто задаваемые вопросы по процессору Transmeta Crusoe". Transmeta . 2007. Архивировано из оригинала 2007-01-10.
Дальнейшее чтение
- Хабер, Гади (2010). "Введение в двоичную трансляцию" (PDF) . Intel . Архивировано из оригинала (PDF) 2016-03-09 . Получено 2014-03-30 .
- Бансал, Сорав; Айкен, Алекс (декабрь 2008 г.). «Двоичная трансляция с использованием супероптимизаторов Peephole». Кафедра компьютерных наук и инженерии . Индийский технологический институт Дели . Получено 30.03.2014 .
- Baraz, Leonid; Devor, Tevi; Etzion, Orna; Goldenberg, Shalom; Skaletsky, Alex; Wang, Yun; Zemach, Yigal (2003). "IA-32 Execution Layer: двухфазный динамический транслятор, разработанный для поддержки приложений IA-32 в системах на базе Itanium". Труды 36-го ежегодного международного симпозиума IEEE/ACM по микроархитектуре . MICRO 36. Вашингтон, округ Колумбия, США: IEEE Computer Society . стр. 191–. ISBN 978-0-7695-2043-8.
- Тоал, Грэм. «Руководство для разработчиков эмуляторов по статической двоичной трансляции».
- Чернов, Антон; Хердег, Марк; Хукуэй, Рэй; Рив, Крис; Рубин, Норман; Тай, Тони; Ядавалли, С. Бхарадвадж; Йейтс, Джон (1998). «FX!32: Профильный двоичный транслятор». IEEE микро . 18 (2): 56–64. дои : 10.1109/40.671403. ISSN 0272-1732.
- Соуза, Максвелл; Никасио, Даниэль; Араужо, Гвидо (23.06.2010) [19.06.2010]. ISAMAP: Отображение инструкций, управляемое динамической трансляцией. Архитектура компьютеров - Международные семинары ISCA 2010. Сен-Мало, Франция. стр. 117–. ISBN 9783642243226.
- Чэнь, Ю-синь (2009-06-20) [2009-06-18]. "Динамическая двоичная трансляция из кода x86-32 в код x86-64 для виртуализации" (PDF) . Массачусетский технологический институт .