Jump to content

Компилятор-компилятор

В информатике компилятор -компилятор или генератор компилятора — это инструмент программирования, который создает синтаксический анализатор , интерпретатор или компилятор из некоторой формы формального описания языка программирования и машины.

Самый распространенный тип компилятора-компилятора называется генератором синтаксического анализатора . [1] Он обрабатывает только синтаксический анализ .

Формальное описание языка обычно представляет собой грамматику, используемую в качестве входных данных для генератора синтаксического анализатора. Он часто напоминает форму Бэкуса-Наура (BNF), расширенную форму Бэкуса-Наура (EBNF) или имеет собственный синтаксис. Файлы грамматики описывают синтаксис целевого языка программирования сгенерированного компилятора и действия, которые следует предпринять в отношении его конкретных конструкций.

Исходный код синтаксического анализатора языка программирования возвращается на выходе генератора синтаксического анализатора. Этот исходный код затем можно скомпилировать в анализатор, который может быть автономным или встроенным. Затем скомпилированный парсер принимает исходный код целевого языка программирования в качестве входных данных и выполняет действие или выводит абстрактное синтаксическое дерево (AST).

Генераторы парсеров не обрабатывают семантику AST или генерацию машинного кода для целевой машины. [2]

Метакомпилятор — это инструмент разработки программного обеспечения , используемый в основном при создании компиляторов , трансляторов и интерпретаторов для других языков программирования. [3] Входными данными метакомпилятора является компьютерная программа, написанная на специализированном программирования, метаязыке предназначенном в основном для создания компиляторов. [3] [4] Язык, созданный компилятором, называется объектным языком. Минимальный ввод, создающий компилятор, — это метапрограмма, определяющая грамматику объектного языка и семантические преобразования в объектную программу . [4] [5]

Варианты

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

Типичный генератор синтаксического анализатора связывает исполняемый код с каждым из правил грамматики, которые должны выполняться, когда эти правила применяются синтаксическим анализатором. Эти фрагменты кода иногда называют процедурами семантических действий, поскольку они определяют семантику синтаксической структуры, анализируемой синтаксическим анализатором. В зависимости от типа синтаксического анализатора, который должен быть сгенерирован, эти процедуры могут создавать дерево синтаксического анализа (или абстрактное синтаксическое дерево ) или напрямую генерировать исполняемый код.

Одной из самых ранних (1964 г.) и удивительно мощных версий компиляторов-компиляторов является META II , которая принимает аналитическую грамматику со средствами вывода , создающими стековой машинный код, и способна компилировать собственный исходный код и другие языки.

Среди первых программ исходных версий Unix , созданных в Bell Labs, была система, состоящая из двух частей lex и yacc , которая обычно использовалась для вывода кода языка программирования C , но имела гибкую систему вывода, которую можно было использовать для всего, от языков программирования. в преобразование текстового файла. Их современные GNU версии — flex и bison .

Некоторые экспериментальные компиляторы-компиляторы принимают на вход формальное описание семантики языка программирования, обычно с использованием денотационной семантики . Этот подход часто называют «компиляцией на основе семантики», и он был впервые предложен Питером Моссесом «Системой семантической реализации» (SIS) в 1978 году. [6] Однако и сгенерированный компилятор, и созданный им код были неэффективны во времени и пространстве. В настоящее время ни один промышленный компилятор не создается таким образом, но исследования продолжаются.

Проект «Компилятор-компилятор качества производства» ( PQCC ) в Университете Карнеги-Меллон не формализует семантику, но имеет полуформальную основу для описания машин.

Компиляторы-компиляторы существуют во многих вариантах, включая генераторы машин перезаписи снизу вверх (см. JBurg ), используемые для разбиения синтаксических деревьев в соответствии с грамматикой перезаписи для генерации кода, а также грамматики атрибутов генераторы анализаторов (например, ANTLR может использоваться для одновременной проверки типов, констант распространение и многое другое на этапе синтаксического анализа).

Метакомпиляторы

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

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

метакомпилятора Поскольку метаязык обычно представляет собой мощный язык обработки строк и символов, он часто имеет сильные применения для приложений общего назначения, включая создание широкого спектра других инструментов разработки программного обеспечения и анализа. [4] [7]

