Бінарний переклад

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Два основних типи цього процесу — це статичний та динамічний бінарний переклади. Переклад може бути виконаний в апаратному забезпеченні[1] (наприклад, за допомогою схем в ЦП) або в програмному забезпеченні[2] (наприклад, за допомогою двигунів виконання, статичних рекомпіляторів або емуляторів).

Використання[ред. | ред. код]

Бінарний переклад використовується у випадках, коли відсутня бінарна версія для цільової платформи, немає вихідного коду для компіляції для цільової платформи, або інші труднощі щодо компіляції[3] початкового коду для цільової платформи.

Статично перекомпільовані бінарні файли[4] потенційно працюють швидше, ніж відповідні емульовані бінарні файли, оскільки відсутні накладні витрати на емуляцію. Це схоже на відмінність у продуктивності між інтерпретованими та скомпільованими програмами загалом.

Статичний бінарний переклад[ред. | ред. код]

Перекладач, який використовує статичний бінарний переклад, має на меті конвертувати весь код виконуваного файлу у код, який працює на цільовій архітектурі, не запускаючи код спочатку, як це робиться в динамічному бінарному перекладі. Це дуже складно зробити правильно, оскільки не весь код може бути виявлений перекладачем. Наприклад, деякі частини виконуваного файлу можуть бути доступні лише через непрямі переходи, значення яких відомі тільки під час виконання.

Один з таких статичних бінарних перекладачів використовує універсальну технологію peephole-супероптимізатора (розроблену Соравом Бансалом та Алексом Ейкеном зі Стенфордського університету), щоб виконувати ефективний переклад між можливо багатьма початковими та цільовими парами зі значно низькими витратами на розробку та високою продуктивністю цільового бінарного файлу. У експериментах із перекладом з PowerPC на x86, деякі бінарні файли навіть перевершили відповідні нативні версії, але в середньому вони працювали зі швидкістю двох третин від нативної швидкості.

Приклади статичного бінарного перекладу

Honeywell створив програму під назвою Liberator для їх комп'ютерів серії Honeywell 200, яка могла перекладати програми для комп'ютерів серії IBM 1400 у програми для серії Honeywell 200.

У 2014 році була згенерована версія відеогри StarCraft 1998 року під архітектуру ARM за допомогою статичної перекомпіляції[5] та додаткової зворотного проєктування оригінальної версії x86. Спільнота портативної консолі Pandora була здатна самостійно розробити необхідні інструменти та успішно виконати такі переклади кілька разів.

Наприклад, у 2014 році було згенеровано успішну статичну перекомпіляцію x86 до x64 для процедурного генератора ландшафту відеогри Cube World.

Іншим прикладом є статично перекомпільована версія відеогри Super Mario Bros. з NES до x86, яка була згенерована з використанням LLVM у 2013 році.

У 2004 році Скотт Елліот та Філліп Р. Гатчінсон у Nintendo розробили інструмент для генерації коду "C" з бінарного коду Game Boy, який потім можна скомпілювати для нової платформи та зв'язати з бібліотекою апаратного забезпечення для використання в системах авіакомпаній.

У 1995 році Норман Ремзі в Bell Communications Research та Мері Ф. Фернандез з кафедри комп'ютерних наук у Принстонському університеті розробили The New Jersey Machine-Code Toolkit, який мав базові інструменти для статичного перекладу збірки.

Динамічний бінарний переклад[ред. | ред. код]

Динамічний бінарний переклад (ДБП) дивиться на коротку послідовність коду, зазвичай на порядок одного базового блоку, перекладає його та кешує отриману послідовність. Код перекладається лише під час його виявлення, коли це можливо, і команди переходу спрямовуються на вже перекладений та збережений код (мемоізація[6]).

Динамічний бінарний переклад відрізняється від простого емулювання (елімінуючи головний цикл зчитування-декодування-виконання емулятора, що є основною проблемою продуктивності), замінюючи його великими накладними витратами під час перекладу. Ці накладні витрати, сподіваються, будуть амортизовані в процесі багаторазового виконання перекладених послідовностей коду.

