Промежуточное представление
Промежуточное представление(intermediate representation(IR)) — это структура данных или код использующийся компилятором или виртуальной машиной для представления исходного кода. Промежуточное представление разработано, чтобы способствовать дальнейшей обработке, такой как оптимизация и трансформация кода.[1] "Хорошее" промежуточное представление должно быть точным – способным представить исходный код без потери информации[2] – и независимым от какого-либо конкретного источника кода или целевого языка.[1] Промежуточное представление может принимать одну из нескольких форм: структура данных расположенная в памяти (in-memory), или специальный кортеж- или стек-подобный код читаемый программой.[3] В последнем случае промежуточное представление также называется промежуточным языком (intermediate language).
Канонический пример может быть найден в большинстве современных компиляторов. Например, интерпретатор CPython преобразует линейный удобочитаемый человеком текст, представляющий программу в промежуточную графовую структуру, которая позволяет проанализировать поток данных и перестроить его перед выполнением. Использование такого промежуточного представления позволяет компилирующим системам подобным GNU Compiler Collection и LLVM быть использованными множеством различных исходных языков для генерации кода для множества различных целевых архитектур.
Промежуточный языкПравить
Промежуточный язык — это язык абстрактной машины, спроектированный для помощи в анализе компьютерных программ. Термин происходит от использования языка в компиляторах, где исходный код программы переводится в форму, более подходящую для улучшающих код изменений, прежде чем быть использованным для создания объектного модуля или машинного кода для целевой машины. Дизайн промежуточного языка обычно отличается от машинного кода тремя фундаментальными аспектми:
- Каждая инструкция представляет точно одну фундаментальную операцию; например, не представлена операция адресации памяти "shift-add" распространенная в микропроцессорах.
- Информация о порядке выполнения, может быть не включена в набор инструкций.
- Количество доступных регистров процессора может быть большим, даже безграничным.
Популярным форматом промежуточных языков является трехадресный код.
Термин также используется для обозначения языков, используемых в качестве промежуточных некоторыми высокоуровневыми языками программирования, которые не создают объектный модуль или машинный код, а используют только промежуточный язык. Код, созданный на этом промежуточном языке, затем подается компилятору данного языка, который создает финальный объектный модуль или машинный код. Обычно это делается для облегчения процесса оптимизации или увеличения портируемости, благодаря использованию промежуточного языка, для которого есть компиляторы для множества центральных процессоров и операционных систем, таких как C. Языки, используемые для этой цели, ранжируются по сложности между высокоуровневыми языками программирования и низкоуровневыми языками программирования, такими как языки ассемблера.
ЯзыкиПравить
Хотя он явно не был спроектирован в качестве промежуточного языка, сущность языка C, как абстракции ассемблера и его вездесущность в качестве де-факто системного языка в Unix-подобных и других операционных системах сделали его популярным промежуточным языком: Eiffel, Sather, Esterel, некоторые диалекты языка программирования Lisp (Lush, Gambit), Haskell (Glasgow Haskell Compiler), Nim, Cython, Seed7, SystemTap, Vala, V и другие используют С в качестве промежуточного языка. Различные варианты языка C были спроектированы для того, чтобы предоставить доступ к функциональности С в качестве портируемого языка ассемблера, включая C-- и C Промежуточный язык.
Любой язык предназначенный для виртуальной или P-код машины может быть рассмотрен как промежуточный язык, например:
- Microsoft Common Intermediate Language — это промежуточный язык, разработанный для использования всеми компиляторами, предназначенными для программной платформы .NET Framework, перед статической или динамической компиляцией в машинный код.
- В то время пока большинство промежуточных языков спроектировано для поддержки статистически типизированных языков, промежуточное представление Parrot спроектировано для поддержки динамически типизированных языков — изначально Perl и Python.
- Промежуточный язык TIMI используется компиляторами на платформе IBM i.
- O-code для BCPL
- Предварительно скомпилированный код MATLAB
- Microsoft P-Code
- Pascal p-code
Коллекция компиляторов GNU (GCC) использует несколько промежуточных языков для упрощения портативности и кросс-компиляции. Среди этих языков:
- Исторический Register Transfer Language (RTL)
- GENERIC
- Основанный на SSA язык GIMPLE. (Более низкого уровня нежели GENERIC; является входящим для большинства оптимизаторов; обладает компактной "байт-код" нотацией.)
GCC поддерживает генерацию следующих промежуточных представлений, в качестве конечной цели:
- HSA Intermediate Layer - промежуточный слой HSA
- LLVM промежуточное представление (сконвертированное из GIMPLE в ныне несуществующий llvm-gcc который использует LLVM оптимизаторы и codegen)
ПрочееПравить
Инструменты статического анализа часто используют промежуточное представление. Например, radare2 — набор инструментов для анализа двоичных файлов и обратного инжиниринга, использует промежуточные языки ESIL[4] и REIL[5] для анализа двоичных файлов.
См. такжеПравить
- Байт-код (Промежуточный код)
ПримечанияПравить
- ↑ 1 2 Walker, David CS320: Compilers: Intermediate Representation (неопр.) (Lecture slides). Дата обращения: 12 февраля 2016.
- ↑ Chow, Fred (2013-11-22). “The Challenge of Cross-language Interoperability”. ACM Queue. 11 (10). Дата обращения 2016-02-12.
- ↑ Toal, Ray Intermediate Representations (неопр.). Дата обращения: 12 февраля 2016.
- ↑ The radare2 contributors. ESIL (неопр.). radare2 project. Дата обращения: 17 июня 2015. Архивировано 18 августа 2015 года.
- ↑ Sebastian Porst. The REIL language – Part I (неопр.). zynamics.com (7 марта 2010). Дата обращения: 17 июня 2015.