Динамическая перекомпиляция - Dynamic recompilation

В Информатика, динамическая перекомпиляция (иногда сокращенно Dynarec или псевдоакроним ДРК) является особенностью некоторых эмуляторы и виртуальные машины, где система может перекомпилировать некоторая часть программа во время исполнения. Компилируя во время выполнения, система может адаптировать сгенерированный код для отражения среды выполнения программы и потенциально производить более эффективные код используя информацию, недоступную для традиционных статических компилятор.

Использует

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

Задачи

Основные задачи, которые должен выполнять динамический рекомпилятор:

  • Чтение машинного кода с исходной платформы
  • Генерация машинного кода для целевой платформы

Также динамический рекомпилятор может выполнять некоторые вспомогательные задачи:

  • Управление кешем перекомпилированного кода
  • Обновление количества прошедших циклов на платформах с регистрами количества циклов
  • Управление проверкой прерывания
  • Предоставление интерфейса для виртуализированного вспомогательного оборудования, например GPU
  • Оптимизация структур кода более высокого уровня для эффективной работы на целевом оборудовании (см. Ниже)

пример

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

начало:    mov А,[первый нить указатель]    ; Поместите местоположение первого символа исходной строки                                    ; в регистре А    mov B,[второй нить указатель]   ; Поместите расположение второго символа целевой строки                                    ; в регистре Bпетля:    mov C,[А]            ; Скопируйте байт по адресу в регистре A в регистр C    mov [B],C            ; Скопируйте байт из регистра C по адресу в регистре B    inc А                ; Увеличьте адрес в регистре A, чтобы указать на                         ; следующий байт    inc B                ; Увеличьте адрес в регистре B, чтобы указать на                         ; следующий байт    cmp C,# 0; Сравните данные, которые мы только что скопировали, с 0 (маркер конца строки)     jnz петля            ; Если это не было 0, нам нужно скопировать больше, поэтому вернитесь назад                         ; и скопируйте следующий байтконец:                     ; Если мы не зациклились, значит, мы закончили,                         ; так что продолжай что-нибудь еще.

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

Скажем, есть инструкция к нашему новому процессору под названием мовс, специально разработанный для эффективного копирования строк. Наша теоретическая инструкция movs копирует 16 байтов за раз, без необходимости загружать их в регистр C между ними, но остановится, если скопирует байт 0 (который отмечает конец строки) и установит нулевой флаг. Он также знает, что адреса строк будут в регистрах A и B, поэтому он увеличивает A и B на 16 каждый раз при выполнении, готовый к следующей копии.

Наш новый перекомпилированный код может выглядеть примерно так:

начало:    mov А,[первый нить указатель]    ; Поместите местоположение первого символа исходной строки                                    ; в регистре А    mov B,[второй нить указатель]   ; Поместите местоположение первого символа целевой строки                                    ; в регистре Bпетля:    мовс [B],[А]            ; Скопируйте 16 байтов по адресу в регистре A в адрес                            ; в регистре B, затем увеличьте A и B на 16     jnz петля               ; Если нулевой флаг не установлен, значит, мы не достигли                            ; конец строки, так что вернитесь и скопируйте еще немного.конец:                        ; Если мы не зациклились, значит, мы закончили,                            ; так что продолжайте что-нибудь еще.

Существует немедленное увеличение скорости просто потому, что процессору не нужно загружать так много инструкций для выполнения одной и той же задачи, но также потому, что инструкция movs, вероятно, будет оптимизирована разработчиком процессора, чтобы быть более эффективной, чем последовательность, используемая в первый пример. Например, он может лучше использовать параллельное исполнение в процессоре для увеличения A и B, пока он все еще копирует байты.

Приложения

Общее назначение

Игры

  • МАМЕ использует динамическую перекомпиляцию в своих эмуляторах ЦП для MIPS, SuperH, PowerPC и даже графических процессоров Voodoo.
  • Wii64, а Nintendo 64 эмулятор для Wii.
  • WiiSX, эмулятор Sony PlayStation для Nintendo Wii.
  • Mupen64Plus, мультиплатформенный эмулятор Nintendo 64.[7]
  • Yabause, мультиплатформенный Сатурн эмулятор.[8]
  • Функциональность обратной совместимости Xbox 360 (т.е. запуск игр, написанных для оригинального Xbox ) широко предполагается использовать динамическую перекомпиляцию.
  • ППССП, а Sony PlayStation портативный эмулятор. Перекомпиляторы как для x86, так и для ARM.
  • PSEmu Pro, а Sony Игровая приставка эмулятор.
  • Ultrahle, первый Nintendo 64 эмулятор для полноценного запуска коммерческих игр.
  • PCSX2,[9] а Sony PlayStation 2 эмулятор имеет рекомпилятор под названием «microVU», преемник «SuperVU».
  • Дельфин, а Nintendo GameCube и Wii эмулятор, имеет опцию dynarec.
  • GCemu,[10] а Nintendo GameCube эмулятор.
  • NullDC, а Sega Dreamcast эмулятор для x86.
  • GEM,[11] а Nintendo Game Boy эмулятор для MSX использует оптимизирующий динамический рекомпилятор.
  • DeSmuME,[12] а Nintendo DS эмулятор, имеет опцию dynarec.
  • Soywiz's Psp,[13] а Sony PlayStation портативный эмулятор, имеет опцию dynarec.
  • RPCS3, а Sony PlayStation 3 эмулятор. Перекомпиляторы PPU и SPU на процессоре Cell для x86-64
  • Decaf-emu, a Wii U эмулятор использует динамическую перекомпиляцию (JIT) из PowerPC32 в аппаратное обеспечение с кодом x86_64 с использованием библиотеки libbinrec (сама библиотека может работать на любой аппаратной архитектуре).

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

Рекомендации

  1. ^ "Технический отчет HP Labs по Dynamo".
  2. ^ http://www.dynamorio.org/home.html
  3. ^ https://github.com/DynamoRIO/dynamorio
  4. ^ Пол, Маттиас Р .; Фринке, Аксель К. (1997-10-13) [впервые опубликовано в 1991 году], FreeKEYB - усовершенствованный драйвер клавиатуры и консоли DOS (Руководство пользователя) (изд. V6.5) [1] (NB. FreeKEYB - это Unicode -на основе динамически настраиваемого преемника K3PLUS, поддерживающего большинство раскладки клавиатуры, кодовые страницы, и коды стран. K3PLUS был расширенным драйвером клавиатуры для DOS, широко распространенным в то время в Германии, с доступными адаптациями для нескольких других европейских языков. Он уже поддерживал подмножество функций FreeKEYB, но был статически настроен и не поддерживал динамическое устранение мертвого кода.)
  5. ^ Пол, Маттиас Р .; Фринке, Аксель К. (16 января 2006 г.), FreeKEYB - расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (предварительная редакция v7)
  6. ^ «ОВПсим».
  7. ^ Mupen64Plus
  8. ^ «SH2».
  9. ^ «PCSX 2».
  10. ^ petebernert. "GCemu". SourceForge.
  11. ^ "Эмулятор Gameboy для MSX | Новый образ". GEM. Получено 2014-01-12.
  12. ^ "DeSmuME v0.9.9".
  13. ^ Publicado por Carlos Ballesteros Velasco (28 июля 2013 г.). "Эмулятор PSP от Soywiz: Выпуск: эмулятор Psp от Soywiz 28.07.2013 (r525)". Pspemu.soywiz.com. Получено 2014-01-12.

внешняя ссылка