stringtranslate.com

Двоичный перевод

В вычислительной технике двоичная трансляция — это форма двоичной перекомпиляции , при которой последовательности инструкций транслируются из исходного набора инструкций в целевой набор инструкций. В некоторых случаях, таких как моделирование набора инструкций , целевой набор инструкций может совпадать с исходным набором инструкций, что обеспечивает функции тестирования и отладки, такие как трассировка инструкций, условные точки останова и обнаружение горячих точек .

Два основных типа — статическая и динамическая двоичная трансляция. Трансляция может осуществляться аппаратно (например, схемами в ЦП ) или программно (например, движками времени выполнения, статическим рекомпилятором, эмуляторами).

Мотивация

Двоичная трансляция обусловлена ​​отсутствием двоичного файла для целевой платформы, отсутствием исходного кода для компиляции для целевой платформы или иными трудностями компиляции исходного кода для целевой платформы.

Статически перекомпилированные двоичные файлы работают потенциально быстрее, чем соответствующие им эмулированные двоичные файлы, поскольку накладные расходы на эмуляцию удалены. Это похоже на разницу в производительности между интерпретируемыми и скомпилированными программами в целом.

Статическая двоичная трансляция

Транслятор, использующий статическую двоичную трансляцию, стремится преобразовать весь код исполняемого файла в код, который выполняется на целевой архитектуре без необходимости предварительного запуска кода, как это делается при динамической двоичной трансляции. Это очень сложно сделать правильно, поскольку не весь код может быть обнаружен транслятором. Например, некоторые части исполняемого файла могут быть доступны только через косвенные ветви , значение которых известно только во время выполнения.

Один из таких статических бинарных трансляторов использует технологию универсального супероптимизатора 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 ) можно рассматривать как динамические трансляторы из виртуального набора инструкций ( байт-кода ) в реальный.

Примеры динамических двоичных трансляций в программном обеспечении

Примеры динамических двоичных трансляций в оборудовании

Смотрите также

Ссылки

  1. ^ Бансал, Сорав; Айкен, Алекс (декабрь 2008 г.). «Двоичная трансляция с использованием супероптимизаторов Peephole» (PDF) . Труды 8-й конференции USENIX по проектированию и внедрению операционных систем . стр. 177–192.
  2. ^ Honeywell Series 200 Summary Description (PDF) . Honeywell . Февраль 1966 г. стр. 11. Например, набор инструкций процессоров Series 200 достаточно похож на набор инструкций нескольких других систем обработки данных, а именно серии IBM 1400, что позволяет автоматически однократно транслировать программы, написанные для этих конкурирующих систем, в форму, подходящую для выполнения на более производительных системах Series 200.
  3. ^ Штайнлехнер, Питер (10 марта 2014 г.). «Starcraft für ARM-Handheld kompiliert» (на немецком языке). golem.de . Проверено 25 марта 2014 г.
  4. ^ notaz (2014-03-04). "StarCraft". repo.openpandora.org . Получено 2014-03-26 .
  5. ^ notaz (2014-03-01). "ia32rtools/". GitHub . Получено 2015-01-09 .
  6. ^ notaz (2014-03-04). "Starcraft". openpandora.org . Получено 2014-03-29 . Правило "нет исходников, нет порта" не совсем верно, вы можете получить что-то похожее (но не то же самое) в качестве порта с помощью статической перекомпиляции. Подобная работа была проделана несколько раз M-HT для некоторых игр DOS. Игра также была конвертирована для Android с использованием несколько похожего подхода.
  7. ^ M-HT. "Warcraft: Орки и люди". repo.openpandora.org.
  8. ^ Kærlev, Mathias (2014-04-14). "Practical and Portable X86 Recompilation" . Получено 2014-08-08 . но затем возникла идея каким-то образом использовать исходный машинный код x86. Однако для нашего открытого сервера нам нужно также поддерживать x86-64, и в этом случае нам абсолютно необходима эмуляция или перекомпиляция. […] Статическая перекомпиляция в ассемблер показалась гораздо лучшим вариантом, но чтобы сохранить ее переносимость, нам нужно было бы написать бэкэнды для x86, x86-64 и, возможно, ARM/PowerPC.
  9. ^ Келли, Эндрю (2013-07-07). "Статическая перекомпиляция игр NES в собственные исполняемые файлы с помощью LLVM и Go" . Получено 2013-08-08 . В этой статье представлены оригинальные исследования, касающиеся возможности статической дизассемблирования и перекомпиляции игр Nintendo Entertainment System в собственные исполняемые файлы.
  10. ^ US 7765539, Эллиотт, Скотт и Хатчинсон, Филлип, «Система и метод транскомпиляции видеоигр», выпущенный в 2010 г. 
  11. ^ Рэмси, Норман; Фернандес, Мэри Ф. (1995). "The New Jersey Machine-Code Toolkit". Труды TCON'95 Труды технической конференции USENIX 1995 года . Ассоциация USENIX Беркли, Калифорния, США. стр. 24.
  12. ^ 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-х годов. […]
  13. ^ Карлсон, Джим; Хак, Джерри (2003). Itanium Rising: Breaking Through Moore's Second Law of Computing Power. Prentice Hall PTR. ISBN 978-0-13046415-6. Получено 2015-01-09 .
  14. ^ "HP ARIES Dynamic Binary Translator". HP . Архивировано из оригинала 2015-01-10 . Получено 2015-01-09 .
  15. ^ Стоукс, Джон. «Transmeta Crusoe Explored». Ars Technica . Получено 09.01.2015 .
  16. ^ Хьюз, Роб (2000-01-20). "Transmeta's Crusoe Microprocessor". geek.com . Архивировано из оригинала 27-09-2007.
  17. ^ "Часто задаваемые вопросы по процессору Transmeta Crusoe". Transmeta . 2007. Архивировано из оригинала 2007-01-10.

Дальнейшее чтение