В информатике , динамическая перекомпиляции (иногда сокращенно Дайнарек или псевдо-акроним ДРК ) является особенностью некоторых эмуляторов и виртуальных машин , где система может перекомпилировать некоторую часть программы во время выполнения . Компилируя во время выполнения, система может адаптировать сгенерированный код для отражения среды выполнения программы и потенциально производить более эффективный код , используя информацию, недоступную для традиционного статического компилятора .
Использует
Большинство динамических рекомпиляторов используются для преобразования машинного кода между архитектурами во время выполнения. Эта задача часто требуется при эмуляции устаревших игровых платформ. В других случаях система может использовать динамическую перекомпиляцию как часть стратегии адаптивной оптимизации для выполнения переносимого программного представления, такого как байт-коды Java или .NET Common Language Runtime . Полноскоростные отладчики также используют динамическую перекомпиляцию, чтобы уменьшить накладные расходы на пространство, связанные с большинством методов деоптимизации , и другими функциями, такими как динамическая миграция потоков .
Задачи
Основные задачи, которые должен выполнять динамический рекомпилятор:
- Чтение машинного кода с исходной платформы
- Генерация машинного кода для целевой платформы
Также динамический рекомпилятор может выполнять некоторые вспомогательные задачи:
- Управление кешем перекомпилированного кода
- Обновление количества прошедших циклов на платформах с регистрами количества циклов
- Управление проверкой прерывания
- Предоставление интерфейса для виртуализированного вспомогательного оборудования, например графического процессора.
- Оптимизация структур кода более высокого уровня для эффективной работы на целевом оборудовании (см. Ниже)
Пример
Предположим, программа запускается в эмуляторе и ей необходимо скопировать строку с завершающим нулем . Программа изначально скомпилирована для очень простого процессора. Этот процессор может копировать только байт за раз и должен делать это, сначала считывая его из исходной строки в регистр , а затем записывая его из этого регистра в целевую строку. Исходная программа может выглядеть примерно так:
начало: mov A , [ указатель первой строки ] ; Поместите расположение первого символа исходной строки ; в регистре A mov B , [ указатель второй строки ] ; Укажите расположение второго символа целевой строки ; в регистре B цикл: mov C , [ A ] ; Скопируйте байт по адресу в регистре A в регистр C mov [ B ], C ; Скопируйте байт из регистра C по адресу в регистре B inc A ; Увеличьте адрес в регистре A, чтобы указать на него ; следующий байт inc B ; Увеличьте адрес в регистре B, чтобы указать на него ; следующий байт cmp C , # 0 ; Сравните данные, которые мы только что скопировали, с 0 (маркер конца строки) jnz loop ; Если это не было 0, нам нужно скопировать больше, так что вернитесь назад ; и скопируйте следующие байты конца: ; Если мы не зацикливались, значит, мы закончили ; так что продолжай что-нибудь еще.
Эмулятор может работать на аналогичном процессоре, но очень хорошо умеет копировать строки, и эмулятор знает, что может этим воспользоваться. Он может распознать последовательность инструкций по копированию строки и решить переписать их более эффективно непосредственно перед выполнением, чтобы ускорить эмуляцию.
Скажем, на нашем новом процессоре есть инструкция под названием movs , специально разработанная для эффективного копирования строк. Наша теоретическая инструкция movs копирует 16 байтов за раз, без необходимости загружать их в регистр C между ними, но остановится, если скопирует 0 байт (который отмечает конец строки) и установит нулевой флаг. Он также знает, что адреса строк будут в регистрах A и B, поэтому он увеличивает A и B на 16 каждый раз при выполнении, готовый к следующей копии.
Наш новый перекомпилированный код может выглядеть примерно так:
начало: mov A , [ указатель первой строки ] ; Поместите расположение первого символа исходной строки ; в регистре A mov B , [ указатель второй строки ] ; Поместите расположение первого символа целевой строки ; в регистре B цикл: movs [ B ], [ A ] ; Скопируйте 16 байтов по адресу в регистре A в адрес ; в регистре B, затем увеличить A и B на 16 jnz loop ; Если нулевой флаг не установлен, значит, мы не достигли ; конец строки, так что вернитесь и скопируйте еще немного. конец :; Если мы не зацикливались, значит, мы закончили ; так что продолжай что-нибудь еще.
Это дает немедленный выигрыш в скорости просто потому, что процессору не нужно загружать так много инструкций для выполнения одной и той же задачи, но также потому, что инструкция movs, вероятно, будет оптимизирована разработчиком процессора, чтобы быть более эффективной, чем последовательность, используемая в первый пример. Например, он может лучше использовать параллельное выполнение в процессоре для увеличения A и B, пока он все еще копирует байты.
Приложения
Общее назначение
- Многие виртуальные машины Java поддерживают динамическую перекомпиляцию.
- Apple Rosetta для Mac OS X на x86 позволяет запускать код PowerPC на архитектуре x86 .
- Более поздние версии эмулятора Mac 68K, используемые в классической Mac OS для запуска кода 680x0 на оборудовании PowerPC.
- Psyco , специализированный компилятор для Python .
- Проект HP Dynamo , пример прозрачного бинарного динамического оптимизатора . [1]
- DynamoRIO , преемник Dynamo с открытым исходным кодом , работающий с наборами инструкций ARM , x86-64 и IA-64 (Itanium). [2] [3]
- Виртуальная машина Vx32 использует динамическое перекомпиляции для создания ОС -независимой x86 архитектуры песочницы для безопасного применения плагинов .
- Microsoft Virtual PC для Mac, используемый для запуска кода x86 на PowerPC.
- QEMU , полнофункциональный эмулятор системы с открытым исходным кодом.
- FreeKEYB, международный драйвер клавиатуры и консоли DOS со многими улучшениями удобства использования, использовал самомодифицирующийся код и динамическое удаление мертвого кода, чтобы минимизировать его образ в памяти на основе его пользовательской конфигурации (выбранные функции, языки, макеты) и фактической среды выполнения (вариант ОС и версия, загруженные драйверы, базовое оборудование), автоматическое разрешение зависимостей, динамическое перемещение и рекомбинация участков кода на уровне байтов и оптимизация opstrings на основе семантической информации, предоставленной в исходном коде, информации о перемещении, созданной специальными инструментами во время сборки, и полученной информации профиля во время загрузки. [4] [5]
- OVPsim , [6] бесплатный полнофункциональный эмулятор системы.
- VirtualBox использует динамическую перекомпиляцию.
- Valgrind , инструмент программирования для отладки памяти, обнаружения утечек памяти и профилирования, использует динамическую перекомпиляцию.
- Dynimize: виртуализация производительности процессора. Он применяет оптимизацию на основе профиля к запуску процессов Linux с помощью JIT-компиляции. [7]
Игры
- MAME использует динамическую перекомпиляцию в своих эмуляторах ЦП для MIPS, SuperH, PowerPC и даже графических процессоров Voodoo.
- Wii64, эмулятор Nintendo 64 для Wii.
- WiiSX, эмулятор Sony PlayStation для Nintendo Wii.
- Mupen64Plus , мультиплатформенный эмулятор Nintendo 64. [8]
- Yabause , мультиплатформенный эмулятор Saturn . [9]
- Считается, что функция обратной совместимости Xbox 360 (т.е. запуск игр, написанных для оригинальной Xbox ) использует динамическую перекомпиляцию.
- PPSSPP , эмулятор Sony PlayStation Portable . Перекомпиляторы как для x86, так и для ARM.
- PSEmu Pro , эмулятор Sony PlayStation .
- Ultrahle , первый эмулятор Nintendo 64, который полностью запускает коммерческие игры.
- PCSX2 , [10] Sony PlayStation 2 эмулятор, имеет рекомпилятор под названием "microVU", преемник "SuperVU".
- Dolphin , эмулятор Nintendo GameCube и Wii , имеет опцию dynarec.
- GCemu, [11] Nintendo GameCube эмулятора.
- NullDC , эмулятор Sega Dreamcast для x86.
- GEM, [12] Nintendo Game Boy эмулятор MSX использует оптимизирующий динамический рекомпилятор.
- DeSmuME, [13] Nintendo DS эмулятор, имеет опцию Дайнарек.
- Psp, Soywiz в [14] Sony Portable PlayStation эмулятор, имеет Дайнарек вариант.
- RPCS3 , эмулятор Sony PlayStation 3 . Перекомпиляторы PPU и SPU на процессоре Cell для x86-64
- Decaf-emu, эмулятор Wii U , использует динамическую перекомпиляцию (JIT) из PowerPC32 в аппаратное обеспечение с кодом x86_64 с использованием библиотеки libbinrec (сама библиотека может работать на любой аппаратной архитектуре).
Смотрите также
- Бинарный рекомпилятор
- Двоичный перевод
- Сравнение программного обеспечения для виртуализации платформ
- Своевременная компиляция
- Приборостроение (компьютерное программирование)
Рекомендации
- ^ "Технический отчет HP Labs по Dynamo" .
- ^ http://www.dynamorio.org/home.html
- ^ https://github.com/DynamoRIO/dynamorio
- ^ Пол, Маттиас Р .; Фринке, Аксель К. (1997-10-13) [впервые опубликовано в 1991 году], FreeKEYB - Enhanced DOS keyboard and console driver (User Manual) (v6.5 ed.) [1] (NB. FreeKEYB - это основанный на Unicode динамически настраиваемый преемник K3PLUS, поддерживающий большинство раскладок клавиатуры , кодовых страниц и кодов стран . K3PLUS был расширенным драйвером клавиатуры для DOS, широко распространенным в то время в Германии, с адаптациями для нескольких других доступных европейских языков. Он уже поддерживал подмножество функций FreeKEYB, но был статически настроен и не поддерживал динамическое удаление мертвого кода .)
- ^ Пол, Маттиас Р .; Фринке, Аксель К. (16 января 2006 г. ), FreeKEYB - Расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (предварительная редакция версии 7 ).
- ^ «ОВПсим» .
- ^ «Dynimize» .
- ^ Mupen64Plus
- ^ «SH2» .
- ^ «PCSX 2» .
- ^ petebernert. «GCemu» . SourceForge .
- ^ «Эмулятор Gameboy для MSX | Новый образ» . ДРАГОЦЕННЫЙ КАМЕНЬ . Проверено 12 января 2014 .
- ^ «DeSmuME v0.9.9» .
- ^ Публикация Карлоса Бальестероса Веласко (28 июля 2013 г.). "Эмулятор PSP от Soywiz: Выпуск: Эмулятор Psp от Soywiz 28.07.2013 (r525)" . Pspemu.soywiz.com . Проверено 12 января 2014 .
Внешние ссылки
- Учебник по динамическому рекомпилятору
- Сообщения в блоге о написании динамического рекомпилятора MIPS в PPC