Помимо того, что метакомпилятор полезен для разработки предметно-ориентированных языков , он является ярким примером предметно-ориентированного языка, предназначенного для написания компиляторов.

Метакомпилятор — это метапрограмма , обычно написанная на собственном метаязыке или существующем языке компьютерного программирования. Процесс компиляции метакомпилятора, написанного на собственном метаязыке, эквивалентен саморазмещающемуся компилятору . Наиболее распространенные компиляторы, написанные сегодня, являются самостоятельными компиляторами. Самостоятельное размещение является мощным инструментом многих метакомпиляторов, позволяющим легко расширять их собственный метаязык метапрограммирования. Особенность, которая отличает метакомпилятор от других компиляторов-компиляторов, заключается в том, что он принимает на вход специализированный язык метапрограммирования , описывающий все аспекты работы компилятора. Метапрограмма, созданная метакомпилятором, является такой же полной программой, как и программа, написанная на C++ , BASIC или любом другом общем языке программирования . метапрограммирования Метаязык — мощный атрибут, позволяющий упростить разработку языков программирования и других компьютерных инструментов. Процессоры командной строки, преобразования и анализ текстовых строк легко кодируются с использованием метаязыков метапрограммирования метакомпиляторов.

Полнофункциональный пакет разработки включает в себя компоновщик и времени выполнения поддержки библиотеку . машинно-ориентированный язык системного программирования , например C Обычно для написания вспомогательной библиотеки необходим или C++. Библиотека, состоящая из вспомогательных функций, необходимых для процесса компиляции, обычно дополняет полный пакет метакомпилятора.

Значение метакомпилятора

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

В информатике префикс мета обычно используется для обозначения «о» (собственной категории) . Например, метаданные — это данные, описывающие другие данные. Язык, который используется для описания других языков, является метаязыком . Мета может также означать более высокий уровень абстракции . Метаязык работает на более высоком уровне абстракции для описания свойств языка. Форма Бэкуса-Наура (БНФ) представляет собой формальный метаязык, первоначально использовавшийся для определения АЛГОЛА 60 . BNF — слабый метаязык , поскольку он описывает только синтаксис и ничего не говорит о семантике или значении. Метапрограммирование — это написание компьютерных программ с возможностью обращения с программами как с данными. Метакомпилятор принимает на вход метапрограмму, написанную на специализированных метаязыках (абстракция более высокого уровня), специально разработанных для целей метапрограммирования. [4] [5] На выходе получается исполняемая объектная программа.

Можно провести аналогию: поскольку компилятор C++ принимает на вход программу на языке программирования C++ , метакомпилятор принимает на вход метаязыке метапрограммирования программу на .

Форт-метакомпилятор

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

Многие сторонники языка Форт называют процесс создания новой реализации Форта метакомпиляцией и что он представляет собой метакомпилятор. Определение метакомпилятора в Форте:

«Метакомпилятор — это компилятор, который обрабатывает свой собственный исходный код, в результате чего создается его исполняемая версия».

Такое использование термина «метакомпилятор» в Форте оспаривается в основной информатике. См. Форт (язык программирования) и История построения компилятора . Фактический процесс компиляции Форта представляет собой комбинацию Форта, являющегося автономным расширяемым языком программирования , и иногда кросс-компиляции , давно устоявшейся терминологии в информатике. Метакомпиляторы — это общая система написания компиляторов. Кроме того, концепция метакомпилятора Форта неотличима от самодостаточного и расширяемого языка. Фактический процесс действует на более низком уровне, определяя минимальное подмножество слов Forth , которое можно использовать для определения дополнительных слов Forth. Затем из базового набора можно определить полную реализацию Forth. Это похоже на процесс начальной загрузки. Проблема в том, что почти каждый компилятор языка общего назначения также соответствует описанию метакомпилятора Форта.

Когда (самостоятельный компилятор) X обрабатывает свой собственный исходный код, в результате чего создается его исполняемая версия, X является метакомпилятором.

