Введение

Структура данных или код, используемый компилятором или виртуальной машиной для представления исходного кода.

Промежуточное представление (IR) – это структура данных или код, используемый компилятором или виртуальной машиной для представления исходного кода. IR разрабатывается таким образом, чтобы быть удобным для дальнейшей обработки, такой как оптимизация и трансляция. "Хорошее" IR должно быть точным – способным представлять исходный код без потери информации – и независимым от какого-либо конкретного исходного или целевого языка. В последнем случае оно также называется промежуточным языком. Канонический пример можно найти в большинстве современных компиляторов. Например, интерпретатор CPython преобразует линейный, читаемый человеком текст, представляющий программу, в промежуточную графовую структуру, которая позволяет проводить анализ потока управления и переупорядочивание перед выполнением. Использование промежуточного представления, подобного этому, позволяет компиляторным системам, таким как GNU Compiler Collection и LLVM, использоваться для множества исходных языков для генерации кода для множества различных целевых архитектур.

Промежуточный язык

Промежуточный язык — это язык абстрактной машины, предназначенный для облегчения анализа компьютерных программ. Этот термин возник из-за их использования в компиляторах, где исходный код программы преобразуется в форму, более подходящую для оптимизирующих преобразований, прежде чем генерировать объектный или машинный код для целевой платформы. Конструкция промежуточного языка обычно отличается от конструкции практического машинного языка тремя фундаментальными аспектами:

Каждая инструкция представляет ровно одну базовую операцию; например, режимы адресации типа "shift add", распространенные в микропроцессорах, отсутствуют. Информация о потоке управления может не включаться в набор инструкций. Количество доступных регистров процессора может быть большим, даже неограниченным. Популярным форматом для промежуточных языков является трехадресный код. Этот термин также используется для обозначения языков, применяемых в качестве промежуточных некоторыми языками программирования высокого уровня, которые сами не генерируют объектный или машинный код, а выводят только промежуточный язык. Этот промежуточный язык затем передается компилятору для данного языка, который и генерирует конечный объектный или машинный код. Обычно это делается для упрощения процесса оптимизации или повышения переносимости за счет использования промежуточного языка, для которого существуют компиляторы для множества процессоров и операционных систем, например, C. Языки, используемые в этом качестве, по сложности занимают промежуточное положение между языками высокого и низкого уровня, такими как языки ассемблера.

Другое

Инструменты статического анализа часто используют промежуточное представление. Например, Radare2 — это набор инструментов для анализа двоичных файлов и реверс-инжиниринга. Он использует промежуточные языки ESIL и REIL для анализа двоичных файлов.