ПЛ/0
PL/0 — это язык программирования , предназначенный для обучения , он похож на Паскаль , язык программирования общего назначения , но намного проще его . Он служит примером того, как построить компилятор . Первоначально он был представлен в книге «Алгоритмы + структуры данных = программы » Никлауса Вирта в 1976 году. Он имеет довольно ограниченные языковые конструкции: нет действительных чисел, очень мало основных арифметических операций и никаких конструкций потока управления, кроме «если». и блоки «пока». Хотя эти ограничения делают написание реальных приложений на этом языке непрактичным, они помогают компилятору оставаться компактным и простым.
Функции
[ редактировать ]Все используемые константы и переменные должны быть объявлены явно.
Единственными типами данных являются целые числа . Единственными операторами являются арифметические операторы и операторы сравнения. Существует odd
функция, которая проверяет, является ли аргумент нечетным.
В исходной реализации, представленной Виртом, нет процедур ввода и вывода . Компилятор печатает новое значение каждой переменной по мере его изменения. Итак программа:
var i, s;
begin
i := 0; s := 0;
while i < 5 do
begin
i := i + 1;
s := s + i * i
end
end.
дает вывод:
0 0 1 1 2 5 3 14 4 30 5 55
Однако большинство реализаций имеют подпрограммы с одним входом и одним выходом.
управления потоком Структуры if-then
и while-do
конструкции и определяемые пользователем процедуры . Процедуры не могут принимать параметры.
Грамматика
[ редактировать ]Ниже приведены правила синтаксиса модельного языка, определенного в EBNF :
program = block "." ;
block = [ "const" ident "=" number {"," ident "=" number} ";"]
[ "var" ident {"," ident} ";"]
{ "procedure" ident ";" block ";" } statement ;
statement = [ ident ":=" expression | "call" ident
| "?" ident | "!" expression
| "begin" statement {";" statement } "end"
| "if" condition "then" statement
| "while" condition "do" statement ];
condition = "odd" expression |
expression ("="|"#"|"<"|"<="|">"|">=") expression ;
expression = [ "+"|"-"] term { ("+"|"-") term};
term = factor {("*"|"/") factor};
factor = ident | number | "(" expression ")";
Студентам довольно легко написать анализатор рекурсивного спуска для такого простого синтаксиса. Поэтому компилятор PL/0 до сих пор широко используется в курсах по построению компиляторов во всем мире. Из-за отсутствия функций в исходной спецификации студенты обычно тратят большую часть своего времени на расширение языка и его компилятора. Обычно они начинаются с ознакомления. REPEAT .. UNTIL
и продолжите использовать более продвинутые функции, такие как передача параметров в процедуры или структуры данных, такие как массивы, строки или числа с плавающей запятой.
Использование в образовании
[ редактировать ]Основная статья о компиляторах посвящена PL/0. [ нужна ссылка ] за внедрение в эту область нескольких влиятельных концепций (пошаговое уточнение, анализ рекурсивного спуска, EBNF, P-код, T-диаграммы) путем обучения студентов использованию этих концепций. За последние три десятилетия большинство университетских курсов по построению компиляторов, в которых использовался PL/0, строго следовали Вирту при использовании этих методов (см. ссылки ниже). Несколько лет назад университетские курсы отклонились от курса, установленного Виртом, с заменой классической техники синтаксического анализа рекурсивного спуска на (тем не менее классический) Unix-подобный подход с использованием lex и yacc . Лишь недавно реализация ( PL/0 Language Tools ) по этому пути также объединила современные концепции, такие как объектно-ориентированная ориентация и шаблоны проектирования, с современным языком сценариев ( Python ), что позволяет студентам использовать исходный текст реализации в современном стиле программирования. .
Конструкция компилятора
[ редактировать ]В декабре 1976 года Вирт написал небольшую брошюру о конструкции компилятора, содержащую полный исходный код компилятора PL/0. Приведенные выше правила синтаксиса были взяты из первого издания книги Вирта Compilerbau . [1] В более поздних изданиях этой книги (под влиянием своих продолжающихся исследований) Вирт изменил синтаксис PL/0. Он изменил написание ключевых слов, например const
и procedure
в верхний регистр. Это изменение сделало PL/0 более похожим на Модулу-2 . В то же время друг и соратник Вирта К. Р. Хоар работал над своей влиятельной концепцией последовательных процессов связи , в которой использовался восклицательный знак ! и знак вопроса ? для обозначения примитивов связи. Вирт добавил оба символа в язык PL/0, но не упомянул в книге их семантику.
Примеры
[ редактировать ]Эта программа [2] выводит квадраты чисел от 1 до 10. Сегодня в большинстве курсов по созданию компиляторов восклицательный знак заменен на WriteLn
процедура.
VAR x, squ;
PROCEDURE square;
BEGIN
squ:= x * x
END;
BEGIN
x := 1;
WHILE x <= 10 DO
BEGIN
CALL square;
! squ;
x := x + 1
END
END.
Следующая программа печатает простые числа от 1 до 100. Оператор записи соответствует '!' оператор в синтаксисе EBNF выше.
const max = 100;
var arg, ret;
procedure isprime;
var i;
begin
ret := 1;
i := 2;
while i < arg do
begin
if arg / i * i = arg then
begin
ret := 0;
i := arg
end;
i := i + 1
end
end;
procedure primes;
begin
arg := 2;
while arg < max do
begin
call isprime;
if ret = 1 then write arg;
arg := arg + 1
end
end;
call primes
.
Следующий пример был взят из второго издания книги Вирта Compilerbau: [1] который появился в 1986 году в Германии.
VAR x, y, z, q, r, n, f;
PROCEDURE multiply;
VAR a, b;
BEGIN
a := x;
b := y;
z := 0;
WHILE b > 0 DO
BEGIN
IF ODD b THEN z := z + a;
a := 2 * a;
b := b / 2
END
END;
PROCEDURE divide;
VAR w;
BEGIN
r := x;
q := 0;
w := y;
WHILE w <= r DO w := 2 * w;
WHILE w > y DO
BEGIN
q := 2 * q;
w := w / 2;
IF w <= r THEN
BEGIN
r := r - w;
q := q + 1
END
END
END;
PROCEDURE gcd;
VAR f, g;
BEGIN
f := x;
g := y;
WHILE f # g DO
BEGIN
IF f < g THEN g := g - f;
IF g < f THEN f := f - g
END;
z := f
END;
PROCEDURE fact;
BEGIN
IF n > 1 THEN
BEGIN
f := n * f;
n := n - 1;
CALL fact
END
END;
BEGIN
?x; ?y; CALL multiply; !z;
?x; ?y; CALL divide; !q; !r;
?x; ?y; CALL gcd; !z;
?n; f := 1; CALL fact; !f
END.
Оберон-0
[ редактировать ]В третьем и последнем издании своей книги по созданию компиляторов Вирт заменил PL/0 на Оберон-0 . Язык Оберон-0 намного сложнее, чем PL/0. Например, Оберон-0 предлагает массивы, записи, объявления типов и параметры процедур. Издатель книг Вирта (Аддисон-Уэсли) решил прекратить выпуск всех его книг, но Вирт опубликовал исправленные издания своей книги, начиная с 2004 года. [3] По состоянию на август 2017 г. [update], самая последняя доступная версия датируется маем 2017 года. [4] [5]
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ Jump up to: а б Вирт, 1986 г.
- ^ PL/0. Архивировано 21 февраля 2012 г. в Wayback Machine.
- ^ Пересмотренное третье издание. Архивировано 17 февраля 2017 г. в Wayback Machine (2005) компании Compiler Construction , Никлаус Вирт, 1996 г., ISBN 0-201-40353-6 никогда не публиковался в типографии, но доступен в Интернете.
- ^ Вирт, Никлаус (28 мая 2017 г.). «Строительство компилятора» . Проверено 25 августа 2017 г.
- ^ Вирт, Никлаус (18 августа 2017 г.). "news.txt" . Архивировано из оригинала 25 августа 2017 г. Проверено 25 августа 2017 г.
Ссылки
[ редактировать ]- Лиффик, Блез В., Эд (1979), Байтовая книга Паскаля , ISBN 0-07-037823-1
- Вирт, Никлаус (1975), Алгоритмы + Структуры данных = Программы , ISBN 0-13-022418-9
- Вирт, Никлаус (1986), Конструкция компилятора , Б. Г. Тойбнер, Штутгарт ISBN 3-519-32338-9
Внешние ссылки
[ редактировать ]- Компилятор (файл .pas) из первого издания книги Compilerbau , написанный на языке Паскаль.
- Еще одна копия компилятора Паскаля для сайта малых машин
- Интерпретатор . из книги "Алгоритмы + Структуры данных = Программы", написанной на языке Паскаль
- Разработка компилятора в стиле PL/0 на основе «конструкции компилятора», написанной на 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)
- Категория:PL/0 Задачи, реализованные в PL/0 на сайтеrosettacode.org