Просто замените X любым распространенным языком: C, C++, Pascal , COBOL , Fortran , Ada , Modula-2 и т. д. И X будет метакомпилятором в соответствии с использованием метакомпилятора в Форте. Метакомпилятор работает на уровне абстракции над компилятором, который он компилирует. Он работает только на том же уровне (самостоятельный компилятор) при компиляции. Нужно увидеть проблему с этим определением метакомпилятора. Его можно применить практически к любому языку.

Однако, рассматривая концепцию программирования на Форте, добавление новых слов в словарь, расширение языка таким образом — это метапрограммирование. Именно это метапрограммирование в Форте делает его метакомпилятором.

Программирование на Форте — это добавление в язык новых слов. Изменение языка таким способом — это метапрограммирование . Форт — это метакомпилятор, потому что Форт — это язык, специально разработанный для метапрограммирования. Программирование на Форте расширяет словарь Форта, добавляя слова в словарь Форта и создавая новый диалект Форта . Форт — специализированный метакомпилятор для диалектов языка Форт.

Разработка оригинального компилятора Компилятор был начат Тони Брукером и Дерриком Моррисом в 1959 году, а первоначальное тестирование началось в марте 1962 года. [8] Компилятор Brooker Morris Compiler (BMCC) использовался для создания компиляторов для нового компьютера Atlas в Манчестерском университете , для нескольких языков: Mercury Autocode , Extended Mercury Autocode, Atlas Autocode , ALGOL 60 и ASA Fortran . Примерно в то же время подобную работу выполняли инопланетянин (Нед) Айронс в Принстоне и Алик Гленни из Научно-исследовательского центра по атомному оружию в Олдермастоне, чья статья «Синтаксическая машина» (рассекреченная в 1977 году) вдохновила на создание серии систем письма-переводчиков МЕТА. упомянуто ниже.

Ранняя история метакомпиляторов тесно связана с историей рабочей группы SIG/PLAN 1 по компиляторам, управляемым синтаксисом. Группа была основана в первую очередь усилиями Говарда Меткалфа в районе Лос-Анджелеса. [9] Осенью 1962 года Говард Меткалф разработал два интерпретатора, пишущих компиляторы. Один из них использовал технику анализа снизу вверх, основанную на методе, описанном Ледли и Уилсоном. [10] Другой использовал подход сверху вниз, основанный на работе Гленни, для генерации случайных английских предложений на основе контекстно-свободной грамматики. [11]

В то же время Вэл Шорре описал две «метамашины»: генеративную и аналитическую. Была реализована генеративная машина, которая выдавала случайные алгебраические выражения. Meta I, первый метакомпилятор, был реализован Шорром на IBM 1401 в Калифорнийском университете в Лос-Анджелесе в январе 1963 года. Его оригинальные интерпретаторы и метамашины были написаны непосредственно на псевдомашинном языке. META II , однако, была написана на метаязыке более высокого уровня, способном описывать собственную компиляцию на псевдомашинном языке. [12] [13] [14]

Ли Шмидт из Bolt, Beranek и Newman в марте 1963 года написал метакомпилятор, который использовал ЭЛТ-дисплей на PDP-1 с разделением времени. [15] Этот компилятор создавал реальный машинный код, а не интерпретирующий код, и был частично заимствован из Meta I. [ нужна ссылка ]

Шорре загрузил Meta II из Meta I весной 1963 года. Статья об усовершенствованной системе метакомпилятора, представленная на конференции ACM в Филадельфии в 1964 году, является первой статьей о метакомпиляторе, доступной в качестве общего справочника. Синтаксис и техника реализации системы Шорре заложили основу для большинства последующих систем. Система была реализована на небольшом процессоре 1401 и использовалась для реализации небольшого языка, подобного АЛГОЛу . [ нужна ссылка ]

Сразу же последовало множество подобных систем. [ нужна ссылка ]

Роджер Рутман из AC Delco разработал и внедрил LOGIK, язык для логического моделирования, на IBM 7090 в январе 1964 года. [16] Этот компилятор использовал алгоритм, который создавал эффективный код для логических выражений. [ нужна ссылка ]

