PL/0

programovací jazyk
Tento článek pojednává o jazyce pro výuku konstrukce překladačů. Možná hledáte: podmnožinu programovacího jazyka PL/1 firmy IBM.

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 beginend, ifthen, whiledo 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

editovat

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 repeatuntil 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

editovat

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 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í

editovat

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

editovat

Ná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

editovat

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.[3]

Reference

editovat

V tomto článku byl použit překlad textu z článku PL/0 na anglické Wikipedii.

  1. a b Wirth, 1986
  2. PL/0E
  3. 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. 

Související články

editovat

Externí odkazy

editovat