PL/0 is a programming language, intended as an educational programming language, that is similar to but much simpler than Pascal, a general-purpose programming language. It serves as an example of how to construct a compiler. It was originally introduced in the book, Algorithms + Data Structures = Programs, by Niklaus Wirth in 1976. It features quite limited language constructs: there are no real numbers, very few basic arithmetic operations and no control-flow constructs other than "if" and "while" blocks. While these limitations make writing real applications in this language impractical, it helps the compiler remain compact and simple.

Features

All constants and variables used must be declared explicitly.

The only data types are integers. The only operators are arithmetic and comparison operators. There is an <code>odd</code> function that tests whether the argument is odd.

In the original implementation presented by Wirth, there are no input and output routines. The compiler prints the value as a given variable changes. So the program:

<syntaxhighlight lang="pascal">

var i, s;

begin

i := 0; s := 0;

while i < 5 do

begin

i := i + 1;

s := s + i * i

end

end.

</syntaxhighlight>

gives the output:

<pre>

0

0

1

1

2

5

3

14

4

30

5

55

</pre>

However, most implementations have single input and single output routines.

Flow control structures are <code>if-then</code> and <code>while-do</code> constructs and user-defined procedures. Procedures cannot accept parameters.

Grammar

The following is the syntax rules of the model language defined in EBNF:

<syntaxhighlight lang="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 ")";

</syntaxhighlight>

It is rather easy for students to write a recursive descent parser for such a simple syntax. Therefore, the PL/0 compiler is still widely used in courses on compiler construction throughout the world. Due to the lack of features in the original specification, students usually spend most of their time with extending the language and their compiler. They usually start with introducing <code>REPEAT .. UNTIL</code> and continue with more advanced features like parameter passing to procedures or data structures like arrays, strings or floating point numbers.

Use in education

The main article on compilers honours PL/0 for introducing several influential concepts (stepwise refinement, recursive descent parsing, EBNF, P-code, T-diagrams) to the field by educating students to use these concepts. Over the last 3 decades, most university courses on compiler construction that used PL/0 have followed Wirth strictly in employing these techniques (see references below). Some years ago university courses deviated from the course set by Wirth with the replacement of the classical recursive descent parsing technique by a (nonetheless classical) Unix-like approach of employing lex and yacc. Only recently an implementation (PL/0 Language Tools) along this way has also combined modern concepts like object-orientation and design patterns with a modern scripting language (Python), allowing students to consume the source text of the implementation in a contemporary programming style.

Compiler construction

In December 1976, Wirth wrote a small booklet about compiler construction, containing the full source code of the PL/0 compiler. The syntax rules above were taken from this first edition of Wirth's book Compilerbau. In later editions of this book (under the influence of his ongoing research) Wirth changed the syntax of PL/0. He changed the spelling of keywords like <code>const</code> and <code>procedure</code> to uppercase. This change made PL/0 resemble Modula-2 more closely. At the same time, Wirth's friend and collaborator C. A. R. Hoare was working on his influential communicating sequential processes concept, which used the exclamation mark ! and the question mark ? to denote communication primitives. Wirth added both symbols to the PL/0 language, but he did not mention their semantics in the book.

Examples

This program outputs the squares of numbers from 1 to 10. Most courses in compiler construction today have replaced the exclamation mark with the <code>WriteLn</code> procedure.

<syntaxhighlight lang="pascal">

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.

</syntaxhighlight>

This following program prints the prime numbers from 1 to 100. The write statement corresponds to '!' statement in the EBNF syntax above.

<syntaxhighlight lang="pascal">

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

.

</syntaxhighlight>

The following example was taken from the second edition of Wirth's book Compilerbau, , the most recent revision available is from May 2017.

See also

  • P-code machine
  • City & Guilds Mnemonic Code

Notes

<!--<nowiki>

See http://en.wikipedia.org/wiki/Wikipedia:Footnotes for an explanation of how

to generate footnotes using the tags, and the template below

</nowiki>-->

References

  • Liffick, Blaise W., Ed (1979), The Byte Book of Pascal,
  • Wirth, Niklaus (1975), Algorithms + Data Structures = Programs,
  • Wirth, Niklaus (1986), Compilerbau, B.G. Teubner, Stuttgart
  • The compiler (.pas file) from the first edition of the Compilerbau book, written in Pascal
  • Another copy of the compiler at Pascal for small machines site
  • The interpreter from "Algorithms + Data Structures = Programs" book, written in Pascal
  • Development of a PL/0 style compiler based on 'Compiler construction' written in Mocka (Modula-2 for Linux)
  • A paper explaining the use of PL/0 at the University of Rochester
  • The homepage of the PL/0 reference book, "Algorithms + Data Structures = Programs" [https://web.archive.org/web/20130207170133/http://www.inf.ethz.ch/personal/wirth/books/AlgorithmE0/]
  • https://sourceforge.net/projects/pl0-compiler (written in C/C++, uses QT framework)
  • https://modernc.org/pl0 (written in Go, runs in terminal, cross platform)
  • https://github.com/dodobyte/plzero (a very small compiler produces windows executable)
  • https://github.com/hindermath/TinyPl0 (modern port of PL/0 with Agentic-AI to .Net10/C# 14)
  • https://github.com/MarcRochkind/pl0compiler (compiler for IBM 701 written in C; generates 701 assembler)
  • Category:PL/0 Tasks implemented in PL/0 on rosettacode.org