Другая статья в материалах ACM 1964 года описывает Meta III , разработанную Шнайдером и Джонсоном в Калифорнийском университете в Лос-Анджелесе для IBM 7090. [17] Meta III представляет собой попытку создать эффективный машинный код для большого класса языков. Meta III была полностью реализована на языке ассемблера. Два компилятора были написаны на Meta III: CODOL, демонстрационный компилятор, пишущий компиляторы, и PUREGOL, диалект АЛГОЛА 60. (Называть его АЛГОЛом было чистой воды наглостью).

В конце 1964 года Ли Шмидт загрузил метакомпилятор EQGEN с PDP-1 на Beckman 420. EQGEN был языком генерации логических уравнений.

В 1964 году System Development Corporation начала крупные усилия по разработке метакомпиляторов. Эти усилия включают в себя мощные метакомпиляторы Bookl и Book2, написанные на Lisp , которые обладают обширными возможностями поиска по дереву и резервного копирования. Результатом одной из систем Q-32 в SDC является Meta 5. [18] Система Meta 5 включает в себя резервное копирование входного потока и множество других средств для анализа любого контекстно-зависимого языка. Эта система была успешно выпущена для широкого круга пользователей и имела множество приложений для работы со строками, помимо компиляции. Он имеет множество сложных стеков с выталкиванием вниз, средства настройки и тестирования атрибутов, а также механизмы вывода. Тот факт, что Meta 5 успешно преобразует программы JOVIAL в программы PL/I , демонстрирует ее мощь и гибкость.

Роберт МакКлюр из Texas Instruments изобрел компилятор-компилятор под названием TMG (представлен в 1965 году). TMG использовался для создания первых компиляторов для таких языков программирования, как B , PL/I и ALTRAN . Вместе с метакомпилятором Вэла Шорра он послужил ранним источником вдохновения для последней главы книги Дональда Кнута « Искусство компьютерного программирования» . [19]

Система LOT была разработана в 1966 году в Стэнфордском исследовательском институте и очень похожа на Meta II. [20] У него были новые конструкции специального назначения, позволяющие генерировать компилятор, который, в свою очередь, мог компилировать подмножество PL/I. Эта система имела обширные возможности сбора статистики и использовалась для изучения характеристик нисходящего анализа.

SIMPLE — это специализированная система-транслятор, предназначенная для помощи в написании препроцессоров для PL/I. SIMPLE, написанная на PL/I, состоит из трех компонентов: исполнительного механизма, синтаксического анализатора и семантического конструктора. [21]

Компилятор TREE-META был разработан в Стэнфордском исследовательском институте в Менло-Парке, Калифорния. Апрель 1968 г. Ранняя история метакомпилятора хорошо описана в руководстве TREE META. TREE META шла параллельно с некоторыми разработками SDC. В отличие от более ранних метакомпиляторов, он отделил обработку семантики от обработки синтаксиса. Правила синтаксиса содержали операции построения дерева , которые объединяли распознанные элементы языка с узлами дерева. Представление входных данных в виде древовидной структуры затем обрабатывалось с помощью простых правил разбора. Правила разбора использовали распознавание узлов и проверку атрибутов, которые при совпадении приводили к выполнению соответствующего действия. Кроме того, подобный элемент дерева также может быть проверен в правиле разбора. Правила разбора также были рекурсивным языком, способным вызывать правила разбора, передавая элементы дерева до того, как было выполнено действие правила разбора.

Концепция метамашины, первоначально выдвинутая Гленни, настолько проста, что было разработано три аппаратных варианта и одна фактически реализована. Последний в Вашингтонском университете в Сент-Луисе. Эта машина была построена из макромодульных компонентов и имеет в качестве инструкций коды, описанные Шорре.

CWIC (Компилятор для написания и реализации компиляторов) — последний известный метакомпилятор Шорре. Он был разработан в Systems Development Corporation Эрвином Буком, Дьюи Вэлом Шорром и Стивеном Дж. Шерманом. Благодаря полной мощности (lisp 2) алгоритмы оптимизации языка обработки списков могли работать со списками и деревьями, сгенерированными синтаксисом, перед генерацией кода. В CWIC также была встроена таблица символов.

