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 Syntaxi 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 V 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 CompilerbauWirth, 1986. 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í Pů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 Následující příklad používá rozšíření jazyka PL/0 nazývaného PL/0E.PL/0E

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, 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 V 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.

Odkazy

Reference

Související články P-code stroj

Externí odkazy Překladač 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 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“ 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

Kategorie:Programovací jazyky Kategorie:Překladače