Компилятор-компилятор - Википедия - Compiler-compiler

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

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

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

Варианты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Четвертый метакомпилятор

Многие защитники языка Четвертый назовите процесс создания новой реализации Forth мета-компиляцией и что он составляет метакомпилятор. Четвертое определение метакомпилятора:

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

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

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

Просто замените X на любой общий язык, C, C ++, Паскаль, КОБОЛ, Фортран, Ада, Модула-2 и т. д. И X будет метакомпилятором в соответствии с использованием Forth метакомпилятора. Метакомпилятор работает на уровне абстракции выше компилятора, который он компилирует. Он работает только на том же уровне (компилятор с собственным хостингом) при компиляции. Нужно увидеть проблему с этим определением метакомпилятора. Его можно применить практически к любому языку.

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

Программирование на Forth добавляет в язык новые слова. Изменить язык таким образом - это метапрограммирование. Forth - это метакомпилятор, потому что Forth - это язык, специально разработанный для метапрограммирования.[3] Программирование на Forth расширяет Forth, добавление слов в словарь Forth создает новый Forth диалект. Forth - это специализированный метакомпилятор для диалектов языка Forth.

История

Первый компилятор-компилятор, использующий это имя, был написан Тони Брукер в 1960 году и использовался для создания компиляторов для Атлас компьютер в Манчестерский университет, в том числе Атлас Автокод компилятор.[нужна цитата ]

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

В то же время Вал Шорре описал две «мета-машины». Один генеративный и один аналитический. Генеративная машина была реализована и произвела случайные алгебраические выражения. Meta I, первый метакомпилятор, был реализован Шорре на IBM 1401 в UCLA в январе 1963 года. Его оригинальные интерпретаторы и метамашины были написаны непосредственно на псевдомашинном языке. МЕТА II тем не менее, он был написан на метаязыке более высокого уровня, способном описывать собственную компиляцию на псевдомашинном языке.[11][12][13]

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

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

Немедленно последовало множество подобных систем.[нужна цитата ]

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

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

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

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

Роберт МакКлюр в Инструменты Техаса изобрел компилятор-компилятор под названием TMG (представлен в 1965 г.). TMG использовался для создания ранних компиляторов для языков программирования, таких как B, PL / I и АЛЬТРАН. Вместе с метакомпилятором Val Schorre это было раннее вдохновение для последней главы Дональд Кнут с Искусство программирования.[18]

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

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

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

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

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

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

Другие примеры генераторов парсеров в духе yacc: ANTLR, Коко / Р, ЧАШКА,[нужна цитата ] GNU Bison, Эли,[21] FSL,[нужна цитата ] SableCC, SID (устройство для улучшения синтаксиса),[22] и JavaCC. Хотя генераторы чистого синтаксического анализатора полезны, они решают только часть синтаксического анализа проблемы построения компилятора. Инструменты с более широким охватом, такие как PQCC, Коко / Р и Набор инструментов для реинжиниринга программного обеспечения DMS обеспечивают значительную поддержку для более сложных операций пост-синтаксического анализа, таких как семантический анализ, оптимизация и генерация кода.

Метаязыки Schorre

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

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

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

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

<имя> = <тело>;

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

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

 программа = $ декларация;

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

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

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

А (В / С)

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

А и (B или же C)

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

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

X (A / B / .EMPTY)

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

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

МЕТА I

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

МЕТА II

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

Продукция вывода произвела форму ассемблерного кода непосредственно из правила синтаксиса.

ДЕРЕВО-МЕТА

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

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

CWIC

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

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

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

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

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

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

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

  имя-функции (first-unparse_rule) => first-production_code_generator (second-unparse_rule) => second-production_code_generator (Third-unparse_rule) => третий-production_code_generator ...

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

  expr_gen (ADD [expr_gen (x), expr_gen (y)]) =>  releasereg (y); вернуть x; (SUB [expr_gen (x), expr_gen (y)]) =>  releasereg (y); вернуть x; (MUL [expr_gen (x), expr_gen (y)]) =>. . . (х) => r1 = getreg (); нагрузка (r1, x); return r1; ...

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

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

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

CWIC обратился предметно-ориентированные языки до срока предметно-ориентированный язык существовал

От авторов CWIC:

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

Примеры