С возрождением предметно-ориентированных языков и необходимостью в генераторах синтаксических анализаторов, которые просты в использовании, понятны и просты в обслуживании, метакомпиляторы становятся ценным инструментом для передовых проектов разработки программного обеспечения.

Другими примерами генераторов парсеров в духе yacc являются ANTLR , Coco/R , [22] ЧАШКА, [ нужна ссылка ] GNU Bison , т.е. [23] ФСЛ, [ нужна ссылка ] SableCC , SID (Устройство улучшения синтаксиса), [24] и JavaCC . Хотя чистые генераторы синтаксического анализа полезны, они решают только часть проблемы построения компилятора, связанную с анализом. Инструменты более широкого применения, такие как PQCC , Coco/R и DMS Software Reengineering Toolkit, обеспечивают значительную поддержку более сложных действий после анализа, таких как семантический анализ, оптимизация и генерация кода.

Метаязыки Шорре

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

Самые ранние метакомпиляторы Шорра, META I и META II, были разработаны Д. Вэлом Шорром из Калифорнийского университета в Лос-Анджелесе. За ним последовали и другие метакомпиляторы на основе Шорре. Каждый из них добавляет улучшения в анализ языка и/или генерацию кода.

В программировании принято использовать имя языка программирования для обозначения как компилятора, так и языка программирования, причем значение различается контекстом. Программа C++ компилируется с помощью компилятора C++. Это также относится и к следующему. Например, META II является одновременно компилятором и языком.

Метаязыки в линейке метакомпиляторов Шорре представляют собой функциональные языки программирования, которые используют синтаксические уравнения нисходящего анализа грамматики со встроенными конструкциями преобразования вывода.

Синтаксическое уравнение:

<name> = <body>;

— это скомпилированная тестовая функция, возвращающая успех или неудачу . <имя> — имя функции. <body> — это форма логического выражения, состоящая из тестов, которые могут быть сгруппированы, иметь альтернативы и выводить результаты. Тест похож на bool в других языках: успех — это правда а провал ложь , .

Определение языка программирования аналитически сверху вниз вполне естественно. Например, программу можно определить как:

 program = $declaration;

Определение программы как последовательности из нуля или более объявлений.

В языках Schorre META X есть правило движения. Приведенное выше правило программы является примером правила вождения. Программное правило — это тестовая функция, вызывающая объявление, тестовое правило, возвращающее успех или неудачу . Оператор цикла $ неоднократно вызывает объявление до тех пор, пока не будет возвращен отказ . Оператор $ всегда успешен, даже если имеется нулевое объявление. Вышеуказанная программа всегда будет возвращать успех. (В CWIC длинный сбой может обойти объявление. Длинный сбой является частью системы обратного отслеживания CWIC)

Наборы символов этих ранних компиляторов были ограничены. Символ / использовался для альтернативного оператора (или). «A или B» записывается как A / B. Для группировки используются круглые скобки ( ).

A (B / C)

Описывает конструкцию A, за которой следует B или C. В качестве логического выражения это будет выглядеть так:

A and (B or C)

Последовательность XY имеет подразумеваемое значение X и Y. ( ) — группировка и / или . оператор Порядок оценки всегда слева направо, поскольку последовательность входных символов определяется порядком тестов.

Специальные слова-операторы, первый символ которых — "." используются для ясности. .EMPTY используется в качестве последней альтернативы, когда предыдущая альтернатива не требуется.

X (A / B / .EMPTY)

Указывает, что за X опционально следует A или B. Это особенность этих метаязыков, являющихся языками программирования. Вышеупомянутое позволяет избежать обратного отслеживания. Другие системы конструкторов компиляторов могли объявлять три возможные последовательности и оставлять их на усмотрение синтаксического анализатора.

Характеристики метаязыков метапрограммирования, описанных выше, являются общими для всех метакомпиляторов Шорре и производных от них.

META I представлял собой метакомпилятор, скомпилированный вручную, который использовался для компиляции META II. О META I мало что известно, за исключением того, что первоначальная компиляция META II создала почти идентичный код коду компилятора META I, написанного вручную.

Каждое правило может состоять из тестов, операторов и выходных данных. Правило пытается сопоставить некоторую часть входного потока символов исходной программы, возвращая успех или неудачу. В случае успеха ввод продвигается по совпавшим символам. В случае неудачи ввод не продвигается.

