Википедия

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

Промежуточное представление (intermediate representation (IR)) — структура данных или код, используемый компилятором или виртуальной машиной для представления исходного кода. Промежуточное представление разработано, чтобы способствовать дальнейшей обработке, такой как оптимизация и трансформация кода. «Хорошее» промежуточное представление должно быть точным — способным представить исходный код без потери информации — и независимым от какого-либо конкретного источника кода или целевого языка. Промежуточное представление может принимать одну из нескольких форм: структура данных расположенная в памяти (in-memory), или специальный кортеж- или стек-подобный код читаемый программой. В последнем случае промежуточное представление также называется промежуточным языком (intermediate language).

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

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

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

  • Каждая инструкция представляет точно одну фундаментальную операцию; например, не представлена операция адресации памяти «shift-add» распространенная в микропроцессорах.
  • Информация о порядке выполнения, может быть, не включена в набор инструкций.

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

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

Языки

Хотя он явно не был спроектирован в качестве промежуточного языка, сущность языка C, как абстракции ассемблера и его вездесущность в качестве де-факто в Unix-подобных и других операционных системах сделали его популярным промежуточным языком: Eiffel, , , некоторые диалекты языка программирования Lisp (Lush, ), Haskell (Glasgow Haskell Compiler), Nim, Cython, Seed7, SystemTap, Vala, V и другие используют С в качестве промежуточного языка. Различные варианты языка C были спроектированы для того, чтобы предоставить доступ к функциональности С в качестве портируемого языка ассемблера, включая C-- и .

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

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

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

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

GCC поддерживает генерацию следующих промежуточных представлений, в качестве конечной цели:

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

Прочее

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

См. также

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

Примечания

  1. Walker, David. CS320: Compilers: Intermediate Representation (Lecture slides). Дата обращения: 12 февраля 2016. Архивировано 12 июля 2018 года.
  2. Chow, Fred (22 ноября 2013). The Challenge of Cross-language Interoperability. ACM Queue. 11 (10). Архивировано 17 мая 2019. Дата обращения: 12 февраля 2016.
  3. Toal, Ray. Intermediate Representations. Дата обращения: 12 февраля 2016. Архивировано 19 мая 2019 года.
  4. The radare2 contributors. ESIL. radare2 project. Дата обращения: 17 июня 2015. Архивировано из оригинала 18 августа 2015 года.
  5. Sebastian Porst. The REIL language – Part I. zynamics.com (7 марта 2010). Дата обращения: 17 июня 2015. Архивировано 17 июня 2015 года.

Ссылки

  • The Stanford SUIF Group


Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Промежуточное представление, Что такое Промежуточное представление? Что означает Промежуточное представление?