Більш розширені динамічні перекладачі використовують динамічну рекомпіляцію, де перекладений код інструментується для визначення того, які його частини виконуються багато разів, і ці частини оптимізуються агресивно. Ця техніка нагадує компілятор Just-in-time (JIT), і насправді такі компілятори[7] (наприклад, технологія Sun's HotSpot) можуть розглядатись як динамічні перекладачі віртуального набору інструкцій (байт-коду) до реального набору.

Приклади використання динамічного бінарного перекладу в програмному забезпеченні

  • Компанія Apple реалізувала динамічний емулятор перекладу для M68K-коду на своїх PowerPC-комп'ютерах Macintosh, який досяг дуже високого рівня надійності, продуктивності та сумісності. Це дозволило Apple випустити машини на ринок з частково нативною операційною системою, і кінцеві користувачі могли перейти на нову, швидшу умову, не ризикуючи своїми інвестиціями в програмне забезпечення. Частково через те, що емулятор був настільки успішним, багато частин операційної системи залишались емульованими. Повний перехід до нативної операційної системи PowerPC був здійснений лише з випуском Mac OS X (10.0) у 2001 році. (Середовище роботи "Classic" Mac OS X продовжувало надавати цю можливість емуляції на PowerPC Mac до Mac OS X 10.5.)
  • Mac OS X 10.4.4 для Mac-комп'ютерів на базі процесорів Intel впровадила динамічний перекладацький шар Rosetta[8], щоб спростити перехід Apple від обладнання на базі PPC до x86. Розроблена для Apple компанією Transitive Corporation, програмне забезпечення Rosetta є реалізацією рішення QuickTransit від Transitive.
  • QuickTransit протягом свого життєвого циклу також надавала підтримку перекладу SPARCx86, x86PowerPC та MIPSItanium 2.
  • DEC досягла подібного успіху зі своїми інструментами перекладу, щоб допомогти користувачам мігрувати з архітектури CISC VAX на архітектуру RISC Alpha.
  • HP ARIES (Automatic Re-translation and Integrated Environment Simulation) є системою динамічного бінарного перекладу програмного забезпечення, яка поєднує швидке інтерпретування коду з двофазовим динамічним перекладом для безшовного та точного виконання додатків HP-UX 9000 на серверах HP-UX 11i для HPE Integrity. Швидкий інтерпретатор ARIES емулює повний набір інструкцій PA-RISC без привілеїв без втручання користувача. Під час інтерпретації він моніторить патерн виконання додатка та перекладає на власний код Itanium тільки той код, який виконується часто. ARIES використовує двофазовий динамічний переклад, техніку, за допомогою якої перекладений код в першій фазі збирає інформацію про профіль виконання, яка використовується під час другої фази перекладу для додаткової оптимізації перекладеного коду. ARIES зберігає динамічно перекладений код у буфері пам'яті, названому кешем коду. Подальші посилання на перекладені блоки базового рівня виконуються безпосередньо у кеші коду та не потребують додаткової інтерпретації чи перекладу. Цілі перекладених блоків коду повертаються до кешу коду, щоб забезпечити виконання коду в кеші більшу частину часу. Після емуляції ARIES видаляє весь перекладений код без змінення оригінального додатка. Двигун емуляції ARIES також реалізує емуляцію середовища, яка емулює системні виклики, доставлення сигналів, управління винятками, управління потоками, емуляцію HP GDB для налагодження та створення файлів ядра для додатка.
  • DEC створила бінарний перекладач FX!32 для конвертування додатків x86 в додатки для Alpha.
  • Wabi від Sun Microsystems включала динамічний переклад від x86 до SPARC інструкцій.
  • У січні 2000 року компанія Transmeta Corporation оголосила про новий дизайн процесора під назвою Crusoe. З FAQ (Часто задавані питання) на їх вебсайті,

Розумний мікропроцесор складається з апаратного ядра VLIW в як двигуна та програмного рівня під назвою програмне забезпечення Code Morphing. Програмне забезпечення Code Morphing діє як оболонка [...], перетворюючи або перекладаючи x86 інструкції на власні інструкції Crusoe. Крім того, програмне забезпечення Code Morphing містить динамічний компілятор та оптимізатор коду [...]. Результатом є збільшення продуктивності при мінімальному споживанні енергії. [...] Це дозволяє Transmeta розвивати апаратне ядро VLIW та програмне забезпечення Code Morphing окремо, не впливаючи на велику кількість програмних застосунків.

  • Корпорація Intel розробила та впровадила Шару виконання IA-32 — динамічний бінарний транслятор, створений для підтримки додатків IA-32 на системах, що базуються на Itanium, включений у Microsoft Windows Server для архітектури Itanium, а також у деякі версії Linux, включаючи Red Hat та Suse. Він дозволяв додаткам IA-32 працювати швидше, ніж вони працювали б в нативному режимі IA-32 на процесорах Itanium.
  • Dolphin (емулятор для консолей GameCube/Wii) виконує JIT рекомпіляцію коду PowerPC до x86 та AArch64.

Приклади динамічної бінарної трансляції в апаратурі

  • Процесори x86 від Intel, починаючи з Pentium Pro[9], транслюють складні інструкції CISC x86 на більш RISC-подібні внутрішні мікрооперації.
  • Nvidia Tegra K1 Denver транслює інструкції ARM за допомогою повільного апаратного декодера на його власні мікрокодові інструкції та використовує програмний бінарний транслятор для гарячого коду.

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. Wikiwand - Апаратне забезпечення. Wikiwand. Процитовано 15 квітня 2023.
  2. Step by step: Програмне забезпечення. step.org.ua. Процитовано 15 квітня 2023.
  3. Компіляція. ВУЕ (укр.). Процитовано 15 квітня 2023.
  4. Python. Бінарні файли. Приклади роботи з бінарними файлами | BestProg. www.bestprog.net. Процитовано 15 квітня 2023.
  5. Статичне та динамічне лінкування: У чому різниця?. www.ranktracker.com (укр.). 4 квітня 2023. Процитовано 15 квітня 2023.
  6. Mammedov, Dadaş (16 серпня 2021). Мемоізація. www.wiki-data.uk-ua.nina.az (укр.). Процитовано 15 квітня 2023.
  7. Компілятор – UA5.org (укр.). Процитовано 15 квітня 2023.
  8. Mammedov, Dadaş. Rosetta. www.wiki-data.uk-ua.nina.az (укр.). Процитовано 15 квітня 2023.
  9. Intel Pentium Pro. www.elektronik-kompendium.de (de-DE) . Процитовано 15 квітня 2023.