Выходные продукты создавали форму ассемблерного кода непосредственно из синтаксического правила.

ДЕРЕВО-МЕТА

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

В TREE-META представлены операторы построения дерева : <node_name> , и [ <number> . ] правила перемещающие выходные производственные преобразования в неанализируемые Операторы построения дерева использовались в правилах грамматики, непосредственно преобразуя входные данные в абстрактное синтаксическое дерево . Правила разбора также являются проверочными функциями, соответствующими древовидным шаблонам. Правила разбора вызываются из правила грамматики, когда абстрактное синтаксическое дерево должно быть преобразовано в выходной код. Построение абстрактного синтаксического дерева и правил разбора позволило выполнять локальную оптимизацию путем анализа дерева разбора.

Перенос вывода продукции в правила unparse позволил четко разделить анализ грамматики и создание кода. Это облегчило чтение и понимание программы.

В 1968–1970 годах Эрвин Бук, Дьюи Вэл Шорре и Стивен Дж. Шерман разработали CWIC. [4] (Компилятор для написания и реализации компиляторов) в Корпорации развития систем Центре истории информационных технологий Института Чарльза Бэббиджа (Вставка 12, папка 21) ,

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

Синтаксический язык соответствует предыдущей линейке метакомпиляторов Дьюи Вэла Шорра. Он больше всего похож на TREE-META с операторами построения дерева в синтаксическом языке. Правила разбора TREE-META расширены для работы с объектно-ориентированным языком генератора на основе LISP 2 .

CWIC включает три языка:

  • Синтаксис : Преобразует входные данные исходной программы в структуры списков, используя формулу преобразования грамматики. Разобранная структура выражения передается генератору путем размещения вызова генератора в правиле. Дерево . представлено списком, первым элементом которого является объект узла В языке есть операторы < и > специально для создания списков. Оператор двоеточие : используется для создания узловых объектов. :ADD создает узел ADD. Восклицание ! Оператор объединяет несколько проанализированных записей с узлом для создания дерева . Деревья, созданные правилами синтаксиса, передаются функциям-генераторам, возвращающим успех или неудачу. Синтаксис языка очень близок к TREE-META. Оба используют двоеточие для создания узла. CWIC Восклицательный знак построения дерева !<номер> действует так же, как и восклицательный знак [<номер>] TREE-META.
  • Генератор : именованная серия правил преобразования, каждое из которых состоит из правила разбора и сопоставления с образцом. и выходные данные, написанные на языке, подобном LISP 2. перевод осуществлялся в двоичный машинный код IBM 360. Другие возможности обобщенного вывода языка генератора. [4]
  • MOL-360 : независимый язык реализации среднего уровня для семейства компьютеров IBM System/360, разработанный в 1968 году и используемый для написания базовой библиотеки поддержки.

Язык генераторов

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

Язык генераторов имел семантику, аналогичную Lisp . разбора Дерево рассматривалось как рекурсивный список. Общая форма функции языка генератора:

  function-name(first-unparse_rule) => first-production_code_generator
           (second-unparse_rule) => second-production_code_generator
           (third-unparse_rule) => third-production_code_generator
               ...

Код для обработки данного дерева включал в себя функции языка программирования общего назначения, а также форму: <stuff>, которая выдавала (stuff) в выходной файл. Вызов генератора может использоваться в unparse_rule. Генератору передается элемент шаблона unparse_rule, в котором он находится, и его возвращаемые значения перечислены в (). Например:

  expr_gen(ADD[expr_gen(x),expr_gen(y)]) =>
                                <AR + (x*16)+y;>
                                releasereg(y);
                                return x;
               (SUB[expr_gen(x),expr_gen(y)])=>
                                <SR + (x*16)+y;>
                                releasereg(y);
                                return x;
               (MUL[expr_gen(x),expr_gen(y)])=>
                              .
                              .
                              .
               (x)=>     r1 = getreg();
                            load(r1, x);
                            return r1;
...

