Thursday, May 19, 2016

Programación lúdica: escriba un intérprete de Pilot



Pilot (Programmed Instruction, Learning, or Teaching) es un lenguaje simple, muy simple, de programación, el cual fue desarrollado en los años 60s del siglo pasado. Su idea era automatizar algunos sistemas para enseñanza/aprendizaje. A este tipo de programas se les llamó en su momento CAI (computer-assisted instruction). Fue desarrollado por John Amsden Srtarkweather, un profesor de psicología de la Universidad de California (San Francisco), su intención era la creación de pruebas de aprendizaje automatizadas llamadas "Computest".

La sintaxis de Pilot es casi trivial. Una línea en Pilot contiene (de izquierda a derecha), los siguientes elementos sintácticos:


  • Una etiqueta (opcional)
  • La letra de un comando
  • Una letra opcional Y (yes) o N (no)
  • Una expresión condicional opcional entre paréntesis
  • Dos puntos
  • Un operando o múltiples operandos delimitados por comas


Una etiqueta puede estar sola en una línea, sin necesariamente tener más código. La sintaxis para la etiqueta es un asterisco seguido de un identificador (una cadena alfanumérica con una letra como símbolo inicial).

Los posibles comandos son:

R - Las líneas que comienzan con R: indican un comentario que explica en general el código.

A - Acepta la entrada de datos del teclado, por ejemplo:

 R:La siguiente línea de entrada reemplaza el contenido del búffer de datos aceptados
 A:
 R:La siguiente línea acepta una respuesta del teclado y queda en la variable 'FREE'
 A:$FREE
 R:Las siguientes tres líneas de entrada se asignan a las variables 'X', 'Y' y 'Z'
 A:$X,$Y,$Z
 R:Una entrada de datos numéricos se define así, que en este caso queda en la variable "Q"
 A:#Q

C - calcula y asigna valores numéricos. La implementación original de Pilot sólo tiene aritmética entera (y no hay arreglos). Por ejemplo:

 R:Sacar el promedio de #X y #Y en #AM
 C:#AM=(#X+#Y)/2

D - Permite dimensionar arreglos en algunas implementaciones. Para este ejercicio no hay que hacerlo.

E - End. Regreso de una subrutina, o si es fuera de una subrutina, es el fin del programa. No se usa con operandos.

J - Brinca a una etiqueta. Por ejemplo:

 J:*RESTART

M - Verifica la cadena aceptada en la entrada de datos contra una variable o una cadena de caracteres. Por ejemplo:

 M:TRUTH,$MEXICO,YOUTH

Se regresa 'yes' o 'no' dependiendo si las dos variables son iguales o no. Cualquier instrucción que tenga una Y seguido de una letra de comando es procesada si

N - Equivalente a TN

R - para comentarios

T - Operando Type como salida. Ejemplo:

 R:Manda una cadena a la salida
 T:Gracias por su apoyo.
 R:Manda una variable a la salida
 T:Gracias, $NAME.

U - Haz una llamada a una subrutina. Esta empieza con una etiqueta y termina con un comando E:. Por ejemplo:

 R:Llama a la subrutina empezando en la etiqueta *INITIALIZE
 U:*INITIALIZE

Y - Equivalente a TY (que se usa cuando el resultado de un condicional es Y(es))

Un programa ejemplo:

T: Hello, welcome to my program. Please enter a number
A: #num
C: #ans = #num + 7
T: You entered #num. #num + 7 = #ans


Como puede verse, la creación de un intérprete que ejecute programas escritos en Pilot no parece ser muy complicado. Una taza de la Morsa al que implemente mejor este pequeño lenguaje que, desde luego, parece verse superado ante otras muchísimas iniciativas. En cualquier caso es un ejercicio sencillo pero interesante, el cual plantea algunos elementos que deben contemplarse cuando se escriben intérpretes.



Referencias:

Wikipedia 
RPilot 
Byte Magazine (How To Write a Language in 256 Words or Less) 

No comments: