PL/0
- Дата создания:
- 1975
- Парадигма:
- Типизация:
- Реализации и версии (свернуть все | развернуть все):
Язык PL/0 (не путать с одноименной реализацией языка PL/I) — учебный языком программирования, использующийся в качестве примера разработки компилятора.
Язык был представлен Никлаусом Виртом в 1975 году в книге “Algorithms + Data Structures = Programs”. В книге 1976 года “Compilerbau” (“Разработка компиляторов”) был приведен код компилятора PL/0, написанный на Pascal.
Возможности оригинальной версии языка крайне ограничены:
- единственный тип данных — целые числа. Несмотря на это, используемые переменные и константы должны быть объявлены в явном виде.
- набор операторов ограничен арифметическими действиями и операторами сравнения.
-
есть одна встроенная функция
odd
, проверяющая нечетность числа-аргумента. - функции ввода-вывода данных отсутствуют; компилятор выводит на печать значения всех изменяемых переменных в момент их изменения.
-
язык предоставляет конструкции
if-then
иwhile-do
, а также возможность определять и вызывать пользовательские процедуры (без передачи аргументов).
Ниже приведен синтаксис языка в расширенной форме Бэкуса-Наура:
program = block "." .
block = [ "const" ident "=" number {"," ident "=" number} ";"]
[ "var" ident {"," ident} ";"]
{ "procedure" ident ";" block ";" } statement .
statement = [ ident ":=" expression | "call" ident |
"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 сначала усложнялся для иллюстрации более сложных принципов (например, были добавлены функции ввода-вывода данных), а затем и вовсе был заменен на Oberon-0.
Простота реализации “PL/0” и множество возможных путей его расширения (добавление новых конструкций циклов, типов данных и т.д.) делает его популярным выбором в курсах, изучающих построение компиляторов, и в наши дни. Современные реализации позволяют комбинировать язык с новыми идеями — объектно-ориентированным программированием, шаблонами проектирования и даже языком Python.
Элементы синтаксиса:
Регистрозависимость | да |
---|---|
Присваивание значения переменной | <varname> := <value> |
Объявление переменной | var <varname> |
Блок | begin ... end |
Равенство | = |
Неравенство | # |
Сравнение | < > |
Определение функции | procedure <name>; <body>; |
Вызов функции | call <name> |
Последовательность | ; |
Если - то | if <condition> then <trueBlock> |
Бесконечный цикл | while 1 = 1 do <loopBody> |
Цикл с предусловием | while <condition> do <loopBody> |
Примеры:
Факториал:
Пример для версий Wirth's PL/0 (1976)В языке нет возможности выводить символы, поэтому программа выводит пары число-его факториал, без разделителей. Результат запуска этой программы имеет следующий вид:
0 var n, f;
1 begin
2 n := 0;
4 f := 1;
6 while n # 16 do
10 begin
10 n := n + 1;
14 f := f * n;
18 end;
19 end.
0 jmp 1 1
1 int 1 5
2 lit 1 0
3 sto 1 3
4 lit 1 1
5 sto 1 4
6 lod 1 3
7 lit 1 16
8 opr 1 9
9 jpc 1 19
10 lod 1 3
11 lit 1 1
12 opr 1 2
13 sto 1 3
14 lod 1 4
15 lod 1 3
16 opr 1 4
17 sto 1 4
18 jmp 1 6
19 opr 1 0
start pl/0
0
1
1
1
2
2
3
6
4
24
5
120
6
720
7
5040
8
40320
9
362880
10
3628800
11
39916800
12
479001600
13
1932053504
14
1278945280
15
2004310016
16
2004189184
end pl/0
var n, f;
begin
n := 0;
f := 1;
while n # 16 do
begin
n := n + 1;
f := f * n;
end;
end.
Комментарии
]]>blog comments powered by Disqus
]]>