Кіріспе
Бинарлық қайта құрастырудың түрі
Есептеу техникасында бинарлық аударма – бұл нұсқаулар тізбегінің бастапқы нұсқаулар жиынтығынан мақсатты нұсқаулар жиынтығына аударылатын бинарлық қайта құрастырудың бір түрі. Кейбір жағдайларда, мысалы, нұсқаулар жиынтығын имитациялау кезінде, мақсатты нұсқаулар жиынтығы бастапқы нұсқаулар жиынтығымен сәйкес келуі мүмкін, бұл нұсқаулардың орындалу жолын, шартты тоқтату нүктелерін және белсенді бөлімдерді анықтау сияқты сынақ және түзету мүмкіндіктерін ұсынады. Оның екі негізгі түрі бар: статикалық және динамикалық бинарлық аударма. Аударма аппараттық (мысалы, процессордағы тізбектер арқылы) немесе бағдарламалық (мысалы, орындалу кезіндегі қозғалтқыштар, статикалық қайта компиляторлар, эмуляторлар) жолмен жүзеге асырылуы мүмкін.
Мотивация
Бинарлық аударма мақсатты платформа үшін бинарлық файлдың болмауына, мақсатты платформа үшін компиляциялауға қажетті бастапқы кодтың жоқтығына немесе мақсатты платформа үшін бастапқы кодты компиляциялаудағы басқа да қиындықтарға байланысты туындайды. Статикалық түрде қайта компиляцияланған бинарлық файлдар эмуляциялық шығындардың жойылғандығынан, сәйкес эмуляцияланған бинарлық файлдардан тезірек жұмыс істейді. Бұл жалпы алғанда интерпретацияланған және компиляцияланған бағдарламалар арасындағы өнімділік айырмашылығына ұқсас.
Статикалық екілік аударма
Статикалық екілік аударманы қолданатын аудармашының мақсаты – динамикалық екілік аудармадағыдай, кодты алдымен іске қоспай, атқарылатын файлдың барлық кодын мақсатты архитектурада іске қосылатын кодқа түрлендіру. Бұл дұрыс орындау өте қиын, себебі аудармашы барлық кодты анықтай алмайды. Мысалы, атқарылатын файлдың кейбір бөлімдеріне тек жанама тармақтар арқылы ғана қол жеткізуге болады, ал олардың мәні тек іске қосылған кезде ғана белгілі болады. Мұндай статикалық екілік аудармашылардың бірі – Сорaв Бансал мен Алекс Айкен (Стэнфорд университеті) әзірлеген универсалды супероптимизаторлық пипхоль технологиясын қолданады. Бұл технология мүмкін болатын көптеген бастапқы және мақсатты жұптар арасында тиімді аударма жасауға мүмкіндік береді, сонымен қатар даму шығындары төмен және мақсатты екілік файлдың өнімділігі жоғары. PowerPC-ден x86-ға жасалған аудармалар тәжірибесінде кейбір екілік файлдар тіпті түпнұсқа нұсқалардан да жақсы жұмыс істеді, бірақ орташа есеп бойынша олар түпнұсқа жылдамдықтың үштен екісімен жұмыс істеді.
Статикалық екілік аудармалардың мысалдары
Honeywell компаниясы өздерінің Honeywell 200 компьютерлер сериясы үшін Liberator деп аталатын бағдарлама ұсынды; ол IBM 1400 компьютерлер сериясы үшін жазылған бағдарламаларды Honeywell 200 сериясы үшін бағдарламаларға аудара алатын. 2014 жылы 1998 жылғы StarCraft видеоойынының ARM архитектурасы нұсқасы статикалық қайта компиляциялау және бастапқы x86 нұсқасын кері инженериялау арқылы жасалды. Pandora қолға ұсталатын құрылғылар қауымдастығы қажетті құралдарды өздері жасап, мұндай аудармаларды бірнеше рет сәтті орындады. Мысалы, 2014 жылы Cube World видеоойынының процедуралық ландшафт генераторы үшін x86-дан x64-ке статикалық қайта компиляциялау сәтті жүзеге асырылды. Тағы бір мысал – 2013 жылы LLVM пайдаланылып жасалған Super Mario Bros. видеоойынының NES-тен x86-ға статикалық қайта компиляцияланған нұсқасы. 2004 жылы Nintendo компаниясындағы Скотт Эллиотт пен Филип Р. Хатчинсон Game Boy бинарлық кодын "C" кодын шығаруға арналған құралды жасады, одан кейін оны жаңа платформаға компиляциялауға және әуежайдағы ойын-сауық жүйелерінде пайдалану үшін аппараттық кітапханаға байланыстыруға болады. 1995 жылы Норман Рамси Bell Communications Research және Мэри Ф. Фернандес Принстон университетінің Компьютерлік ғылымдар кафедрасында статикалық құрастыру аудармасы үшін негізгі құралдары бар New Jersey Machine Code Toolkit құралын жасады.
Динамикалық екілік аударма
Динамикалық екілік аударма (ДВТ) кодтың қысқа тізбесін – әдетте бір негізгі блок деңгейінде – қарастырып, оны аударады және нәтижесіндегі тізбекті кэште сақтайды. Код тек қана оның табылуымен және мүмкіндігі болған жағдайда аударылады, ал тармақталу нұсқаулары бұрын аударылған және сақталған кодқа (мемоизация) бағытталды. Динамикалық екілік аударма қарапайым эмуляциядан (эмулятордың негізгі оқу-декодтау-орындау циклін жою – өнімділіктің маңызды шектеуі) өзгешеленеді, бірақ бұл аударма уақытындағы үлкен шығындармен өтеледі. Аударылған код тізбектері бірнеше рет орындалғанда бұл шығындар өтелуі тиіс. Күрделі динамикалық аудармашылар динамикалық қайта компиляцияны қолданады, онда аударылған кодтың қай бөліктері көп рет орындалатынын анықтау үшін құралдар пайдаланылады және осы бөліктер белсенді түрде оңтайландырылады. Бұл техника JIT компиляторын еске түсіреді, және іс жүзінде мұндай компиляторларды (мысалы, Sun's HotSpot технологиясы) виртуалды нұсқаулар жиынтығынан (байт-кодтан) нақты нұсқаулар жиынтығына динамикалық аудармашылар ретінде қарастыруға болады.
Бағдарламалық жасақтағы динамикалық екілік аудармалардың мысалдары
Apple Computer Macintosh-тың PowerPC желісінде M68K коды үшін динамикалық аударма эмуляторын іске қосты, бұл динамикалық екілік аударма жүйесі жылдам кодты түсіндіруді екі фазалы динамикалық аудармамен біріктіреді, бұл HP UX серверлері үшін HP UX 11i-де HP 9000 HP UX қосымшаларын ашық және дәл орындауға мүмкіндік береді. ARIES жылдам аудармашысы пайдаланушының араласуынсыз артықшылықтары жоқ PA RISC нұсқауларының толық жиынтығын эмуляциялайды. Интерпретация кезінде ол қолданбаның орындалу үлгісін бақылайды және тек жиі орындалатын кодты Itanium кодты орындалу кезінде аударады. ARIES екі фазалы динамикалық аударманы іске асырады, бұл бірінші фазада аударылған код екінші фазадағы аударма кезінде аударылған кодты одан әрі оңтайландыру үшін пайдаланылатын орындау уақыты туралы ақпаратты жинайды. ARIES динамикалық аударылған кодты код кэш деп аталатын жад буферінде сақтайды. Аударған негізгі блоктарға қосымша сілтемелер код кэшінде тікелей орындалады және қосымша түсіндіруді немесе аударманы қажет етпейді. Аудармаланған код блоктарының мақсаттары орындалудың көбінесе код кэшінде өтетінін қамтамасыз ету үшін қайта жаңартылады. Эмуляция аяқталғаннан кейін ARIES түпнұсқалық бағдарламаны өзгертпей, барлық аударылған кодты тастайды. ARIES эмуляция қозғалтқышы сонымен қатар HP 9000 HP UX қосымшасының жүйелік шақыруларын, сигнал беруді, ерекшеліктерді басқаруды, жіптерді басқаруды, жөндеу үшін HP GDB эмуляциясын және қосымша үшін негізгі файлдарды құруды эмуляциялайтын Environment Emulation-ті іске асырады. DEC x86 қолданбаларын Alpha қолданбаларына түрлендіру үшін FX!32 бинарлық аударғышты жасады. Өз веб-сайтындағы жиі қойылатын сұрақтардан Intel корпорациясы Itanium негізделген жүйелерде IA 32 қосымшаларын қолдау үшін жасалған динамикалық екілік аудармашыны IA 32 Execution Layer-ді әзірледі және іске асырады, ол Itanium архитектурасы үшін Microsoft Windows Server-ге, сондай-ақ Red Hat және Suse-ді қоса алғанда, Linux-тың бірнеше нұсқаларына енгізілді. Ол IA 32 қолданбаларын Itanium процессорларында IA 32 режимін қолданудан гөрі жылдам орындауға мүмкіндік берді. Dolphin (GameCube/Wii эмуляторы) PowerPC кодын x86 және AArch64-ке JIT қайта құрастыруды орындайды. Microsoft Virtual PC 32 биттік қонақ операциялық жүйелер үшін екілік аударманы қолдайды.
Intel Corporation developed and implemented an IA 32 Execution Layer a dynamic binary translator designed to support IA 32 applications on Itanium based systems, which was included in Microsoft Windows Server for Itanium architecture, as well as in several flavors of Linux, including Red Hat and Suse. It allowed IA 32 applications to run faster than they would using the native IA 32 mode on Itanium processors. Dolphin (an emulator for the GameCube/Wii) performs JIT recompilation of PowerPC code to x86 and AArch64. Microsoft Virtual PC supports binary translation for 32 bit guest operating systems.
Қондырмадағы динамикалық екілік аудармалардың мысалдары
Nvidia Tegra K1 Denver ARM нұсқауларын баяу аппараттық декодер арқылы өзінің түпкілікті микрокод нұсқауларына аударады және жиі қолданылатын код үшін бағдарламалық екілік аудармашыны пайдаланады.