PL/0
PL/0 je programovací jazyk podobný jazyku Pascal, navržený pro výuku konstrukce překladačů. Jazyk PL/0 je velmi zjednodušený; má pouze jednoduché proměnné, celočíselné výrazy, operátory porovnání, řídicí konstrukce begin
– end
, if
– then
, while
– do
a procedury bez parametrů. Kvůli těmto omezením je psaní programů v PL/0 nepraktické, lze však pro něj vytvářet jednoduché a kompaktní překladače, na kterých lze efektivně demonstrovat množství konceptů používaných při konstrukci překladačů.
Jazyk PL/0 použil Niklaus Wirth v roce 1976 pro ukázku konstrukce překladače ve své knize Algoritmy + datové struktury = programy.
Gramatika
editovatSyntaxi jazyka PL/0 lze popsat v EBNF takto:
program = blok "." .
blok = [ "const" ident "=" číslo {"," ident "=" číslo} ";"]
[ "var" ident {"," ident} ";"]
{ "procedure" ident ";" blok ";" } příkaz .
příkaz = [ ident ":=" výraz | "call" ident
| "?" ident | "!" výraz
| "begin" příkaz {";" příkaz } "end"
| "if" podmínka "then" příkaz
| "while" podmínka "do" příkaz ].
podmínka = "odd" výraz |
výraz ("="|"#"|"<"|"<="|">"|">=") výraz .
výraz = [ "+"|"-"] term { ("+"|"-") term}.
term = faktor {("*"|"/") faktor}.
faktor = ident | číslo | "(" výraz ")".
Pro jazyk s takto jednoduchou syntaxí je poměrně jednoduché napsat analyzátor s rekurzivním sestupem. Proto se překladač PL/0 často používá při přednáškách o konstrukci překladačů. Základní PL/0 lze rozšiřovat o vlastnosti dobře známé z jiných jazyků. Studenti jej obvykle mají rozšířit o řídicí konstrukci repeat
– until
i o pokročilejší vlastnosti, jako je předávání parametrů procedur, datové struktury jako pole a řetězce nebo o aritmetiku v pohyblivé řádové čárce.
Historie
editovatV prosinci 1976 napsal Wirth malou knížečku o konstrukci překladačů, která obsahovala kompletní zdrojový kód překladače jazyka PL/0. Výše uvedená syntaktická pravidla byla převzata z prvního vydání Wirthovy knihy Compilerbau[1]. V pozdějších vydáních této knihy (pod vlivem svého probíhajícího výzkumu) změnil Wirth syntaxi jazyka PL/0. Změnil psaní klíčových slov jako const a procedure na velká písmena. Po této změně se PL/0 více podobá jazyku Modula-2. Současně Wirthův přítel a spolupracovník C. A. R. Hoare pracoval na svém vlivném konceptu komunikace sekvenčních procesů, který pro zápis komunikačních primitiv používal vykřičník ! a otazník ?. Wirth oba symboly přidal do jazyka PL/0, ale nikde v knize neuvádí jejich sémantiku.
Použití v vzdělávání
editovatPůvodní článek o překladačích používá PL/0 pro demonstraci několika významných konceptů (postupné zjemňování, syntaktická analýza rekurzivním sestupem, EBNF, P-code, T-diagramy) studentům informatiky. Mnoho universitních přednášek o konstrukci překladačů kopíruje Wirthův přístup při používání těchto technik (viz reference níže). Klasická technika syntaktické analýzy rekurzivním sestupem je v některých přednáškách nahrazena nebo doplněna unixovým přístupem s využitím nástrojů lex a yacc (již také klasickým). Některé kurzy (PL/0 Language Tools) obsahují moderní koncepty, jako je objektově orientované programování a návrhové vzory s použitím moderních skriptovacích jazyků (Python) umožňující studentům pracovat s implementací v současném stylu programování.
Příklady
editovatNásledující příklad používá rozšíření jazyka PL/0 nazývaného PL/0E.[2]
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.
Tento program vypíše druhé mocniny čísel 1 až 10. Vykřičník se dnes obvykle nahrazuje voláním procedury WriteLn.
Následující příklad byl převzat z druhého vydání Wirthovy knihy Compilerbau,[1] vydané v roce 1986 v Německu:
CONST
m = 7,
n = 85;
VAR
x, y, z, q, r;
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;
BEGIN
x := m;
y := n;
CALL multiply;
x := 25;
y := 3;
CALL divide;
x := 84;
y := 36;
CALL gcd
END.
Oberon-0
editovatV třetím a posledním vydání své knihy o konstrukci překladačů nahradil Wirth PL/0 jazykem Oberon-0. Přestože je jazyk Oberon-0 mnohem složitější než PL/0, v knize je obsažen jeho kompletní překladač. Oberon-0 mimo jiné dovoluje použití polí, záznamů, deklarací typů a parametrů procedur. Vydavatelství Addison-Wesley nepokračuje ve vydávání Wirthových knih, ale Wirth v roce 2005 upravil třetí vydání své knihy a výsledek publikoval na internetu.[3]
Odkazy
editovatReference
editovatV tomto článku byl použit překlad textu z článku PL/0 na anglické Wikipedii.
- ↑ a b Wirth, 1986
- ↑ PL/0E
- ↑ WIRTH, Niklaus. Compiler Construction [online]. 3., upravené. vyd. 1996, 2005 [cit. 2017-02-25]. Dostupné v archivu pořízeném dne 2017-02-17. ISBN 0-201-40353-6.
- LIFFICK, Blaise W. Byte Book of Pascal. [s.l.]: [s.n.], 1979. Dostupné online. ISBN 0-07-037823-1.
- WIRTH, Niklaus. Algorithms + Data Structures = Programs. [s.l.]: [s.n.], 1975. Dostupné online. ISBN 0-13-022418-9.
- WIRTH, Niklaus. Compilerbau. Stuttgart: B.G. Teubner, 1986. Dostupné v archivu pořízeném dne 2012-06-03. ISBN 3-519-32338-9. Archivováno 3. 6. 2012 na Wayback Machine.
Související články
editovatExterní odkazy
editovat- Překladač Archivováno 25. 8. 2017 na Wayback Machine. z prvního vydání knihy Compilerbau napsaný v Pascalu
- Interpret z knihy „Algoritmy + Datové Struktury = Programy“, napsaný v Pascalu
- Vývoj překladače ve stylu jazyka PL/0 Archivováno 18. 2. 2017 na Wayback Machine. vycházející z knihy 'Compiler Construction' napsaného v Mocka (Modula-2 pro Linux)
- Článek popisující použití PL/0 na University of Rochester
- Domovská stránka referenční knihy o PL/0 „Algoritmy + Data Struktury = Programy“ [1]
- http://sourceforge.net/projects/pl0-compiler (napsaný v jazyce C/C++, používá QT framework)
- https://github.com/cznic/pl0 (multiplatformní napsaný v jazyce Go, běží v textovém okně)
- Category:PL/0 Úkoly implementované v PL/0 na rosettacode.org (anglicky)