Промежуточное представительство - Intermediate representation

Промежуточное представление ( ИК ) представляет собой структуру данных , или код , используемый внутренне в компилятор или виртуальную машину для представления исходного кода . IR предназначен для дальнейшей обработки, такой как оптимизация и перевод . «Хороший» IR должен быть точным - способным представлять исходный код без потери информации - и не зависеть от какого-либо конкретного исходного или целевого языка. IR может принимать одну из нескольких форм: структура данных в памяти , специальный кортеж или код на основе стека, читаемый программой. В последнем случае его еще называют промежуточным языком .

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

Средний язык

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

Популярным форматом для промежуточных языков является трехадресный код .

Этот термин также используется для обозначения языков, используемых в качестве промежуточных в некоторых языках программирования высокого уровня, которые сами не выводят объектный или машинный код, а выводят только промежуточный язык. Этот промежуточный язык передается компилятору для такого языка, который затем выводит готовый объект или машинный код. Это обычно делается , чтобы облегчить процесс оптимизации или увеличить портативность с использованием промежуточного языка , который имеет компилятор для многих процессоров и операционных систем , таких как C . Языки, используемые для этого, упали по сложности между языками высокого уровня и языками низкого уровня , такими как языки ассемблера .

Языки

Хотя он и не был явно разработан как промежуточный язык, природа C как абстракции ассемблера и его повсеместное распространение в качестве системного языка де-факто в Unix-подобных и других операционных системах сделали его популярным промежуточным языком: Eiffel , Sather , Esterel , некоторые диалекты из лисповского ( Lush , Gambit ), Haskell ( Glasgow Haskell Compiler ), Скрипеть «ы Smalltalk-подмножество сленга, Cython , Seed7 , SystemTap , Валы , V, и других используют C в качестве промежуточного языка. Варианты C были разработаны для обеспечения функции C в качестве портативного ассемблере , включая C-- и C Intermediate Language .

Любой язык, ориентированный на виртуальную машину или машину с p-кодом, может считаться промежуточным языком:

GNU Compiler Collection (GCC) использует несколько промежуточных языков внутри для упрощения переносимости и кросс-компиляции . Среди этих языков есть

  • исторический язык перевода регистра (RTL)
  • язык дерева GENERIC
  • GIMPLE на базе SSA . (Более низкий уровень, чем GENERIC; ввод для большинства оптимизаторов; имеет компактную нотацию «байт-код».)

GCC поддерживает создание этих IR в качестве конечной цели:

Структура компилятора LLVM основана на промежуточном языке LLVM IR , компактное двоичное сериализованное представление которого также называется «битовый код» и было разработано Apple. Как и байт-код GIMPLE, битовый код LLVM полезен при оптимизации времени компоновки. Как и GCC, LLVM также нацелен на некоторых НП, предназначенных для прямого распространения, включая PNaCl IR и SPIR от Google . Дальнейшим развитием LLVM является использование многоуровневого промежуточного представления (MLIR) с возможностью генерировать код для различных разнородных целей и объединять выходные данные разных компиляторов.

Промежуточный язык ILOC используется в классах по проектированию компиляторов как простой целевой язык.

Другой

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

Смотрите также

использованная литература

внешние ссылки