Промежуточное представительство - Intermediate representation
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии компиляции |
Заметное время выполнения |
|
Известные компиляторы и инструментальные средства |
An промежуточное представление (ИК) это структура данных или код, используемый внутри компилятор или же виртуальная машина представлять исходный код. IR предназначен для дальнейшей обработки, например оптимизация и перевод.[1] "Хороший" IR должен быть точный - способен отображать исходный код без потери информации[2] - и независимый любого конкретного исходного или целевого языка.[1] IR может принимать одну из нескольких форм: в памяти структура данных, или специальный кортеж - или же куча -основан код читается программой.[3] В последнем случае его еще называют промежуточный язык.
Канонический пример можно найти в большинстве современных компиляторов.[который? ], где линейный понятный для человека текст, представляющий программу, преобразуется в промежуточный структура графа это позволяет анализ потока и переупорядочивание перед созданием последовательности фактических инструкций ЦП. Использование промежуточного представления, такого как это, позволяет компиляторам, таким как Коллекция компиляторов GNU и LLVM для использования в различных исходных языках для генерировать код для многих разных целей архитектуры.
Средний язык
An промежуточный язык это язык абстрактная машина предназначен для помощи в анализе компьютерные программы. Термин происходит от их использования в компиляторы, где исходный код программы переводится в форму, более подходящую для преобразований, улучшающих код, перед использованием для генерации объект или же машина код целевой машины. Дизайн промежуточного языка обычно отличается от дизайна практического машинный язык тремя основными способами:
- Каждая инструкция представляет собой ровно одну фундаментальную операцию; например "сдвиг-добавить" режимы адресации общий в микропроцессоры нет.
- Поток управления информация не может быть включена в набор команд.
- Количество регистры процессора доступный может быть большим, даже безграничным.
Популярным форматом для промежуточных языков является трехадресный код.
Этот термин также используется для обозначения языков, используемых в качестве промежуточных языки программирования высокого уровня которые не выводят сам объект или машинный код, а выводят только промежуточный язык. Этот промежуточный язык передается компилятору для такого языка, который затем выводит готовый объект или машинный код. Обычно это делается для облегчения процесса оптимизация или увеличить переносимость используя промежуточный язык, в котором есть компиляторы для многих процессоры и операционные системы, Такие как C. Языки, используемые для этого падения сложности между языками высокого уровня и низкий уровень языки, такие как языки ассемблера.
Языки
Хотя он явно не разработан как промежуточный язык, C природа как абстракция сборка и его повсеместность как де-факто системный язык в Unix-подобный и другие операционные системы сделали его популярным промежуточным языком: Эйфель, Sather, Эстерель, немного диалекты из Лисп (Пышный, Гамбит ), Haskell (Компилятор Glasgow Haskell ), Писк сленг подмножества Smalltalk, Cython, Семя7, SystemTap, Вала, и другие используют C как промежуточный язык. Варианты C были разработаны для обеспечения функций C как портативного язык ассемблера, включая C-- и C Промежуточный язык.
Любой язык, ориентированный на виртуальная машина или же машина p-кода можно считать промежуточным языком:
- Байт-код Java
- Microsoft Общий промежуточный язык это промежуточный язык, предназначенный для использования всеми компиляторами для .NET Framework перед статической или динамической компиляцией в машинный код.
- Хотя большинство промежуточных языков предназначены для поддержки языков со статической типизацией, Промежуточное представление попугая разработан для поддержки языков с динамической типизацией - изначально Perl и Python.
- ТИМИ это язык высокого уровня, ориентированный на IBM System i Платформа.
- О-код за BCPL
- MATLAB предварительно скомпилированный код
- Microsoft 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 также нацелен на некоторых НП, предназначенных для прямого распространения, включая Google PNaCl ИК и SPIR.
Промежуточный язык ILOC[6] используется в классах по проектированию компиляторов как простой целевой язык.[7]
Другой
Статический анализ инструменты часто используют промежуточное представление. Например, радар2 представляет собой набор инструментов для анализа двоичных файлов и обратного проектирования. Использует промежуточные языки ESIL[8] et REIL[9] для анализа бинарных файлов.
Смотрите также
- Межъязычный машинный перевод
- Язык сводной таблицы
- Абстрактное синтаксическое дерево
- Байт-код (Промежуточный код)
- Таблица символов
- Компилятор исходного кода
- Переписывание графа и переписывание терминов
- UNCOL
Рекомендации
- ^ а б Уокер, Дэвид. «CS320: Компиляторы: промежуточное представление» (Слайды лекции). Получено 12 февраля 2016.
- ^ Чоу, Фред (22 ноября 2013 г.). «Проблема межъязыкового взаимодействия». Очередь ACM. 11 (10). Получено 12 февраля 2016.
- ^ Тоул, Рэй. «Промежуточные представления». Получено 12 февраля 2016.
- ^ «Битовый код (iOS, watchOS)». Хакерские новости. 10 июня 2015 г.. Получено 17 июн 2015.
- ^ "Формат файла битового кода LLVM". llvm.org. Получено 17 июн 2015.
- ^ "Симулятор ILOC" В архиве 2009-05-07 на Wayback Machine У. А. Барретт 2007, перефразируя Кита Купера и Линду Торцон, «Разработка компилятора», Морган Кауфманн, 2004. ISBN 1-55860-698-X.
- ^ "Дизайн компилятора CISC 471" Ули Кремер
- ^ Авторы radare2. "ESIL". проект radare2. Архивировано из оригинал 18 августа 2015 г.. Получено 17 июн 2015.
- ^ Себастьян Порст (7 марта 2010 г.). "Язык REIL - Часть I". zynamics.com. Получено 17 июн 2015.