Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

Промежуточный язык [ править ]

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

  • Каждая инструкция представляет собой ровно одну фундаментальную операцию; например, режимы адресации "сдвиг-сложение", общие для микропроцессоров , отсутствуют.
  • Информация о потоке управления может не входить в набор команд.
  • Количество доступных регистров процессора может быть большим и даже безграничным.

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

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

Языки [ править ]

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

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

  • Байт-код Java
  • Общий промежуточный язык Microsoft - это промежуточный язык, предназначенный для совместного использования всеми компиляторами .NET Framework перед статической или динамической компиляцией в машинный код.
  • В то время как большинство промежуточных языков предназначены для поддержки языков со статической типизацией, промежуточное представление Parrot предназначено для поддержки языков с динамической типизацией - первоначально Perl и Python.
  • TIMI - это язык высокого уровня, предназначенный для платформы IBM System i .
  • O-код для BCPL
  • Предварительно скомпилированный код MATLAB
  • Microsoft P-код

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

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

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

  • Промежуточный уровень HSA
  • Промежуточное представление LLVM (преобразовано из GIMPLE в ныне несуществующий llvm-gcc, который использует оптимизаторы LLVM и кодогенерацию)

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

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

Другое [ править ]

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

См. Также [ править ]

  • Межъязычный машинный перевод
  • Сводный язык
  • Абстрактное синтаксическое дерево
  • Байт-код (Промежуточный код)
  • Таблица символов
  • Компилятор исходных текстов
  • Переписывание графов и терминов
  • UNCOL

Ссылки [ править ]

  1. ^ a b Уокер, Дэвид. «CS320: Компиляторы: промежуточное представление» (слайды лекций) . Проверено 12 февраля +2016 .
  2. Чоу, Фред (22 ноября 2013 г.). «Проблема межъязыкового взаимодействия» . Очередь ACM . 11 (10) . Проверено 12 февраля +2016 .
  3. ^ Toal, Рэй. «Промежуточные представления» . Проверено 12 февраля +2016 .
  4. ^ «Битовый код (iOS, watchOS)» . Хакерские новости. 10 июня 2015 . Проверено 17 июня 2015 года .
  5. ^ "Формат файла битового кода LLVM" . llvm.org . Проверено 17 июня 2015 года .
  6. ^ https://mlir.llvm.org/
  7. ^ "ILOC Simulator" архивации 2009-05-07 в Wayback Machine по WA Barrett 2007, перефразируя Кит Купер и Линда Torczon, "Инженерная компилятор", Morgan Kaufmann , 2004. ISBN 1-55860-698-X .  
  8. ^ "Дизайн компилятора CISC 471" Ули Кремера
  9. ^ Авторы radare2. «ЭСИЛ» . проект radare2. Архивировано из оригинального 18 августа 2015 года . Проверено 17 июня 2015 года .
  10. Себастьян Порст (7 марта 2010 г.). «Язык REIL - Часть I» . zynamics.com . Проверено 17 июня 2015 года .

Внешние ссылки [ править ]

  • Стэнфордская группа СУИФ