Skip to content

Бинарная трансляция

AnastasiaShevchenko edited this page Feb 24, 2016 · 2 revisions

Бинарная трансляция

Когда Digital начали разрабатывать Alpha AXP архитектуру осенью 1988 года, команда Alpha AXP была озабочена тем, чтобы запускать существующие VAX и MIPS коды на новых Alpha AXP компьютерах. Чтобы получить максимальную производительность на новой архитектуре, приложение должно быть портированно, то есть перестроенно с использованием компилятора, соответствующего архитектуре. Для одной программы, написанной на стандартном языке программирования, это вопрос перекомпиляции и запуска. Сложное софтварное приложение, однако, может быть построено из сотен источников и десятков различных тулов. Портирование такого приложения возможно только когда все части пути построения работают на новой архитектуре.

Таким образом, возможность запускать существующую на старой архитектуре бинарную версию сложного приложения на новой архитектуре – важная промежуточная мера. Она позволяет пользователю запускать приложения сразу же, с минимальными затратами на портирование. Когда же привычная для пользователя среда установлена, приложения могут быть перестроены со временем, используя коды новой архитектуры или частично новой, частично старой. Используются несколько техник, чтобы запускать бинарные коды старой архитектуры на новой. Вот некоторые из них в порядке увеличения скорости:

  • Софтварный интерпретатор (например, Insignia Solutions' SoftPC)
  • Микрокодовый эмулятор (например, PDP-11 режим совместимости в ранних VAX компьютерах)
  • Бинарный транслятор (например, Hunter System's XDOS)
  • Нативный компилятор

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

Транслированная бинарная программа – это последовательность инструкций новой архитектуры, которая воспроизводит поведение программы на старой архитектуре. Обычно, большая часть статусной информации старой машины хранится в регистрах новой. Транслированный код правдоподобно воспроизводит стандарты вызовов, неявное состояние, побочные эффекты инструкций, поток переходов и другие артефакты старой машины. Транслированные программы могут быть значительно быстрее, чем интерпретаторы и эмуляторы, но медленнее, чем программы на «родной» архитектуре. Трансляторы могут быть классифицированы либо как связанные системы трансляции (1), где все инструкции старой программы должны существовать во время трансляции и должны быть найдены и транслированны в новые инструкции, либо как системы трансляции с открытым концом (2), где код может быть найден, создан или модифицирован во время исполнения. Связанные системы обычно требуют ручного вмешательства, чтобы найти 100% кода, системы же с открытым концом могут быть полностью автоматическими.

Чтобы запускать существующие VAX и MIPS программы, абсолютно необходима система трансляции второго типа. Например, некоторые пользовательские программы пишут код, проверяющий лицензию (VAX инструкции), в память, и переходят на этот код. Связанная система не справляется с подобными программами.

Нативно-скомпилированная программа – это последовательность инструкций новой архитектуры, созданная перекомпиляцией программы. Обычно, нативно-скомпилированные программы используют более новые, более быстрые соглашения о вызовах, чем старые программы. С хорошим оптимизирующим компилятором, нативно-скомпилированные программы могут быть значительно быстрее всех остальных вариантов.

Большинство больших программ не самостоятельны: они обращаются к библиотекам, базам данных, тулкитам и т.п. Также, эти программы (напрямую или не напрямую) вызывают сервисы операционной системы. В простых окружениях с единственной доминантной библиотекой может быть достаточно переписать эту библиотеку в нативный код и интерпретировать пользовательские программы, особенно те, которые большую часть времени в библиотеке. Эта стратегия широко используется, чтобы запускать программы Windows и Macintosh под Unix.

В более устойчивых окружениях не практично переписывать все общие библиотеки вручную, коллекции десятков или даже сотен изображений (такие как типичные VAX ALL-IN-1 системы) должны быть запущены в старом окружении с периодической выгрузкой в нативную операционную систему. Со временем становится выгодным 1) перестроить некоторые изображения, используя нативный компилятор, оставляя другие как транслированный код, и 2) достичь совместимости между этими старыми и новыми изображениями. Интерфейс между старым окружением и новым обычно состоит из «жакетных» последовательностей, которые получают вызов, используя старые соглашения и структуры данных, переформатируют параметры, исполняют нативный вызов, используя новые соглашения и структуры данных, переформатируют результат и возвращают его.

Clone this wiki locally