PL / 0 - PL/0
PL / 0 é uma linguagem de programação , concebida como uma linguagem de programação educacional , que é semelhante, mas muito mais simples do que Pascal , uma linguagem de programação de propósito geral . Ele serve como um exemplo de como construir um compilador . Foi originalmente apresentado no livro Algorithms + Data Structures = Programs , de Niklaus Wirth em 1976. Apresenta construções de linguagem bastante limitadas: não há números reais, muito poucas operações aritméticas básicas e nenhuma construção de fluxo de controle além de "if" e blocos "enquanto". Embora essas limitações tornem a escrita de aplicativos reais nesta linguagem impraticável, elas ajudam o compilador a permanecer compacto e simples.
Gramática
A seguir estão as regras de sintaxe da linguagem do modelo definida em 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 ")";
É bastante fácil para os alunos escrever um analisador descendente recursivo para uma sintaxe tão simples. Portanto, o compilador PL / 0 ainda é amplamente utilizado em cursos de construção de compiladores em todo o mundo. Devido à falta de recursos na especificação original, os alunos geralmente passam a maior parte do tempo estendendo a linguagem e seu compilador. Eles geralmente começam com a introdução REPEAT .. UNTIL
e continuam com recursos mais avançados, como passagem de parâmetros para procedimentos ou estruturas de dados como matrizes, strings ou números de ponto flutuante.
Uso na educação
O artigo principal sobre compiladores homenageia PL / 0 por introduzir vários conceitos influentes (refinamento gradual, análise descendente recursiva, EBNF, código P, diagramas T) para o campo, educando os alunos no uso desses conceitos. Nas últimas 3 décadas, a maioria dos cursos universitários sobre construção de compiladores que usaram PL / 0 seguiram Wirth estritamente no emprego dessas técnicas (consulte as referências abaixo). Alguns anos atrás, os cursos universitários desviaram-se do curso estabelecido por Wirth com a substituição da técnica de análise descendente recursiva clássica por uma abordagem (não obstante clássica) semelhante ao Unix de empregar lex e yacc . Recentemente, uma implementação ( PL / 0 Language Tools ) dessa maneira também combinou conceitos modernos como orientação a objetos e padrões de design com uma linguagem de script moderna ( Python ), permitindo que os alunos consumissem o texto fonte da implementação em um estilo de programação contemporâneo .
Construção do compilador
Em dezembro de 1976, Wirth escreveu um pequeno livreto sobre a construção do compilador, contendo o código-fonte completo do compilador PL / 0. As regras de sintaxe acima foram tiradas desta primeira edição do livro Compilerbau de Wirth . Em edições posteriores deste livro (sob a influência de sua pesquisa em andamento), Wirth mudou a sintaxe de PL / 0. Ele mudou a grafia de palavras-chave como const
e procedure
para maiúsculas. Essa mudança fez com que o PL / 0 se parecesse mais com o Modula-2 . Ao mesmo tempo, o amigo e colaborador de Wirth, CAR Hoare, estava trabalhando em seu influente conceito de processos sequenciais de comunicação , que usava o ponto de exclamação ! e o ponto de interrogação ? para denotar primitivas de comunicação. Wirth adicionou os dois símbolos à linguagem PL / 0, mas não mencionou sua semântica no livro.
Exemplos
O exemplo a seguir foi retirado de uma linguagem extensa chamada PL / 0E. Este programa produz os quadrados de números de 1 a 10. A maioria dos cursos de construção de compiladores hoje substituíram o ponto de exclamação pelo WriteLn
procedimento.
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.
O programa a seguir imprime os números primos de 1 a 100. A instrução write corresponde a '!' declaração na sintaxe EBNF acima.
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
.
O exemplo a seguir foi retirado da segunda edição do livro Compilerbau de Wirth, publicado em 1986 na Alemanha.
VAR x, y, z, q, r, n, f;
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;
PROCEDURE fact;
BEGIN
IF n > 1 THEN
BEGIN
f := n * f;
n := n - 1;
CALL fact
END
END;
BEGIN
?x; ?y; CALL multiply; !z;
?x; ?y; CALL divide; !q; !r;
?x; ?y; CALL gcd; !z;
?n; f := 1; CALL fact; !f
END.
Oberon-0
Na terceira e última edição de seu livro sobre construção de compiladores, Wirth substituiu PL / 0 por Oberon-0. A linguagem Oberon-0 é muito mais complexa que PL / 0. Por exemplo, Oberon-0 oferece matrizes, registros, declarações de tipo e parâmetros de procedimento. A editora dos livros de Wirth (Addison-Wesley) decidiu descontinuar todos os seus livros, mas Wirth publicou edições revisadas de seu livro a partir de 2004. Em agosto de 2017, a revisão mais recente disponível é de maio de 2017.
Veja também
Notas
Referências
- Liffick, Blaise W., Ed (1979), The Byte Book of Pascal , ISBN 0-07-037823-1
- Wirth, Niklaus (1975), Algorithms + Data Structures = Programs , ISBN 0-13-022418-9
- Wirth, Niklaus (1986), Compilerbau , BG Teubner, Stuttgart, ISBN 3-519-32338-9
links externos
- O compilador da primeira edição do livro Compilerbau , escrito em Pascal
- O intérprete do livro "Algoritmos + Estruturas de Dados = Programas", escrito em Pascal
- Desenvolvimento de um compilador estilo PL / 0 baseado na 'construção do compilador' escrito em Mocka (Modula-2 para Linux)
- Um artigo explicando o uso de PL / 0 na Universidade de Rochester
- A página inicial do livro de referência PL / 0, "Algoritmos + Estruturas de Dados = Programas" [1]
- http://sourceforge.net/projects/pl0-compiler (escrito em C / C ++, usa estrutura QT)
- https://modernc.org/pl0 (escrito em Go, executado em terminal, plataforma cruzada)
- https://github.com/dodobyte/plzero (um compilador muito pequeno produz executável do Windows)
- https://github.com/MarcRochkind/pl0compiler (compilador para IBM 701 escrito em C; gera 701 assembler)