синтаксического анализа То есть, если дерево выглядит следующим образом (ADD[<something1>,<something2>]), expr_gen(x) будет вызываться с <something1> и возвращать x. Переменная в правиле unparse — это локальная переменная, которую можно использовать в Production_code_generator. expr_gen(y) вызывается с <something2> и возвращает y. Вот вызов генератора в правиле unparse передает элемент в позиции, которую он занимает. Надеемся, что в приведенном выше примере x и y будут регистры по возвращению. Последнее преобразование предназначено для загрузки атома в регистр и возврата регистра. Первая продукция будет использоваться для генерации инструкции 360 «AR» (Добавить регистр) с соответствующими значениями в общих регистрах. Приведенный выше пример является лишь частью генератора. Каждое выражение генератора оценивает значение, которое затем может быть обработано. Последнее преобразование с таким же успехом можно было бы записать так:

               (x)=>     return load(getreg(), x);

В этом случае load возвращает свой первый параметр — регистр, возвращаемый функцией getreg(). функции load и getreg являются другими генераторами CWIC.

От авторов CWIC:

«Метакомпилятор помогает в задаче создания компилятора, автоматизируя его нетворческие аспекты, те аспекты, которые одинаковы независимо от языка, на который созданный компилятор должен переводить. Это делает возможным проектирование языков, соответствующих спецификации компилятора. конкретной проблемы, это снижает стоимость производства процессоров для таких языков до такой степени, что становится экономически целесообразным начать решение проблемы с проектирования языка». [4]

См. также

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

Ссылки и примечания

