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

редактировать

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

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

Содержание

  • 1 Промежуточный язык
    • 1.1 Языки
  • 2 Другое
  • 3 См. также
  • 4 Ссылки
  • 5 Внешние ссылки

Промежуточный язык

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

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

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

языки

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

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

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

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

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

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

Структура компилятора LLVM основана на промежуточном языке LLVM IR, из которого компактное двоичное сериализованное представление, также называемое «битовым кодом», было разработано Apple. Как и байт-код GIMPLE, битовый код LLVM полезен при оптимизации времени компоновки. Как и GCC, LLVM также нацелен на некоторые IR, предназначенные для прямого распространения, в том числе PNaCl IR от Google и SPIR.

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

Другое

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

См. Также

Ссылки

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

Последняя правка сделана 2021-05-24 04:17:41
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте