Промежуточное представление (IR) - это структура данных или код, используемый внутри компилятора или виртуальной машины для представления исходного кода. IR предназначен для дальнейшей обработки, такой как оптимизация и перевод. "Хороший" IR должен быть точным - способным предоставление исходного кода без потери информации - и независимо от какого-либо конкретного исходного или целевого языка. IR может иметь одну из нескольких форм: структура данных в памяти или специальный кортеж - или код на основе стека читается программой. В последнем случае его еще называют промежуточным языком.
Канонический пример можно найти в большинстве современных компиляторов, где линейный читаемый человеком текст, представляющий программу, преобразуется в промежуточную структуру графа, которая позволяет анализ потока и переупорядочивание перед созданием последовательности фактических инструкций ЦП. Использование промежуточного представления, такого как это, позволяет системам компиляторов, таким как GNU Compiler Collection и LLVM, использоваться многими различными исходными языками для генерации кода для многих различных целевая архитектуры.
промежуточный язык - это язык абстрактной машины, предназначенный для помощи в анализе компьютерных программ. Этот термин происходит от их использования в компиляторах, где исходный код программы транслируется в форму, более подходящую для преобразований, улучшающих код, перед использованием для генерации объекта или машинный код для целевой машины. Дизайн промежуточного языка обычно отличается от практического машинного языка по трем фундаментальным причинам:
Популярным форматом для промежуточных языков является трехадресный код.
. Этот термин также используется для обозначения языков, используемых как является промежуточным звеном некоторых языков программирования высокого уровня, которые не выводят сам объект или машинный код, а выводят только промежуточный язык. Этот промежуточный язык передается компилятору для такого языка, который затем выводит готовый объект или машинный код. Обычно это делается для облегчения процесса оптимизации или для увеличения переносимости с помощью промежуточного языка, который имеет компиляторы для многих процессоров и операционных систем, например, C. Языки, используемые для этого падения сложности между языками высокого уровня и языками низкого уровня, такими как языки ассемблера.
Хотя явно не разработаны как промежуточный язык, Природа C как абстракции сборки и его повсеместное распространение как фактический системный язык в Unix-подобных и других операционных системах сделал его популярным промежуточным языком: Eiffel, Sather, Esterel, некоторые диалекты из Lisp (, Gambit ), Haskell (Glasgow Haskell Compiler ), Smalltalk-subset Slang от Squeak, Cython, Seed7, SystemTap, Vala и другие используют C в качестве промежуточного языка. Варианты C были разработаны для обеспечения функций C как переносимого языка ассемблера, включая C-- и промежуточный язык C.
Любой язык, ориентированный на виртуальная машина или машина с p-кодом может считаться промежуточным языком:
В GNU Compiler Collection (GCC) внутренне используются несколько промежуточных языков для упрощения порта умение и кросс-компиляция. Среди этих языков
GCC поддерживает генерацию этих IR в качестве конечной цели:
Структура компилятора LLVM основана на промежуточном языке LLVM IR, из которого компактное двоичное сериализованное представление, также называемое «битовым кодом», было разработано Apple. Как и байт-код GIMPLE, битовый код LLVM полезен при оптимизации времени компоновки. Как и GCC, LLVM также нацелен на некоторые IR, предназначенные для прямого распространения, в том числе PNaCl IR от Google и SPIR.
. Промежуточный язык ILOC используется в классах по разработке компиляторов в качестве простого целевого языка.
Инструменты статического анализа часто используют промежуточное представление. Например, radare2 - это набор инструментов для анализа двоичных файлов и обратного проектирования. Он использует промежуточные языки ESIL и REIL для анализа двоичных файлов.