[ редактировать ]
  1. ^ Составители: принципы, методы и инструменты . Альфред В. Ахо, Моника С. Лам, Рави Сетхи, Джеффри Д. Уллман, Альфред В. Ахо (второе изд.). Бостон. 2007. с. 287. ИСБН  978-0-321-48681-3 . OCLC   70775643 . {{cite book}}: CS1 maint: отсутствует местоположение издателя ( ссылка ) CS1 maint: другие ( ссылка )
  2. ^ «Компилятор с синтаксическим управлением для ALGOL 60» Эдгар Т. Айронс, Сообщения ACM, том 4, выпуск 1, январь 1961.
  3. ^ Jump up to: а б Метакомпилятор: ( информатика ) Компилятор, который используется в основном для создания компиляторов для других языков программирования. «Научно-технический словарь Научно-технических терминов МакГроу-Хилла, 6-е издание» . Компании МакГроу-Хилл. Архивировано из оригинала 07 апреля 2018 г. Проверено 7 апреля 2018 г.
  4. ^ Jump up to: а б с д и ж г час Книга, Эрвин; Дьюи Вэл Шорр; Стивен Дж. Шерман (июнь 1970 г.). «Система CWIC/36O, компилятор для написания и реализации компиляторов». Уведомления ACM SIGPLAN . 5 (6): 11–29. дои : 10.1145/954344.954345 . S2CID   44675240 .
  5. ^ Jump up to: а б К. Стивен Карр, Дэвид А. Лютер, Шериан Эрдманн, Система компилятора-компилятора TREE-META: система метакомпилятора для Univac 1108 и General Electric 645 , Технический отчет Университета Юты RADC-TR-69-83.
  6. ^ Питер Моссес, «SIS: система компилятора-генератора, использующая денотационную семантику», отчет 78-4-3, факультет компьютерных наук, Орхусский университет, Дания, июнь 1978 г.
  7. ^ Соседи, JM Software Construction с использованием компонентов . Архивировано 18 марта 2018 г. в Wayback Machine . Технический отчет 160, Департамент информатики и компьютерных наук, Калифорнийский университет, Ирвин, 1980 г.
  8. ^ Лавингтон, Саймон (апрель 2016 г.). «Тони Брукер и компилятор Atlas Compiler» (PDF) . Архивировано (PDF) из оригинала 26 марта 2023 г. Проверено 29 сентября 2023 г.
  9. ^ Говард Меткалф, «Параметризованный компилятор, основанный на механической лингвистике», Planning Research Corporation R-311, 1 марта 1963 г., также в «Ежегодном обзоре автоматического программирования», Vol. 4
  10. ^ Роберт Ледли и Дж. Б. Уилсон, «Автоматическое программирование, языковой перевод посредством синтаксического анализа», Сообщения Ассоциации вычислительной техники, Vol. 5, № 3, стр. 145–155, март 1962 г.
  11. ^ А. Э. Гленни, «О синтаксической машине и конструкции универсального компьютера», Технический отчет номер 2, 240–512 нашей эры, Вычислительный центр Технологического института Карнеги, 1960.
  12. ^ Шорре, Д.В., META II, синтаксически-ориентированный язык написания компиляторов , Материалы 19-й национальной конференции ACM 1964 г., стр. 41.301-41.3011, 1964 г.
  13. ^ Дьюи, Вэл Шорре (1963). «Синтаксис – направлен СМАЛГОЛ для 1401 года». Национальная конференция ACM, Денвер, Колорадо .
  14. ^ Мета I описана в документе, представленном на конференции ACM в Колорадо в 1963 году. См. СМАЛГОЛ.
  15. ^ Л.О. Шмидт, «Информационное письмо Рабочей группы 1 рабочей группы 1 о статусе ACM SegPlan «Специальная группа по интересам», 1964.
  16. ^ Роджер Рутман, «LOGIK. Синтаксически управляемый компилятор для компьютерного побитового моделирования», магистерская диссертация, Калифорнийский университет в Лос-Анджелесе, август 1964 г.
  17. ^ Ф. В. Шнайдер и (Г. Д. Джонсон, «Написание компилятора, управляемого синтаксисом, компилятор для генерации эффективного кода», Труды 19-й Национальной конференции Ассоциации вычислительной техники, 1964 год
  18. ^ Д. Оппенгейм и Д. Хаггерти, «МЕТА 5: инструмент для манипулирования строками данных», материалы 21-й национальной конференции Ассоциации вычислительной техники, 1966.
  19. ^ Кнут, Дональд (1990). «Происхождение атрибутивных грамматик» (PDF) . У П. Дерансара; М. Журдан (ред.). Материалы Международной конференции по грамматикам атрибутов и их применениям (Париж, Франция) . Международная конференция по грамматикам атрибутов и их приложениям. Конспекты лекций по информатике. Том. 461. Нью-Йорк: Springer-Verlag. стр. 1–12. CiteSeerX   10.1.1.105.5365 . дои : 10.1007/3-540-53101-7_1 . ISBN  978-3-540-53101-2 . Архивировано (PDF) из оригинала 23 ноября 2020 г. Проверено 6 февраля 2020 г.
  20. ^ Чарльз Р. Киркли и Джонс Ф. Рулифсон, «Система синтаксически управляемой компиляции LOT», внутренний отчет Стэнфордского исследовательского института ISR 187531-139, 1966.
  21. ^ Джордж Дж. Э. (1967a). Синтаксический анализатор, распознаватель, синтаксический анализатор и система семантической интерпретации, Стэнфордский центр линейного ускорителя, 15 ноября 1967 г.
  22. ^ Jump up to: а б Рехберг, Питер [на немецком языке] ; Мессенбёк, Ханспетер [на немецком языке] (1985). Компилятор-генератор для микрокомпьютеров - основы, приложения, программирование в Модуле-2 (на немецком языке) (1-е изд.). Мюнхен, Германия: Карл Хансер Верлаг . ISBN  3-446-14495-1 . (NB. В книге описана конструкция Коко в Модуле-2 .)
  23. ^ Грей, Роберт В.; Леви, Стивен П.; Хеуринг, Винсент П.; Слоан, Энтони М.; Уэйт, Уильям М. (1992). «Элай: Полная, гибкая система построения компилятора» . Коммуникации АКМ . 35 (2): 121–130. дои : 10.1145/129630.129637 . S2CID   5121773 .
  24. ^ Фостер, Дж. М. (1968). «Программа улучшения синтаксиса» . Компьютерный журнал . 11 : 31–34. дои : 10.1093/comjnl/11.1.31 .

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2b30148105d36eaea178f0a72d601218__1719948360
URL1:https://arc.ask3.ru/arc/aa/2b/18/2b30148105d36eaea178f0a72d601218.html
Заголовок, (Title) документа по адресу, URL1:
Compiler-compiler - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)