PL / 0 - это язык программирования , предназначенный для использования в качестве образовательного языка программирования , который похож на Паскаль , язык программирования общего назначения, но намного проще . Он служит примером того, как построить компилятор . Первоначально он был представлен в книге Никлауса Вирта « Алгоритмы + структуры данных = программы » в 1976 году. Он имеет довольно ограниченные языковые конструкции: нет действительных чисел, очень мало базовых арифметических операций и нет конструкций потока управления, кроме «если». и блоки «пока». Хотя эти ограничения делают написание реальных приложений на этом языке непрактичным, они помогают компилятору оставаться компактным и простым.
Грамматика
Ниже приведены синтаксические правила языка модели, определенные в EBNF :
программа = блок "." .block = [ "const" identify "=" number { "," identify "=" number } ";" ] [ "var" identify { "," identify } ";" ] { "процедура" идент ";" блок ";" } заявление .заявление = [ идент ": =" выражение | "позвонить" идент | "?" идент | "!" выражение | "начало" заявление { ";" оператор } "конец" | оператор "если" условие "то" | выражение «пока» условие «делать» ]. условие = "нечетное" выражение | выражение ( "=" | "#" | "<" | "<=" | ">" | "> =" ) выражение .выражение = [ "+" | "-" ] термин { ( "+" | "-" ) термин }.термин = фактор {( "*" | "/" ) фактор }.фактор = идент | номер | "(" выражение ")" .
Студентам довольно легко написать синтаксический анализатор рекурсивного спуска для такого простого синтаксиса. Поэтому компилятор PL / 0 по-прежнему широко используется в курсах по построению компиляторов во всем мире. Из-за отсутствия функций в исходной спецификации студенты обычно тратят большую часть своего времени на расширение языка и своего компилятора. Обычно они начинают с представления REPEAT .. UNTIL
и продолжают более продвинутые функции, такие как передача параметров процедурам или структурам данных, таким как массивы, строки или числа с плавающей запятой.
Использование в образовании
Основная статья о компиляторах отдает должное PL / 0 за введение в поле нескольких важных концепций (пошаговое уточнение, рекурсивный анализ спуска, EBNF, P-код, T-диаграммы) путем обучения студентов использованию этих концепций. За последние 3 десятилетия большинство университетских курсов по созданию компиляторов, использующих PL / 0, строго следовали Вирту в использовании этих методов (см. Ссылки ниже). Несколько лет назад университетские курсы отклонились от курса, установленного Виртом, с заменой классической техники синтаксического анализа рекурсивного спуска (тем не менее классическим) Unix-подобным подходом с использованием lex и yacc . Совсем недавно реализация ( языковые инструменты PL / 0 ) на этом пути также объединила современные концепции, такие как объектная ориентация и шаблоны проектирования, с современным языком сценариев ( Python ), что позволяет учащимся использовать исходный текст реализации в современном стиле программирования. .
Конструкция компилятора
В декабре 1976 года Вирт написал небольшую брошюру о построении компилятора, содержащую полный исходный код компилятора PL / 0. Приведенные выше правила синтаксиса были взяты из этого первого издания книги Вирта Compilerbau . [1] В более поздних изданиях этой книги (под влиянием продолжающихся исследований) Вирт изменил синтаксис PL / 0. Он изменил написание таких ключевых слов, как const
и, procedure
на прописные. Это изменение сделало PL / 0 более похожим на Modula-2 . В то же время друг и сотрудник Вирта Кар Хоар работал над своей влиятельной концепцией последовательных коммуникационных процессов , в которой использовался восклицательный знак ! а вопросительный знак ? для обозначения коммуникативных примитивов. Вирт добавил оба символа в язык PL / 0, но не упомянул их семантику в книге.
Примеры
Следующий пример взят из такого расширенного языка под названием PL / 0E. [2] Эта программа выводит квадраты чисел от 1 до 10. Сегодня в большинстве курсов по построению компиляторов восклицательный знак заменен WriteLn
процедурой.
VAR x , squ ;ПРОЦЕДУРА квадратная ; НАЧАТЬ squ : = x * x END ;НАЧАТЬ x : = 1 ; ПРИ х <= 10 DO НАЧАТЬ CALL , квадрат ; ! squ ; x : = x + 1 КОНЕЦ КОНЕЦ .
Следующая программа печатает простые числа от 1 до 100. Оператор записи соответствует "!" в приведенном выше синтаксисе EBNF.
const max = 100 ; var arg , ret ;процедура проста ; var i ; начало ret : = 1 ; я : = 2 ; while i < arg действительно начать, если arg / i * i = arg then begin ret : = 0 ; я : = конец аргумента ; i : = i + 1 конец конец ; простые числа процедур ; начало аргумента : = 2 ; в то время как arg < max do begin call isprime ; если ret = 1, то напишите arg ; arg : = arg + 1 конец конец ;назовите простые числа .
Следующий пример взят из второго издания книги Вирта Compilerbau [1], вышедшей в 1986 году в Германии.
VAR x , y , z , q , r , n , f ;ПРОЦЕДУРА умножения ; VAR a , b ; НАЧАТЬ a : = x ; b : = y ; z : = 0 ; ПРИ Ь > 0 DO НАЧАТЬ ЕСЛИ ODD б ТОГДА г : = г + ; а : = 2 * а ; b : = b / 2 КОНЕЦ КОНЕЦ ; ПРОЦЕДУРА разделить ; VAR w ; НАЧАТЬ r : = x ; q : = 0 ; ш : = у ; ПОКА w <= r DO w : = 2 * w ; ПРИ ш > у DO НАЧАТЬ д : = 2 * д ; w : = w / 2 ; ЕСЛИ w <= r ТО НАЧИНАЕТСЯ r : = r - w ; q : = q + 1 КОНЕЦ КОНЕЦ КОНЕЦ ;ПРОЦЕДУРА gcd ; VAR f , г ; НАЧАТЬ f : = x ; г : = у ; ПРИ е # г DO НАЧАТЬ ЕСЛИ е < г ТОГДА г : = г - е ; ЕСЛИ g < f ТО f : = f - g END ; z : = f END ;ПРОЦЕДУРА факт ; НАЧАТЬ ЕСЛИ n > 1 ТО НАЧАТЬ f : = n * f ; n : = n - 1 ; CALL факт END END ;НАЧАТЬ ? х ; ? у ; ЗВОНИТЕ умножить ; ! z ; ? х ; ? у ; ЗВОНИТЕ разделить ; ! q ; ! r ; ? х ; ? у ; CALL gcd ; ! z ; ? n ; f : = 1 ; ЗВОНИТЕ факт ; ! f КОНЕЦ .
Оберон-0
В третьем и последнем издании своей книги по построению компиляторов Вирт заменил PL / 0 на Oberon-0. Язык Оберон-0 намного сложнее PL / 0. Например, Oberon-0 предлагает массивы, записи, объявления типов и параметры процедур. Издатель книг Вирта (Аддисон-Уэсли) решил постепенно отказаться от всех своих книг, но Вирт опубликовал исправленные издания своей книги начиная с 2004 года. [3] По состоянию на август 2017 года.[Обновить], самая последняя доступная редакция выпущена в мае 2017 года. [4] [5]
Смотрите также
Заметки
- ^ а б Вирт, 1986
- ^ PL / 0E Архивировано 21 февраля 2012 г. в Wayback Machine
- ^ Пересмотренная третье издание архивации 2017-02-17 в Wayback Machine (2005 г.) Compiler строительства , Никлаус Вирт, 1996, ISBN 0-201-40353-6 никогда не видел печатный станок, но она доступнаИнтернете.
- ^ Вирт, Никлаус (28.05.2017). «Конструкция компилятора» . Проверено 25 августа 2017 .
- ^ Вирт, Никлаус (18.08.2017). "news.txt" . Архивировано из оригинала на 2017-08-25 . Проверено 25 августа 2017 .
Рекомендации
- Лиффик, Блейз В., Эд (1979), Байт-книга Паскаля , ISBN 0-07-037823-1
- Вирт, Никлаус (1975), Алгоритмы + структуры данных = программы , ISBN 0-13-022418-9
- Вирт, Никлаус (1986), Compilerbau , BG Teubner, Штутгарт ISBN 3-519-32338-9
Внешние ссылки
- Компилятор от первого издания Compilerbau книги, написанный в Pascal
- Переводчик из «Структуры Алгоритмы + Данные = Программы» книги, написанные в Pascal
- Разработка компилятора в стиле PL / 0 на основе 'Compiler Construction', написанного на Mocka (Modula-2 для Linux)
- Документ, объясняющий использование PL / 0 в Университете Рочестера
- Домашняя страница справочника PL / 0 "Алгоритмы + структуры данных = программы" [1]
- http://sourceforge.net/projects/pl0-compiler (написан на C / C ++, использует фреймворк QT)
- https://modernc.org/pl0 (написано на Go, работает в терминале, кроссплатформенный)
- https://github.com/dodobyte/plzero (очень маленький компилятор создает исполняемый файл Windows)
- https://github.com/MarcRochkind/pl0compiler (компилятор для IBM 701, написанный на C; генерирует ассемблер 701)