PL / 0 es un lenguaje de programación , concebido como un lenguaje de programación educativo , que es similar pero mucho más simple que Pascal , un lenguaje de programación de propósito general . Sirve como ejemplo de cómo construir un compilador . Fue introducido originalmente en el libro, Algoritmos + Estructuras de datos = Programas , por Niklaus Wirth en 1976. Presenta construcciones de lenguaje bastante limitadas: no hay números reales, muy pocas operaciones aritméticas básicas y ninguna construcción de flujo de control que no sea "si" y bloques "while". Si bien estas limitaciones hacen que escribir aplicaciones reales en este lenguaje no sea práctico, ayuda al compilador a permanecer compacto y simple.
Gramática
Las siguientes son las reglas de sintaxis del lenguaje modelo definido en EBNF :
programa = bloque "." .block = [ "const" ident "=" número { "," ident "=" número } ";" ] [ "var" ident { "," ident } ";" ] { "procedimiento" ident ";" bloquear ";" } declaración .declaración = [ ident ": =" expresión | "llamar" ident | "?" ident | "!" expresión | instrucción "comenzar" { ";" declaración } "fin" | declaración "si" condición "entonces" | declaración "while" condición "hacer" ]. condición = expresión "impar" | expresión ( "=" | "#" | "<" | "<=" | ">" | "> =" ) expresión . expresión = [ "+" | "-" ] término { ( "+" | "-" ) término }.término = factor {( "*" | "/" ) factor }.factor = ident | numero | "(" expresión ")" .
Es bastante fácil para los estudiantes escribir un analizador sintáctico descendente recursivo para una sintaxis tan simple. Por lo tanto, el compilador PL / 0 todavía se usa ampliamente en cursos sobre construcción de compiladores en todo el mundo. Debido a la falta de características en la especificación original, los estudiantes suelen dedicar la mayor parte de su tiempo a ampliar el lenguaje y su compilador. Por lo general, comienzan con la introducción REPEAT .. UNTIL
y continúan con características más avanzadas, como el paso de parámetros a procedimientos o estructuras de datos, como matrices, cadenas o números de punto flotante.
Uso en educación
El artículo principal sobre compiladores rinde homenaje a PL / 0 por introducir varios conceptos influyentes (refinamiento escalonado, análisis sintáctico descendente recursivo, EBNF, código P, diagramas T) en el campo al educar a los estudiantes en el uso de estos conceptos. Durante las últimas 3 décadas, la mayoría de los cursos universitarios sobre construcción de compiladores que utilizaron PL / 0 han seguido estrictamente a Wirth en el empleo de estas técnicas (véanse las referencias a continuación). Hace algunos años, los cursos universitarios se desviaron del curso establecido por Wirth con el reemplazo de la técnica clásica de análisis sintáctico de descendencia recursiva por un enfoque similar a Unix (sin embargo clásico) de emplear lex y yacc . Recientemente, una implementación ( PL / 0 Language Tools ) de esta manera también ha combinado conceptos modernos como la orientación a objetos y los patrones de diseño con un lenguaje de scripting moderno ( Python ), lo que permite a los estudiantes consumir el texto fuente de la implementación en un estilo de programación contemporáneo. .
Construcción del compilador
En diciembre de 1976, Wirth escribió un pequeño folleto sobre la construcción del compilador, que contenía el código fuente completo del compilador PL / 0. Las reglas de sintaxis anteriores se tomaron de esta primera edición del libro Compilerbau de Wirth . [1] En ediciones posteriores de este libro (bajo la influencia de su investigación en curso) Wirth cambió la sintaxis de PL / 0. Cambió la ortografía de las palabras clave como const
y procedure
a mayúsculas. Este cambio hizo que PL / 0 se pareciera más a Modula-2 . Al mismo tiempo, el amigo y colaborador de Wirth, CAR Hoare, estaba trabajando en su influyente concepto de procesos secuenciales de comunicación , que utilizaba el signo de exclamación . y el signo de interrogación ? para denotar primitivas de comunicación. Wirth agregó ambos símbolos al lenguaje PL / 0, pero no mencionó su semántica en el libro.
Ejemplos de
El siguiente ejemplo está tomado de un lenguaje tan extendido llamado PL / 0E. [2] Este programa genera los cuadrados de los números del 1 al 10. La mayoría de los cursos de construcción de compiladores actuales han reemplazado el signo de exclamación con el WriteLn
procedimiento.
VAR x , squ ;PROCEDIMIENTO cuadrado ; COMIENZO squ : = x * x FIN ;EMPEZAR x : = 1 ; WHILE x <= 10 DO COMENZAR LLAMADA cuadrado ; ! squ ; x : = x + 1 FIN FIN .
El siguiente programa imprime los números primos del 1 al 100. La instrucción de escritura corresponde a '!' declaración en la sintaxis EBNF anterior.
const max = 100 ; var arg , ret ;el procedimiento es de primera ; var i ; comenzar ret : = 1 ; i : = 2 ; mientras i < arg do comenzar si arg / i * i = arg luego comenzar ret : = 0 ; i : = arg end ; i : = i + 1 final final ;procedimientos primos ; comenzar arg : = 2 ; while arg < max do begin call isprime ; si ret = 1 entonces escribe arg ; arg : = arg + 1 end end ;llamar primos .
El siguiente ejemplo fue tomado de la segunda edición del libro Compilerbau de Wirth, [1] que apareció en 1986 en Alemania.
VAR x , y , z , q , r , n , f ;PROCEDIMIENTO multiplicar ; VAR a , b ; EMPEZAR a : = x ; b : = y ; z : = 0 ; WHILE b > 0 DO COMENZAR SI ODD b ENTONCES z : = z + una ; a : = 2 * a ; b : = b / 2 FIN FIN ;PROCEDIMIENTO dividir ; VAR w ; COMIENZO r : = x ; q : = 0 ; w : = y ; MIENTRAS w <= r DO w : = 2 * w ; WHILE w > y DO COMENZAR q : = 2 * q ; w : = w / 2 ; SI w <= r ENTONCES EMPIEZA r : = r - w ; q : = q + 1 FIN FIN FIN ;PROCEDIMIENTO gcd ; VAR f , g ; COMIENZO f : = x ; g : = y ; WHILE f # g DO COMENZAR IF f < g ENTONCES g : = g - f ; SI g < f ENTONCES f : = f - g FIN ; z : = f FIN ;PROCEDIMIENTO hecho ; EMPEZAR SI n > 1 ENTONCES EMPIEZA f : = n * f ; n : = n - 1 ; CALL fact END END ;EMPEZAR ? x ; ? y ; LLAME multiplicar ; ! z ; ? x ; ? y ; LLAME dividir ; ! q ; ! r ; ? x ; ? y ; LLAME gcd ; ! z ; ? n ; f : = 1 ; LLAMAR hecho ; ! f FIN .
Oberon-0
En la tercera y última edición de su libro sobre construcción de compiladores, Wirth reemplazó PL / 0 con Oberon-0. El lenguaje Oberon-0 es mucho más complejo que PL / 0. Por ejemplo, Oberon-0 ofrece matrices, registros, declaraciones de tipo y parámetros de procedimiento. El editor de los libros de Wirth (Addison-Wesley) ha decidido eliminar gradualmente todos sus libros, pero Wirth ha publicado ediciones revisadas de su libro a partir de 2004. [3] A partir de agosto de 2017[actualizar], la revisión más reciente disponible es de mayo de 2017. [4] [5]
Ver también
Notas
- ↑ a b Wirth, 1986
- ^ PL / 0E Archivado el 21 de febrero de 2012 en la Wayback Machine.
- ^ La tercera edición revisada Archivado 2017-02-17 en Wayback Machine (2005) de Compiler Construction , Niklaus Wirth, 1996, ISBN 0-201-40353-6 nunca ha visto la imprenta, pero está disponible en línea.
- ^ Wirth, Niklaus (28 de mayo de 2017). "Construcción del compilador" . Consultado el 25 de agosto de 2017 .
- ^ Wirth, Niklaus (18 de agosto de 2017). "news.txt" . Archivado desde el original el 25 de agosto de 2017 . Consultado el 25 de agosto de 2017 .
Referencias
- Liffick, Blaise W., Ed (1979), El libro de bytes de Pascal , ISBN 0-07-037823-1
- Wirth, Niklaus (1975), Algoritmos + Estructuras de datos = Programas , ISBN 0-13-022418-9
- Wirth, Niklaus (1986), Compilerbau , BG Teubner, Stuttgart ISBN 3-519-32338-9
enlaces externos
- El compilador de la primera edición del libro Compilerbau , escrito en Pascal
- El intérprete del libro "Algoritmos + Estructuras de datos = Programas", escrito en Pascal
- Desarrollo de un compilador de estilo PL / 0 basado en 'Construcción de compilador' escrito en Mocka (Modula-2 para Linux)
- Un artículo que explica el uso de PL / 0 en la Universidad de Rochester
- La página de inicio del libro de referencia PL / 0, "Algoritmos + Estructuras de datos = Programas" [1]
- http://sourceforge.net/projects/pl0-compiler (escrito en C / C ++, usa marco QT)
- https://modernc.org/pl0 (escrito en Go, se ejecuta en terminal, multiplataforma)
- https://github.com/dodobyte/plzero (un compilador muy pequeño produce un ejecutable de Windows)
- https://github.com/MarcRochkind/pl0compiler (compilador para IBM 701 escrito en C; genera ensamblador 701)