Двоичный перевод
В вычислительной технике двоичная трансляция — это форма двоичной перекомпиляции , при которой последовательности инструкций преобразуются из исходного набора команд в целевой набор команд. В некоторых случаях, например при моделировании набора команд , целевой набор команд может совпадать с исходным набором команд, обеспечивая такие функции тестирования и отладки, как трассировка команд, условные точки останова и обнаружение горячих точек .
Двумя основными типами являются статическая и динамическая двоичная трансляция. Трансляция может выполняться аппаратно (например, с помощью схем в ЦП ) или программно (например, механизмы выполнения, статический перекомпилятор, эмуляторы).
Мотивация
[ редактировать ]Двоичная трансляция мотивируется отсутствием двоичного файла для целевой платформы, отсутствием исходного кода для компиляции для целевой платформы или другими трудностями при компиляции исходного кода для целевой платформы.
Статически перекомпилированные двоичные файлы потенциально работают быстрее, чем соответствующие им эмулированные двоичные файлы, поскольку устраняются накладные расходы на эмуляцию. Это похоже на разницу в производительности между интерпретируемыми и скомпилированными программами в целом.
Статическая двоичная трансляция
[ редактировать ]Транслятор, использующий статическую двоичную трансляцию, стремится преобразовать весь код исполняемого файла в код, который работает на целевой архитектуре, без необходимости предварительного запуска кода, как это делается при динамической двоичной трансляции. Сделать это правильно очень сложно, так как не весь код может быть обнаружен транслятором. Например, некоторые части исполняемого файла могут быть доступны только через косвенные ветки , значение которых известно только во время выполнения.
Один из таких статических двоичных трансляторов использует универсальную технологию супероптимизатора «глазок» (разработанную Соравом Бансалом и Алексом Эйкеном из Стэнфордского университета ) для выполнения эффективного перевода между возможным множеством пар исходных и целевых файлов со значительно низкими затратами на разработку и высокой производительностью целевого двоичного файла. В экспериментах по трансляции PowerPC в x86 некоторые двоичные файлы даже превосходили собственные версии, но в среднем они работали на двух третях от собственной скорости. [1]
Примеры статических двоичных переводов
[ редактировать ]Компания Honeywell предоставила программу под названием Liberator для своих Honeywell серии 200 компьютеров ; он мог переводить программы для компьютеров серии IBM 1400 в программы для серии Honeywell 200. [2]
В 2014 году с архитектурой ARM 1998 года версия видеоигры StarCraft была создана путем статической перекомпиляции и дополнительного обратного проектирования исходной версии x86 . [3] [4] Сообщество портативных устройств Pandora смогло разработать необходимые инструменты. [5] самостоятельно и несколько раз успешно выполняли такие переводы. [6] [7]
Например, в 2014 году была создана успешная статическая перекомпиляция x86 в x64 для процедурного генератора ландшафта видеоигры Cube World . [8]
Другим примером является для NES -to- x86 статически перекомпилированная версия видеоигры Super Mario Bros. , созданная с использованием LLVM в 2013 году. [9]
В 2004 году Скотт Эллиот и Филип Р. Хатчинсон из Nintendo разработали инструмент для генерации кода «C» из двоичного файла Game Boy , который затем можно было скомпилировать для новой платформы и связать с аппаратной библиотекой для использования в развлекательных системах авиакомпаний. [10]
В 1995 году Норман Рэмси из Bell Communications Research и Мэри Ф. Фернандес с факультета компьютерных наук Принстонского университета разработали набор инструментов машинного кода Нью-Джерси , в котором были базовые инструменты для трансляции статического ассемблера. [11]
Динамический двоичный перевод
[ редактировать ]Динамическая двоичная трансляция (DBT) просматривает короткую последовательность кода — обычно порядка одного базового блока — затем преобразует ее и кэширует полученную последовательность. Код переводится только по мере его обнаружения и когда это возможно, а инструкции ветвления указывают на уже переведенный и сохраненный код ( мемоизация ).
Динамическая двоичная трансляция отличается от простой эмуляции (устраняя основной цикл эмулятора чтения-декодирования-выполнения — основного узкого места в производительности), за что приходится платить большими накладными расходами во время трансляции. Мы надеемся, что эти накладные расходы амортизируются, поскольку преобразованные последовательности кода выполняются несколько раз.
Более продвинутые динамические трансляторы используют динамическую перекомпиляцию , при которой транслируемый код анализируется, чтобы определить, какие части выполняются большое количество раз, и эти части оптимизируются активно . Этот метод напоминает JIT-компилятор , и фактически такие компиляторы (например, Sun технология HotSpot ) можно рассматривать как динамические трансляторы из виртуального набора команд ( байт-кода ) в реальный.
Примеры динамических двоичных преобразований в программном обеспечении
[ редактировать ]- Apple Computer реализовала эмулятор динамической трансляции кода M68K в своей PowerPC линейке компьютеров Macintosh . [12] где достигнут очень высокий уровень надежности, производительности и совместимости (см. эмулятор Mac 68K ). Это позволило Apple вывести машины на рынок только с частично родной операционной системой , а конечные пользователи могли принять новую, более быструю архитектуру, не рискуя своими инвестициями в программное обеспечение. Отчасти из-за того, что эмулятор был настолько успешным, многие части операционной системы остались эмулируемыми. Полный переход на собственную операционную систему (ОС) PowerPC не был осуществлен до выпуска Mac OS X (10.0) в 2001 году. (Среда выполнения Mac OS X « Classic » продолжала предлагать эту возможность эмуляции на компьютерах 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 (автоматический повторный перевод и интегрированное моделирование среды) — это программное обеспечение [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]
- Программное обеспечение Sun Microsystems Wabi включало динамическую трансляцию инструкций x86 в SPARC.
- В январе 2000 года корпорация Transmeta анонсировала новый дизайн процессора под названием Crusoe . [15] [16] Из часто задаваемых вопросов [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 , включая Красная Шляпа и Сьюз . Это позволило приложениям IA-32 работать быстрее, чем при использовании собственного режима IA-32 на процессорах Itanium.
- Dolphin (эмулятор для GameCube / Wii ) выполняет JIT-перекомпиляцию кода PowerPC в x86 и AArch64.
- Microsoft Virtual PC поддерживает двоичную трансляцию для 32-разрядных гостевых операционных систем.
Примеры динамических двоичных преобразований на аппаратном уровне
[ редактировать ]- Nvidia Tegra K1 Denver преобразует инструкции ARM через медленный аппаратный декодер в собственные инструкции микрокода и использует программный двоичный транслятор для горячего кода. [ нужна ссылка ]
См. также
[ редактировать ]- Бинарная оптимизация
- Бинарная перекомпиляция
- Динамическая перекомпиляция
- Компиляция точно в срок
- Симулятор набора команд
- Эмулятор
- Виртуальная машина
- Сравнение программного обеспечения для виртуализации платформ
- Теневая память
Ссылки
[ редактировать ]- ^ Бансал, Сорав; Эйкен, Алекс (декабрь 2008 г.). «Двоичный перевод с использованием супероптимизаторов-глазков» (PDF) . Материалы 8-й конференции USENIX по проектированию и внедрению операционных систем . стр. 177–192.
- ^ Краткое описание Honeywell Series 200 (PDF) . Ханивелл . Февраль 1966 г. с. 11.
Например, репертуар команд процессоров серии 200 достаточно похож на репертуар некоторых других вычислительных систем, а именно серии IBM 1400, что позволяет осуществлять автоматический одноразовый перевод программ, написанных для этих конкурирующих систем, в подходящую форму. для выполнения в высокопроизводительных системах Series 200.
- ^ Штайнлехнер, Питер (10 марта 2014 г.). «Starcraft, скомпилированный для портативных компьютеров ARM» (на немецком языке). golem.de . Проверено 25 марта 2014 г.
- ^ нотаз (04.03.2014). «Старкрафт» . repo.openpandora.org . Проверено 26 марта 2014 г.
- ^ нотаз (01.03.2014). "ia32rtools/" . Гитхаб . Проверено 9 января 2015 г.
- ^ нотаз (04.03.2014). «Старкрафт» . openpandora.org . Проверено 29 марта 2014 г.
Правило «нет источника — нет порта» не совсем верно, можно получить что-то похожее (но не то же самое) на порт посредством статической перекомпиляции. Подобные вещи несколько раз делались M-HT для некоторых DOS-игр. Игра также была конвертирована для Android с использованием схожего подхода.
- ^ М-ХТ. «Варкрафт: Орки и люди» . repo.openpandora.org.
- ^ Керлев, Матиас (14 апреля 2014 г.). «Практическая и портативная перекомпиляция X86» . Проверено 8 августа 2014 г.
но затем возникла идея каким-то образом использовать исходный машинный код x86. Однако для нашего открытого сервера нам также необходима поддержка x86-64, и в этом случае нам абсолютно необходима эмуляция или перекомпиляция. […] Статическая перекомпиляция в ассемблер казалась гораздо лучшим вариантом, но чтобы сохранить ее переносимость, нам нужно было написать серверные части для x86, x86-64 и, возможно, ARM/PowerPC.
- ^ Келли, Эндрю (7 июля 2013 г.). «Статическая перекомпиляция игр NES в собственные исполняемые файлы с помощью LLVM и Go» . Проверено 8 августа 2013 г.
В этой статье представлены оригинальные исследования возможности статической дизассемблирования и перекомпиляции игр Nintendo Entertainment System в собственные исполняемые файлы.
- ^ США 7765539 , Эллиотт, Скотт и Хатчинсон, Филипп, «Система и метод транс-компиляции видеоигр», выпущен в 2010 г.
- ^ Рэмси, Норман; Фернандес, Мэри Ф. (1995). «Набор инструментов для машинного кода Нью-Джерси» . Материалы TCON'95 Материалы технической конференции USENIX 1995 года . Ассоциация USENIX Беркли, Калифорния, США. п. 24.
- ^ Jump up to: а б Уортон, Джон Харрисон (1 августа 1994 г.). «Гэри Килдалл, пионер индустрии, умер в 52 года: создал первые микрокомпьютерные языки, дисковые операционные системы» . Отчет микропроцессора . 8 (10). MicroDesign Resources Inc. (MDR). Архивировано из оригинала 18 ноября 2016 г. Проверено 18 ноября 2016 г.
[…] По иронии судьбы, многие из методов, впервые изобретенных Гэри , открываются заново сейчас, десять лет спустя. Apple и DEC рекламируют двоичную перекомпиляцию как «новую» технологию переноса существующего программного обеспечения на архитектуру PowerPC или Alpha . Фактически, DRI представила двоичный перекомпилятор 8080 в 8086 в начале 1980-х годов. […]
- ^ Карлсон, Джим; Гек, Джерри (2003). Itanium Rising: нарушение второго закона вычислительной мощности Мура . Прентис Холл PTR. ISBN 978-0-13046415-6 . Проверено 9 января 2015 г.
- ^ «Динамический двоичный транслятор HP ARIES» . ХП . Архивировано из оригинала 10 января 2015 г. Проверено 9 января 2015 г.
- ^ Стоукс, Джон. «Исследование Трансмета Крузо» . Арс Техника . Проверено 9 января 2015 г.
- ^ Хьюз, Роб (20 января 2000 г.). «Микропроцессор Крузо компании Transmeta» . geek.com . Архивировано из оригинала 27 сентября 2007 г.
- ^ «Часто задаваемые вопросы по процессору Transmeta Crusoe» . Трансмета . 2007. Архивировано из оригинала 10 января 2007 г.
Дальнейшее чтение
[ редактировать ]- Хабер, Гади (2010). «Введение в двоичный перевод» (PDF) . Интел . Архивировано из оригинала (PDF) 9 марта 2016 г. Проверено 30 марта 2014 г.
- Бансал, Сорав; Эйкен, Алекс (декабрь 2008 г.). «Двоичный перевод с использованием супероптимизаторов-глазков» . Департамент компьютерных наук и инженерии . Индийский технологический институт в Дели . Проверено 30 марта 2014 г.
- Бараз, Леонид; Девор, Теви; Эцион, Орна; Гольденберг, Шалом; Скалецкий, Алекс; Ван, Юн; Земах, Игаль (2003). «Уровень выполнения IA-32: двухфазный динамический транслятор, предназначенный для поддержки приложений IA-32 в системах на базе Itanium» . Материалы 36-го ежегодного международного симпозиума IEEE/ACM по микроархитектуре . MICRO 36. Вашингтон, округ Колумбия, США: Компьютерное общество IEEE . стр. 191–. ISBN 978-0-7695-2043-8 .
- Тоал, Грэм. «HOWTO для разработчиков эмуляторов статического двоичного перевода» .
- Чернов, Антон; Хердег, Марк; Хукуэй, Рэй; Рив, Крис; Рубин, Норман; Тай, Тони; Ядавалли, С. Бхарадвадж; Йейтс, Джон (1998). «FX!32: Профильный двоичный транслятор» . IEEE микро . 18 (2): 56–64. дои : 10.1109/40.671403 . ISSN 0272-1732 .
- Соуза, Максвелл; Никасио, Дэниел; Араужо, Гвидо (23 июня 2010 г.) [19 июня 2010 г.]. ISAMAP: отображение инструкций, управляемое динамическим переводом . Компьютерная архитектура - Международные семинары ISCA 2010. Сен-Мало, Франция. стр. 117–. ISBN 9783642243226 .
- Чен, Юй-синь (20 июня 2009 г.) [18 июня 2009 г.]. «Динамический двоичный перевод кода x86-32 в код x86-64 для виртуализации» (PDF) . Массачусетский технологический институт .