Смотрите также

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

  1. ^ "Синтаксически управляемый компилятор для АЛГОЛА 60" Эдгар Т. Айронс, Сообщения ACM, том 4, выпуск 1, январь 1961 г.
  2. ^ а б Метакомпилятор: (Информатика) Компилятор, который используется в основном для создания компиляторов для других языков программирования.«Научно-технический словарь, Словарь научных и технических терминов МакГроу-Хилла, 6-е издание». Компании McGraw-Hill.
  3. ^ а б c d Википедия, бесплатная энциклопедия - Метапрограммирование
  4. ^ а б c d е ж грамм час Книга, Эрвин; Дьюи Вэл Шорре; Стивен Дж. Шерман (июнь 1970 г.). «Система CWIC / 36O, компилятор для написания и реализации компиляторов». Уведомления ACM SIGPLAN. 5 (6): 11–29. Дои:10.1145/954344.954345.
  5. ^ а б К. Стивен Карр, Дэвид А. Лютер, Шериан Эрдманн, Компилятор-компилятор TREE-META: мета-компилятор для Univac 1108 и General Electric 645, Технический отчет Университета Юты RADC-TR-69-83.
  6. ^ Питер Моссес, «SIS: система компилятор-генератор, использующая денотационную семантику», отчет 78-4-3, кафедра компьютерных наук, Орхусский университет, Дания, июнь 1978 г.
  7. ^ Соседи, Дж. М. Построение программного обеспечения с использованием компонентов. Технический отчет 160, Департамент информации и компьютерных наук, Калифорнийский университет, Ирвин, 1980.
  8. ^ Ховард Меткалф, "Параметризованный компилятор на основе механической лингвистики" Planning Research Corporation R-311, 1 марта 1963 г., также в Annual Review in Automatic Programming, Vol. 4
  9. ^ Роберт Ледли и Дж. Б. Уилсон, «Автоматическое программирование, языковой перевод с помощью синтаксического анализа», Коммуникации Ассоциации вычислительной техники, Vol. 5, № 3, с. 145–155, март 1962 г.
  10. ^ А. Э. Гленни, "Синтаксическая машина и построение универсального компьютера", Технический отчет № 2, AD 240–512, Вычислительный центр Технологического института Карнеги, 1960.
  11. ^ Шорре, Д. В., META II - синтаксически-ориентированный язык написания компиляторов, Proceedings of the 1964 19th ACM National Conference, pp. 41.301-41.3011, 1964
  12. ^ Дьюи, Вэл Шорре (1963). "Синтаксис - Направленный СМАЛГОЛ для 1401". Национальная конференция ACM, Денвер, Колорадо.
  13. ^ Мета I описана в статье, представленной на конференции ACM в Колорадо в 1963 году. См. СМАЛГОЛ.
  14. ^ Л. О. Шмидт, "Статус Bitt ACM SegPlan" Специальная группа по вопросам языков программирования ", Письмо Рабочей группы 1, 1964.
  15. ^ Роджер Рутман, «LOGIK. Компилятор, управляемый синтаксисом для компьютерного битового моделирования», магистерская диссертация, Калифорнийский университет в Лос-Анджелесе, август 1964 г.
  16. ^ Ф. В. Шнайдер и (Г. Д. Джонсон, «Написание компилятора, управляемого синтаксисом, компилятор для генерации эффективного кода», Труды 19-й Национальной конференции Ассоциации вычислительной техники, 1964 г.
  17. ^ Д. Оппенгейм и Д. Хаггерти, «META 5: инструмент для управления строками данных», Труды 21-й Национальной конференции Ассоциации вычислительной техники, 1966.
  18. ^ Кнут, Дональд (1990). П. Дерансарт; М. Журдан (ред.). «Происхождение грамматик атрибутов» (PDF). Труды Международной конференции по атрибутивным грамматикам и их приложениям (Париж, Франция). Конспект лекций по информатике. Нью-Йорк: Springer-Verlag. 461: 1–12. CiteSeerX  10.1.1.105.5365. Дои:10.1007/3-540-53101-7_1. ISBN  978-3-540-53101-2.
  19. ^ Чарльз Р. Киркли и Джонс Ф. Рулифсон, "Система LOT синтаксически управляемой компиляции", Внутренний отчет Стэнфордского исследовательского института ISR 187531-139, 1966.
  20. ^ Джордж Дж. Э. (1967a). Синтаксический анализатор, распознаватель, синтаксический анализатор и система семантической интерпретации, Стэнфордский центр линейных ускорителей, 15 ноября 1967 г.
  21. ^ Роберт В. Грей и другие., «Эли: полная гибкая система построения компилятора». Коммуникации ACM 35: 2: 121-130, 1992; смотрите также http://eli.colorado.edu/ В архиве 28 марта 2019 в Wayback Machine
  22. ^ Дж. М. Фостер "Программа для улучшения синтаксиса." Компьютерный журнал 11:1:31-34, 1968

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

внешняя ссылка