Промежуточное представительство
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии составления |
Известное время выполнения |
|
Известные компиляторы и наборы инструментов |
|
Промежуточное представление ( IR ) — это структура данных или код, используемый внутри компилятора или виртуальной машины для представления исходного кода . IR предназначен для дальнейшей обработки, такой как оптимизация и перевод . [ 1 ] «Хороший» IR должен быть точным – способным представлять исходный код без потери информации. [ 2 ] – и независимо от какого-либо конкретного исходного или целевого языка. [ 1 ] IR может принимать одну из нескольких форм: структуру данных в памяти или специальный кортежа или стека на основе код , читаемый программой. [ 3 ] В последнем случае его еще называют промежуточным языком .
Канонический пример можно найти в большинстве современных компиляторов. Например, интерпретатор CPython преобразует линейный удобочитаемый текст, представляющий программу, в промежуточную структуру графа , которая позволяет анализировать поток и переупорядочивать его перед выполнением. Использование такого промежуточного представления позволяет системы компиляторов, такие как GNU Compiler Collection и LLVM, использовать на многих различных исходных языках для генерации кода для множества различных целевых архитектур .
Средний язык
[ редактировать ]Промежуточный язык — это язык абстрактной машины, предназначенный для помощи в анализе компьютерных программ . Этот термин происходит от их использования в компиляторах , где исходный код программы переводится в форму, более подходящую для преобразований, улучшающих код, прежде чем использоваться для генерации объектного или машинного кода для целевой машины. Конструкция промежуточного языка обычно отличается от конструкции практического машинного языка тремя фундаментальными способами:
- Каждая инструкция представляет ровно одну фундаментальную операцию; «сдвиг-добавление», например, режимы адресации распространенные в микропроцессорах , отсутствуют.
- Информация о потоке управления не может быть включена в набор команд.
- Число доступных регистров процессора может быть большим и даже безграничным.
Популярным форматом промежуточных языков является трехадресный код .
Этот термин также используется для обозначения языков, используемых в качестве промежуточных звеньев в некоторых языках программирования высокого уровня , которые сами не выводят объектный или машинный код, а выводят только промежуточный язык. Этот промежуточный язык передается компилятору такого языка, который затем выводит готовый объектный или машинный код. Обычно это делается для облегчения процесса оптимизации или повышения переносимости за счет использования промежуточного языка, имеющего компиляторы для многих процессоров и операционных систем таких как C. , Языки, используемые для этого, по сложности делятся на языки высокого уровня и языки низкого уровня , такие как ассемблерные языки .
Языки
[ редактировать ]Хотя C явно не был задуман как промежуточный язык, природа C как абстракции ассемблера и его повсеместное распространение в качестве фактического системного языка в Unix-подобных и других операционных системах сделали его популярным промежуточным языком: Eiffel , Sather , Esterel , некоторые диалекты Lisp Cython ( Lush , Gambit , Squeak 's Smalltalk-subset Slang, Nim , Vala , Seed7 , SystemTap , ) , V и другие используют C в качестве промежуточного языка. Варианты C были разработаны для обеспечения функций C как переносимого языка ассемблера , включая C-- и промежуточный язык C.
Любой язык, предназначенный для виртуальной машины или машины с p-кодом, можно считать промежуточным языком:
- Байт-код Java
- от Microsoft Common Intermediate Language — это промежуточный язык, предназначенный для использования всеми компиляторами .NET Framework перед статической или динамической компиляцией в машинный код.
- В то время как большинство промежуточных языков предназначены для поддержки статически типизированных языков, промежуточное представление Parrot предназначено для поддержки динамически типизированных языков — первоначально Perl и Python.
- TIMI используется компиляторами на платформе IBM i .
- O-код для BCPL
- MATLAB Предварительно скомпилированный код
- Microsoft P-код
- Паскаль p-код
Коллекция компиляторов GNU (GCC) использует внутри себя несколько промежуточных языков для упрощения переносимости и кросс-компиляции . Среди этих языков есть
- исторический язык передачи регистров (RTL)
- язык дерева GENERIC
- SSA на базе GIMPLE . (Нижний уровень, чем GENERIC; ввод для большинства оптимизаторов; имеет компактное обозначение «байт-код».)
GCC поддерживает создание этих IR в качестве конечной цели:
- Промежуточный уровень HSA
- Промежуточное представление LLVM (преобразовано из GIMPLE в ныне несуществующий llvm-gcc, который использует оптимизаторы LLVM и генератор кода)
Структура компилятора LLVM основана на промежуточном языке LLVM IR , компактное двоичное сериализованное представление которого также называется «битовым кодом» и было разработано Apple. [ 4 ] [ 5 ] Как и байт-код GIMPLE, биткод LLVM полезен для оптимизации времени соединения. Как и GCC, LLVM также нацелен на некоторые IR, предназначенные для прямого распространения, включая Google PNaCl IR и SPIR . Дальнейшим развитием LLVM является использование многоуровневого промежуточного представления ( MLIR ) с возможностью генерирования кода для различных гетерогенных целей и объединения результатов разных компиляторов. [ 6 ]
Промежуточный язык ILOC [ 7 ] используется на занятиях по проектированию компиляторов как простой целевой язык. [ 8 ]
Другой
[ редактировать ]Инструменты статического анализа часто используют промежуточное представление. Например, Radare2 — это набор инструментов для анализа и обратного проектирования двоичных файлов. Он использует промежуточные языки ESIL. [ 9 ] и РЕЙЛ [ 10 ] для анализа бинарных файлов.
См. также
[ редактировать ]- СТИПЕНДИЯ
- Межъязыковой машинный перевод
- Основной язык
- Абстрактное синтаксическое дерево
- Байт-код (промежуточный код)
- Таблица символов
- Компилятор исходного кода
- Переписывание графов и переписывание терминов
- ЮНКОЛ
Ссылки
[ редактировать ]- ^ Jump up to: а б Уокер, Дэвид. «CS320: Компиляторы: промежуточное представление» (слайды лекции) . Проверено 12 февраля 2016 г.
- ^ Чоу, Фред (22 ноября 2013 г.). «Проблема межъязыковой совместимости» . Очередь АКМ . 11 (10) . Проверено 12 февраля 2016 г.
- ^ Тоал, Рэй. «Промежуточные представления» . Проверено 12 февраля 2016 г.
- ^ «Биткод (iOS, watchOS)» . Хакерские новости. 10 июня 2015 года . Проверено 17 июня 2015 г.
- ^ «Формат файла битового кода LLVM» . llvm.org . Проверено 17 июня 2015 г.
- ^ «МЛИР» .
- ^ "Симулятор ILOC". Архивировано 7 мая 2009 г. в Wayback Machine. У.А. Барретт, 2007 г., перефразируя Кейта Купера и Линду Торчон, «Разработка компилятора», Морган Кауфманн , 2004 г. ISBN 1-55860-698-X .
- ^ "Дизайн компилятора CISC 471" Ули Кремера
- ^ Участники Radare2. «ЕСИЛ» . Проект Радаре2. Архивировано из оригинала 18 августа 2015 года . Проверено 17 июня 2015 г.
- ^ Себастьян Порст (7 марта 2010 г.). «Язык REIL – Часть I» . zynamics.com . Проверено 17 июня 2015 г.
Внешние ссылки
[ редактировать ]- Стэнфордская группа SUIF