В программной инженерии ретаргетинг является атрибутом инструментов разработки программного обеспечения, которые были специально разработаны для генерации кода для более чем одной вычислительной платформы.
Перенацеливаемый компилятор — это компилятор , который был разработан так, чтобы его было относительно легко модифицировать для генерации кода для различных архитектур набора инструкций ЦП . История этой идеи восходит к 1950-м годам, когда UNCOL был предложен в качестве универсального промежуточного языка. Pascal P-compiler является примером раннего широко используемого перенацеливаемого компилятора.
Стоимость создания перенастраиваемого компилятора, который генерирует код такого же качества, как и неперенастраиваемый компилятор (т. е. тот, который разработан для создания кода только для одного процессора), выше, поскольку невозможно использовать детали, специфичные для процессора, на всех этапах компиляции. Преимущества перенастраиваемого компилятора в том, что общая стоимость для нескольких процессоров намного ниже совокупной стоимости многих отдельных неперенастраиваемых компиляторов.
Некоторые перенацеливаемые компиляторы, например, GCC , стали настолько широко портированными и развитыми, что теперь включают поддержку многих оптимизаций и машинно-специфичных деталей, из-за чего качество кода часто превосходит качество кода неперенацеливаемых компиляторов на многих процессорах.
Глобальный оптимизатор общего назначения, за которым следует машинно-специфическая peephole-оптимизация, является широко используемой техникой реализации. [1] Оптимизация кода для некоторых высокопроизводительных процессоров требует детального и конкретного знания архитектуры и того, как выполняются инструкции. Если разработчики не потратят много времени, необходимого для написания генератора кода специально для архитектуры, оптимизации, выполняемые перенацеливаемым компилятором, будут применимы только к общим характеристикам процессора.
Перенацеливаемый компилятор — это разновидность кросс-компилятора . Часто (но не всегда) перенацеливаемый компилятор является переносимым (сам компилятор может работать на нескольких разных процессорах) и самохостинговым .
Примеры перенастраиваемых компиляторов:
retdec («Retargetable Decompiler») — это перенацеливаемый декомпилятор машинного кода с открытым исходным кодом, основанный на LLVM . [ необходима ссылка ]
Напротив, перенацеливаемые ассемблеры способны генерировать объектные файлы разных форматов, что полезно при портировании программ на языке ассемблера на различные операционные системы , работающие на той же архитектуре ЦП (например, Windows и Linux на платформе x86 ). NASM — один из таких ассемблеров.