Ця стаття не містить . (8 лютого 2021) |
В інформатиці динамічна перекомпіляція (іноді скорочена до dynarec або псевдо-акронім DRC) є особливістю деяких емуляторів та віртуальних машин, де система може перекомпілювати якусь частину програми під час виконання. Компілюючи під час виконання, система може адаптувати згенерований код, щоб відображати середовище виконання програми, і потенційно може виробляти більш ефективний код, використовуючи інформацію, недоступну для традиційного статичного компілятора.
Використання
Більшість динамічних рекомпіляторів використовуються для перетворення машинного коду між архітектурами під час виконання. Це завдання часто потрібне при емуляції застарілих ігрових платформ. В інших випадках система може застосовувати динамічну рекомпіляцію як частину адаптивної стратегії оптимізації для виконання переносного представлення програми, такого як байт-коди Java або .NET Common Language Runtime. Повношвидкісні налагоджувачі також використовують динамічну рекомпіляцію, щоб зменшити накладні витрати на простір, що виникають у більшості методів деоптимізації, та інші функції, такі як динамічна міграція потоків.
Завдання
Основними завданнями, які повинен виконувати динамічний рекомпілятор, є:
- Читання машинного коду з вихідної платформи
- Видає машинний код для цільової платформи
Динамічний рекомпілятор може також виконувати деякі допоміжні завдання:
- Керування кешем перекомпільованого коду
- Оновлення підрахунку минулого циклу на платформах за допомогою регістрів підрахунку циклів
- Управління перевіркою переривань
- Надання інтерфейсу для віртуалізованого обладнання підтримки, наприклад, графічного процесора
- Оптимізація структур коду вищого рівня для ефективної роботи на цільовому обладнанні (див. нижче)
Приклади
Припустимо, програма запускається в емуляторі і їй потрібно скопіювати рядок із нульовим закінченням. Програма складена спочатку для дуже простого процесора. Цей процесор може одночасно копіювати лише байт, і це потрібно робити, спочатку зчитуючи його з вихідного рядка в регістр, а потім записуючи з цього реєстру в рядок призначення. Оригінальна програма може виглядати приблизно так:
beginnig: mov A,[first string pointer] mov B,[second string pointer] loop: mov C,[A] mov [B],C inc A inc B cmp C,#0 jnz loop end:
Можливо, емулятор працює на схожому процесорі, але надзвичайно добре копіює рядки, і емулятор знає, що може цим скористатися. Він може розпізнати послідовність інструкцій щодо копіювання рядків та вирішити переписати їх ефективніше користування перед виконанням, щоб скористатися емуляцією.
Скажімо, є інструкція щодо нашого нового процесора під назвою movs, спеціально розроблена для ефективного копіювання рядків. Наша теоретична інструкція movs копіює 16 байтів за раз, без необхідності завантаження їх у регістр C між ними, але в центрі, якщо копіює 0 байт (що визначає кінець рядка) і встановлює нульовий прапор. Він також знає, що адреси рядків будуть у реєстрації A та B, а потім він збільшує A та B на 16 кожного разу, коли він виконується, готовий до наступної копії.
Наш новий перекомпонований код може виглядати приблизно так:
beginnig: mov A,[first string pointer] mov B,[second string pointer] loop: movs [B],[A] jnz loop end:
Існує негайна перевага в швидкості просто тому, що процесору не потрібно завантажувати стільки інструкцій, щоб виконати одне і те ж завдання, а й тому, що інструкція movs, ймовірно, буде оптимізована дизайнером процесора, щоб бути ефективнішою, ніж послідовність, яка використовується в перший приклад. Наприклад, він може краще використовувати паралельне виконання в процесорі для збільшення A і B, поки він ще копіює байти.
Приклади використання
Приклади в програмах
Цей розділ має вигляд переліку, який краще подати . (8 лютого 2021) |
Багато віртуальних машин Java мають динамічну рекомпіляцію.
Apple's Rosetta для Mac OS X на x86, дозволяє запускати код PowerPC на архітектурі x86.
Пізніші версії емулятора Mac 68K, що використовуються в класичній Mac OS, для запуску коду 680x0 на апаратному забезпеченні PowerPC.
Psyco, спеціалізований компілятор для Python.
Проект HP Dynamo, приклад прозорого двійкового динамічного оптимізатора.
DynamoRIO, наступник Dynamo з відкритим кодом, який працює з наборами інструкцій ARM, x86-64 та IA-64 (Itanium).
Віртуальна машина Vx32 використовує динамічну перекомпіляцію для створення незалежних від ОС пісочниць архітектури x86 для безпечних додатків.
Віртуальний ПК Microsoft для Mac, який використовується для запуску коду x86 на PowerPC.
QEMU, емулятор повноцінної системи з відкритим кодом.
FreeKEYB, міжнародний DOS-драйвер клавіатури та консолі з багатьма покращеннями юзабіліті, використовував самомодифікуючий код та динамічне видалення мертвого коду, щоб мінімізувати його зображення в пам'яті на основі його конфігурації користувача (вибрані функції, мови, макети) та фактичного середовища виконання (варіант ОС та версія, завантажені драйвери, базове обладнання), автоматичне вирішення залежностей, динамічне переміщення та повторне поєднання розділів коду на рівні байтовості та оптимізація опстрингів на основі семантичної інформації, наданої у вихідному коді, інформації про переміщення, що генерується спеціальними інструментами під час складання та інформації профілю під час завантаження.
OVPsim, вільно доступний повний емулятор системи.
VirtualBox використовує динамічну рекомпіляцію.
Valgrind, інструмент програмування для налагодження пам'яті, виявлення витоків пам'яті та профілювання, використовує динамічну рекомпіляцію.
Приклади в іграх
Цей розділ має вигляд переліку, який краще подати . (8 лютого 2021) |
MAME використовує динамічну рекомпіляцію в своїх емуляторах процесорів для MIPS, SuperH, PowerPC і навіть графічних процесорів Voodoo.
Wii64, емулятор Nintendo 64 для Wii.
WiiSX, емулятор Sony PlayStation для Nintendo Wii.
Mupen64Plus, багатоплатформовий емулятор Nintendo 64.
Yabause, багатоплатформовий емулятор Сатурна.
У функціоналах зворотної сумісності Xbox 360 (тобто запущених ігор, написаних для оригінального Xbox) широко застосовується динамічна рекомпіляція.
PPSSPP, портативний емулятор Sony PlayStation. Перекомпілятори для x86 та ARM.
PSEmu Pro, емулятор Sony PlayStation.
Ultrahle, перший емулятор Nintendo 64, який повністю запускає комерційні ігри.
PCSX2, [9] емулятор Sony PlayStation 2, має рекомпілятор під назвою «microVU», наступник «SuperVU».
Dolphin, емулятор 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 на стільниковому процесорі для x86-64
Decaf-emu, емулятор Wii U, використовує динамічну перекомпіляцію (JIT) з PowerPC32 до обладнання коду x86_64 за допомогою бібліотеки libbinrec (сама бібліотека може працювати на будь-якій апаратній архітектурі).
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno 8 lyutogo 2021 V informatici dinamichna perekompilyaciya inodi skorochena do dynarec abo psevdo akronim DRC ye osoblivistyu deyakih emulyatoriv ta virtualnih mashin de sistema mozhe perekompilyuvati yakus chastinu programi pid chas vikonannya Kompilyuyuchi pid chas vikonannya sistema mozhe adaptuvati zgenerovanij kod shob vidobrazhati seredovishe vikonannya programi i potencijno mozhe viroblyati bilsh efektivnij kod vikoristovuyuchi informaciyu nedostupnu dlya tradicijnogo statichnogo kompilyatora VikoristannyaBilshist dinamichnih rekompilyatoriv vikoristovuyutsya dlya peretvorennya mashinnogo kodu mizh arhitekturami pid chas vikonannya Ce zavdannya chasto potribne pri emulyaciyi zastarilih igrovih platform V inshih vipadkah sistema mozhe zastosovuvati dinamichnu rekompilyaciyu yak chastinu adaptivnoyi strategiyi optimizaciyi dlya vikonannya perenosnogo predstavlennya programi takogo yak bajt kodi Java abo NET Common Language Runtime Povnoshvidkisni nalagodzhuvachi takozh vikoristovuyut dinamichnu rekompilyaciyu shob zmenshiti nakladni vitrati na prostir sho vinikayut u bilshosti metodiv deoptimizaciyi ta inshi funkciyi taki yak dinamichna migraciya potokiv ZavdannyaOsnovnimi zavdannyami yaki povinen vikonuvati dinamichnij rekompilyator ye Chitannya mashinnogo kodu z vihidnoyi platformi Vidaye mashinnij kod dlya cilovoyi platformi Dinamichnij rekompilyator mozhe takozh vikonuvati deyaki dopomizhni zavdannya Keruvannya keshem perekompilovanogo kodu Onovlennya pidrahunku minulogo ciklu na platformah za dopomogoyu registriv pidrahunku cikliv Upravlinnya perevirkoyu pererivan Nadannya interfejsu dlya virtualizovanogo obladnannya pidtrimki napriklad grafichnogo procesora Optimizaciya struktur kodu vishogo rivnya dlya efektivnoyi roboti na cilovomu obladnanni div nizhche PrikladiPripustimo programa zapuskayetsya v emulyatori i yij potribno skopiyuvati ryadok iz nulovim zakinchennyam Programa skladena spochatku dlya duzhe prostogo procesora Cej procesor mozhe odnochasno kopiyuvati lishe bajt i ce potribno robiti spochatku zchituyuchi jogo z vihidnogo ryadka v registr a potim zapisuyuchi z cogo reyestru v ryadok priznachennya Originalna programa mozhe viglyadati priblizno tak beginnig mov A first string pointer mov B second string pointer loop mov C A mov B C inc A inc B cmp C 0 jnz loop end Mozhlivo emulyator pracyuye na shozhomu procesori ale nadzvichajno dobre kopiyuye ryadki i emulyator znaye sho mozhe cim skoristatisya Vin mozhe rozpiznati poslidovnist instrukcij shodo kopiyuvannya ryadkiv ta virishiti perepisati yih efektivnishe koristuvannya pered vikonannyam shob skoristatisya emulyaciyeyu Skazhimo ye instrukciya shodo nashogo novogo procesora pid nazvoyu movs specialno rozroblena dlya efektivnogo kopiyuvannya ryadkiv Nasha teoretichna instrukciya movs kopiyuye 16 bajtiv za raz bez neobhidnosti zavantazhennya yih u registr C mizh nimi ale v centri yaksho kopiyuye 0 bajt sho viznachaye kinec ryadka i vstanovlyuye nulovij prapor Vin takozh znaye sho adresi ryadkiv budut u reyestraciyi A ta B a potim vin zbilshuye A ta B na 16 kozhnogo razu koli vin vikonuyetsya gotovij do nastupnoyi kopiyi Nash novij perekomponovanij kod mozhe viglyadati priblizno tak beginnig mov A first string pointer mov B second string pointer loop movs B A jnz loop end Isnuye negajna perevaga v shvidkosti prosto tomu sho procesoru ne potribno zavantazhuvati stilki instrukcij shob vikonati odne i te zh zavdannya a j tomu sho instrukciya movs jmovirno bude optimizovana dizajnerom procesora shob buti efektivnishoyu nizh poslidovnist yaka vikoristovuyetsya v pershij priklad Napriklad vin mozhe krashe vikoristovuvati paralelne vikonannya v procesori dlya zbilshennya A i B poki vin she kopiyuye bajti Prikladi vikoristannyaPrikladi v programah Cej rozdil maye viglyad pereliku yakij krashe podati prozoyu Vi mozhete dopomogti viklasti spisok prozoyu de ce dorechno Oznajomtesya z dovidkoyu z redaguvannya 8 lyutogo 2021 Bagato virtualnih mashin Java mayut dinamichnu rekompilyaciyu Apple s Rosetta dlya Mac OS X na x86 dozvolyaye zapuskati kod PowerPC na arhitekturi x86 Piznishi versiyi emulyatora Mac 68K sho vikoristovuyutsya v klasichnij Mac OS dlya zapusku kodu 680x0 na aparatnomu zabezpechenni PowerPC Psyco specializovanij kompilyator dlya Python Proekt HP Dynamo priklad prozorogo dvijkovogo dinamichnogo optimizatora DynamoRIO nastupnik Dynamo z vidkritim kodom yakij pracyuye z naborami instrukcij ARM x86 64 ta IA 64 Itanium Virtualna mashina Vx32 vikoristovuye dinamichnu perekompilyaciyu dlya stvorennya nezalezhnih vid OS pisochnic arhitekturi x86 dlya bezpechnih dodatkiv Virtualnij PK Microsoft dlya Mac yakij vikoristovuyetsya dlya zapusku kodu x86 na PowerPC QEMU emulyator povnocinnoyi sistemi z vidkritim kodom FreeKEYB mizhnarodnij DOS drajver klaviaturi ta konsoli z bagatma pokrashennyami yuzabiliti vikoristovuvav samomodifikuyuchij kod ta dinamichne vidalennya mertvogo kodu shob minimizuvati jogo zobrazhennya v pam yati na osnovi jogo konfiguraciyi koristuvacha vibrani funkciyi movi maketi ta faktichnogo seredovisha vikonannya variant OS ta versiya zavantazheni drajveri bazove obladnannya avtomatichne virishennya zalezhnostej dinamichne peremishennya ta povtorne poyednannya rozdiliv kodu na rivni bajtovosti ta optimizaciya opstringiv na osnovi semantichnoyi informaciyi nadanoyi u vihidnomu kodi informaciyi pro peremishennya sho generuyetsya specialnimi instrumentami pid chas skladannya ta informaciyi profilyu pid chas zavantazhennya OVPsim vilno dostupnij povnij emulyator sistemi VirtualBox vikoristovuye dinamichnu rekompilyaciyu Valgrind instrument programuvannya dlya nalagodzhennya pam yati viyavlennya vitokiv pam yati ta profilyuvannya vikoristovuye dinamichnu rekompilyaciyu Prikladi v igrah Cej rozdil maye viglyad pereliku yakij krashe podati prozoyu Vi mozhete dopomogti viklasti spisok prozoyu de ce dorechno Oznajomtesya z dovidkoyu z redaguvannya 8 lyutogo 2021 MAME vikoristovuye dinamichnu rekompilyaciyu v svoyih emulyatorah procesoriv dlya MIPS SuperH PowerPC i navit grafichnih procesoriv Voodoo Wii64 emulyator Nintendo 64 dlya Wii WiiSX emulyator Sony PlayStation dlya Nintendo Wii Mupen64Plus bagatoplatformovij emulyator Nintendo 64 Yabause bagatoplatformovij emulyator Saturna U funkcionalah zvorotnoyi sumisnosti Xbox 360 tobto zapushenih igor napisanih dlya originalnogo Xbox shiroko zastosovuyetsya dinamichna rekompilyaciya PPSSPP portativnij emulyator Sony PlayStation Perekompilyatori dlya x86 ta ARM PSEmu Pro emulyator Sony PlayStation Ultrahle pershij emulyator Nintendo 64 yakij povnistyu zapuskaye komercijni igri PCSX2 9 emulyator Sony PlayStation 2 maye rekompilyator pid nazvoyu microVU nastupnik SuperVU Dolphin emulyator Nintendo GameCube ta Wii maye opciyu Dynarec GCemu 10 emulyator Nintendo GameCube NullDC emulyator Sega Dreamcast dlya x86 GEM 11 emulyator Nintendo Game Boy dlya MSX vikoristovuye optimizuyuchij dinamichnij rekompilyator DeSmuME 12 emulyator Nintendo DS maye opciyu dynarec Soywiz s Psp 13 portativnij emulyator Sony PlayStation maye opciyu dynarec RPCS3 emulyator Sony PlayStation 3 Perekompilyuye yak PPU tak i SPU na stilnikovomu procesori dlya x86 64 Decaf emu emulyator Wii U vikoristovuye dinamichnu perekompilyaciyu JIT z PowerPC32 do obladnannya kodu x86 64 za dopomogoyu biblioteki libbinrec sama biblioteka mozhe pracyuvati na bud yakij aparatnij arhitekturi