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 .. UNTILe 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 conste procedurepara 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 WriteLnprocedimento.

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

links externos