Promezhutochnoe predstavlenie intermediate representation IR struktura dannyh ili kod ispolzuemyj kompilyatorom ili virtualnoj mashinoj dlya predstavleniya ishodnogo koda Promezhutochnoe predstavlenie razrabotano chtoby sposobstvovat dalnejshej obrabotke takoj kak optimizaciya i transformaciya koda Horoshee promezhutochnoe predstavlenie dolzhno byt tochnym sposobnym predstavit ishodnyj kod bez poteri informacii i nezavisimym ot kakogo libo konkretnogo istochnika koda ili celevogo yazyka Promezhutochnoe predstavlenie mozhet prinimat odnu iz neskolkih form struktura dannyh raspolozhennaya v pamyati in memory ili specialnyj kortezh ili stek podobnyj kod chitaemyj programmoj V poslednem sluchae promezhutochnoe predstavlenie takzhe nazyvaetsya promezhutochnym yazykom intermediate language Kanonicheskij primer mozhet byt najden v bolshinstve sovremennyh kompilyatorov Naprimer interpretator CPython preobrazuet linejnyj udobochitaemyj chelovekom tekst predstavlyayushij programmu v promezhutochnuyu grafovuyu strukturu kotoraya pozvolyaet proanalizirovat potok dannyh i perestroit ego pered vypolneniem Ispolzovanie takogo promezhutochnogo predstavleniya pozvolyaet kompiliruyushim sistemam podobnym GNU Compiler Collection i LLVM byt ispolzovannymi mnozhestvom razlichnyh ishodnyh yazykov dlya generacii koda dlya mnozhestva razlichnyh celevyh arhitektur Promezhutochnyj yazykPromezhutochnyj yazyk eto yazyk abstraktnoj mashiny sproektirovannyj dlya pomoshi v analize kompyuternyh programm Termin proishodit ot ispolzovaniya yazyka v kompilyatorah gde ishodnyj kod programmy perevoditsya v formu bolee podhodyashuyu dlya uluchshayushih kod izmenenij prezhde chem byt ispolzovannym dlya sozdaniya obektnogo modulya ili mashinnogo koda dlya celevoj mashiny Dizajn promezhutochnogo yazyka obychno otlichaetsya ot mashinnogo koda tremya fundamentalnymi aspektami Kazhdaya instrukciya predstavlyaet tochno odnu fundamentalnuyu operaciyu naprimer ne predstavlena operaciya adresacii pamyati shift add rasprostranennaya v mikroprocessorah Informaciya o poryadke vypolneniya mozhet byt ne vklyuchena v nabor instrukcij Kolichestvo dostupnyh registrov processora mozhet byt bolshim dazhe bezgranichnym Populyarnym formatom promezhutochnyh yazykov yavlyaetsya Termin takzhe ispolzuetsya dlya oboznacheniya yazykov ispolzuemyh v kachestve promezhutochnyh nekotorymi vysokourovnevymi yazykami programmirovaniya kotorye ne sozdayut obektnyj modul ili mashinnyj kod a ispolzuyut tolko promezhutochnyj yazyk Kod sozdannyj na etom promezhutochnom yazyke zatem podaetsya kompilyatoru dannogo yazyka kotoryj sozdaet finalnyj obektnyj modul ili mashinnyj kod Obychno eto delaetsya dlya oblegcheniya processa optimizacii ili uvelicheniya portiruemosti blagodarya ispolzovaniyu promezhutochnogo yazyka dlya kotorogo est kompilyatory dlya mnozhestva centralnyh processorov i operacionnyh sistem takih kak C Yazyki ispolzuemye dlya etoj celi ranzhiruyutsya po slozhnosti mezhdu vysokourovnevymi yazykami programmirovaniya i nizkourovnevymi yazykami programmirovaniya takimi kak yazyki assemblera Yazyki Hotya on yavno ne byl sproektirovan v kachestve promezhutochnogo yazyka sushnost yazyka C kak abstrakcii assemblera i ego vezdesushnost v kachestve de fakto v Unix podobnyh i drugih operacionnyh sistemah sdelali ego populyarnym promezhutochnym yazykom Eiffel nekotorye dialekty yazyka programmirovaniya Lisp Lush Haskell Glasgow Haskell Compiler Nim Cython Seed7 SystemTap Vala V i drugie ispolzuyut S v kachestve promezhutochnogo yazyka Razlichnye varianty yazyka C byli sproektirovany dlya togo chtoby predostavit dostup k funkcionalnosti S v kachestve portiruemogo yazyka assemblera vklyuchaya C i Lyuboj yazyk prednaznachennyj dlya virtualnoj ili P kod mashiny mozhet byt rassmotren kak promezhutochnyj yazyk naprimer Bajt kod JavaMicrosoft Common Intermediate Language eto promezhutochnyj yazyk razrabotannyj dlya ispolzovaniya vsemi kompilyatorami prednaznachennymi dlya programmnoj platformy NET Framework pered staticheskoj ili dinamicheskoj kompilyaciej v mashinnyj kod V to vremya poka bolshinstvo promezhutochnyh yazykov sproektirovano dlya podderzhki statisticheski tipizirovannyh yazykov promezhutochnoe predstavlenie Parrot sproektirovano dlya podderzhki dinamicheski tipizirovannyh yazykov iznachalno Perl i Python Promezhutochnyj yazyk TIMI ispolzuetsya kompilyatorami na platforme IBM i O code dlya BCPLPredvaritelno skompilirovannyj kod MATLABMicrosoft P CodePascal p code Kollekciya kompilyatorov GNU GCC ispolzuet neskolko promezhutochnyh yazykov dlya uprosheniya portativnosti i kross kompilyacii Sredi etih yazykov Istoricheskij RTL GENERICOsnovannyj na SSA yazyk GIMPLE Bolee nizkogo urovnya nezheli GENERIC yavlyaetsya vhodyashim dlya bolshinstva optimizatorov obladaet kompaktnoj bajt kod notaciej GCC podderzhivaet generaciyu sleduyushih promezhutochnyh predstavlenij v kachestve konechnoj celi promezhutochnyj sloj HSALLVM promezhutochnoe predstavlenie skonvertirovannoe iz GIMPLE v nyne nesushestvuyushij llvm gcc kotoryj ispolzuet LLVM optimizatory i codegen ProcheeInstrumenty staticheskogo analiza chasto ispolzuyut promezhutochnoe predstavlenie Naprimer radare2 nabor instrumentov dlya analiza dvoichnyh fajlov i obratnogo inzhiniringa ispolzuet promezhutochnye yazyki ESIL i REIL dlya analiza dvoichnyh fajlov Sm takzheAbstraktnoe sintaksicheskoe derevo Bajt kod Promezhutochnyj kod Tablica simvolov Transpajler Perepisyvanie grafov i perepisyvanie UNCOLPrimechaniyaWalker David CS320 Compilers Intermediate Representation neopr Lecture slides Data obrasheniya 12 fevralya 2016 Arhivirovano 12 iyulya 2018 goda Chow Fred 22 noyabrya 2013 The Challenge of Cross language Interoperability ACM Queue 11 10 Arhivirovano 17 maya 2019 Data obrasheniya 12 fevralya 2016 Toal Ray Intermediate Representations neopr Data obrasheniya 12 fevralya 2016 Arhivirovano 19 maya 2019 goda The radare2 contributors ESIL neopr radare2 project Data obrasheniya 17 iyunya 2015 Arhivirovano iz originala 18 avgusta 2015 goda Sebastian Porst The REIL language Part I neopr zynamics com 7 marta 2010 Data obrasheniya 17 iyunya 2015 Arhivirovano 17 iyunya 2015 goda SsylkiThe Stanford SUIF Group

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто