Язык описания компилятора

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

Язык описания компилятора (CDL), - это язык программирования, основанный на аффиксных грамматиках. Это очень похоже на обозначение формы Бэкуса – Наура (BNF). Он был разработан для разработки компиляторов. Он очень ограничен в своих возможностях и потоке управления; и намеренно так. Эти ограничения имеют двоякую пользу. С одной стороны, они делают возможным сложный анализ данных и потока управления, используемый оптимизаторами CDL2, что приводит к чрезвычайно эффективному коду. Другое преимущество состоит в том, что они способствуют очень многословному соглашению об именах. Это, в свою очередь, приводит к программам, которые в значительной степени самодокументируются.

. Язык немного похож на Prolog (это не удивительно, поскольку оба языка возникли примерно в одно и то же время из работать над грамматиками аффиксов ). Однако, в отличие от Prolog, поток управления в CDL детерминированно основан на успехе / неудаче, то есть никакие другие альтернативы не пробуются, когда текущий успешен. Эта идея также используется в синтаксическом анализе грамматик выражений..

CDL3 - это третья версия языка CDL, значительно отличающаяся от двух предыдущих версий.

Содержание
  • 1 Дизайн
  • 2 Использование
  • 3 Ссылки
  • 4 Дополнительная литература
Дизайн

Исходная версия, разработанная Корнелисом Х.А. Костером в университете Неймегена, возникшем в 1971 году, имел довольно необычную концепцию: у него не было ядра. Типичный исходный текст на языке программирования транслируется в машинные инструкции или стандартные последовательности этих инструкций. Они представляют собой ядро, самые основные абстракции, которые поддерживает данный язык. Такими примитивами могут быть сложение чисел, копирование переменных друг в друга и так далее. В CDL1 такое ядро ​​отсутствует, программист несет ответственность за обеспечение примитивных операций в форме, которая затем может быть преобразована в машинные инструкции с помощью ассемблера или компилятора для традиционного языка. В самом языке CDL1 нет концепции примитивов, нет концепции типов данных, кроме машинного слова (абстрактная единица хранения - не обязательно реального машинного слова как такового). Правила оценки очень похожи на описание синтаксиса формы Бэкуса – Наура ; Фактически, написать синтаксический анализатор для языка, описанного в BNF, в CDL1 довольно просто.

По сути, язык состоит из правил. Правило может быть успешным или неудачным. Правило состоит из альтернатив, которые представляют собой последовательности вызовов других правил. Правило считается успешным, если успешна любая из его альтернатив; они пробуются последовательно. Альтернатива считается успешной, если все ее вызовы правил выполнены успешно. Язык предоставляет операторы для создания циклов оценки. без рекурсии (хотя это не является строго обязательным в CDL2, поскольку оптимизатор достигает того же эффекта) и некоторых сокращений для повышения эффективности рекурсивного вычисления, но основная концепция такая же, как указано выше. Помимо очевидного применения в контекстно-независимом синтаксическом анализе грамматики, CDL также хорошо подходит для управления приложениями, поскольку многие управляющие приложения по сути являются глубоко вложенными правилами «если-то».

Каждое правило CDL1 при оценке может воздействовать на данные неопределенного типа. В идеале данные не следует изменять, если правило не сработает (без побочных эффектов при сбое). Это вызывает проблемы, поскольку, хотя это правило может быть успешным, правило, вызывающее его, может все же не работать, и в этом случае изменение данных не должно вступить в силу. Довольно легко (хотя и требует много памяти) обеспечить описанное выше поведение, если все данные динамически размещаются в стеке, но это довольно сложно, когда есть статические данные, что часто бывает. Компилятор CDL2 может помечать возможные нарушения благодаря требованию, чтобы направление параметров (ввод, вывод, ввод-вывод) и тип правил (может завершиться ошибкой: test, predicate ; не может завершиться ошибкой: функция, действие ; может иметь побочный эффект: предикат, действие ; не может иметь побочного эффекта: test, function ) должен указывать программист.

Поскольку оценка правила основана на вызове более простых и простых правил, внизу должны быть некоторые примитивные правила, которые выполняют реальную работу. Вот где очень удивительно CDL1: у него нет этих примитивов. Вы должны сами установить эти правила. Если вам нужно добавить в вашу программу, вы должны создать правило, которое имеет два входных параметра и один выходной параметр, а выход устанавливается как сумма двух входных параметров вашим кодом. Компилятор CDL использует ваш код как строки (существуют соглашения о том, как обращаться к входным и выходным переменным) и просто генерирует его по мере необходимости. Если вы описываете свое правило добавления с помощью сборки, то вам понадобится ассемблер для преобразования вывода компилятора CDL в машинный код. Если вы описываете все примитивные правила (макросы в терминологии CDL) на Паскале или C, то вам понадобится компилятор Pascal или C для запуска после компилятора CDL. Отсутствие основных примитивов может быть очень болезненным, когда вам нужно написать фрагмент кода даже для простейшей машинной операции, но, с другой стороны, он дает вам большую гибкость в реализации эзотерических абстрактных примитивов, действующих на экзотические абстрактные объекты («машинное слово» в CDL больше похоже на «единицу хранения данных», без ссылки на тип данных, которые там хранятся). Кроме того, в крупных проектах использовались тщательно разработанные библиотеки примитивов. Затем они были воспроизведены для каждой целевой архитектуры и ОС, что позволило создать высокоэффективный код для всех.

Чтобы почувствовать язык, вот небольшой фрагмент кода, адаптированный из руководства CDL2:

ACTION quicksort +>from +>to -p -q: less + from + to, split + от + до + p + q, быстрая сортировка + от + q, быстрая сортировка + p + до; +. ACTION split +>i +>j + p>+ q>-m: make + p + i, make + q + j, add + i + j + m, половина + m, (снова: двигаться вверх + j + p + m, двигаться вниз + i + q + m, (less + p + q, поменять местами элемент + p + q, incr + p, decr + q, * снова; less + p + m, поменять местами элемент + p + m, incr + p; less + m + q, поменять местами элемент + q + m, decr + q; +)). ФУНКЦИЯ перемещение вверх +>j +>p>+>m: less + j + p; элемент меньшего размера + m + p; incr + p, *. ФУНКЦИЯ перемещение вниз +>i +>q>+>m: less + q + j; элемент меньшего размера + q + m; decr + q, *. ТЕСТ меньше +>a +>b: = a "<"b. FUNCTION make+a>+>b: = a" = "b. FUNCTION add +>a +>b + sum>: = sum" = "a" + "b. FUNCTION half +>a>: = a "/ = 2". FUNCTION incr +>a>: = a "++". FUNCTION decr +>a>: = a "-". ТЕСТ меньшего элемента +>i +>j: = "items [" i " ] i +>jt: = t "= items [" i "]; items [" i "] = items [" j "]; items [" j "] =" t.

Примитивные операции здесь определены в терминах Java (или C). Это не полная программа; мы должны определить элементы массива Java в другом месте.

CDL2, появившийся в 1976 году, сохранил принципы CDL1, но сделал язык подходящим для крупных проектов. Он представил модули, принудительное изменение данных только в случае успеха и несколько расширило возможности языка. Оптимизаторы в компиляторе CDL2 и особенно в CDL2 Laboratory (IDE для CDL2) были первоклассными и не только для своего времени. Одна особенность оптимизатора лаборатории CDL2 практически уникальна: он может выполнять оптимизацию для разных единиц компиляции, то есть обрабатывать всю программу как одну компиляцию.

CDL3 - более новый язык. Он отказался от открытой функции предыдущих версий CDL и предоставляет примитивы для базовой арифметики и доступа к хранилищу. Чрезвычайно пуританский синтаксис более ранних версий CDL (количество ключевых слов и символов, состоящих из одной цифры) также был ослаблен, и некоторые основные концепции теперь выражены в синтаксисе, а не в явной семантике. Кроме того, в язык были введены типы данных.

Используйте

Коммерческий mbp Cobol (компилятор Cobol для ПК), а также систему MProlog (промышленная реализация Prolog, работающая на многих архитектурах (мэйнфрейм IBM, VAX, PDP- 11, Intel 8086 и др.) И ОС (DOS / OS / CMS / BS2000, VMS / Unix, DOS / Windows / OS2)). Последнее, в частности, свидетельствует о переносимости CDL2.

Хотя большинство программ, написанных с помощью CDL, были компиляторами, есть по крайней мере одно коммерческое приложение с графическим пользовательским интерфейсом, которое было разработано и поддерживается на CDL. Это приложение для получения стоматологических изображений теперь принадлежит DEXIS. Система управления стоматологическим кабинетом также когда-то была разработана в CDL.

Программное обеспечение для шахматного компьютера Mephisto III было написано с использованием CDL2.

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