Articulo de referencia

POP-2

[[University of Sussex]]"},"released":{"wt":"{{Start date and age|1970}}"},"latest release version":{"wt":"1975"},"latest release date":{"wt":"{{Start date and age|1975}}"},"typ...

POP-2 (también llamado POP2 ) es un lenguaje de programación desarrollado alrededor de 1970 a partir del lenguaje anterior POP-1 (desarrollado por Robin Popplestone en 1968, originalmente llamado COWSEL ) por Robin Popplestone y Rod Burstall en la Universidad de Edimburgo . Se inspiró en diversas fuentes: los lenguajes Lisp y ALGOL 60 , e ideas teóricas de Peter J. Landin . Utilizaba un compilador incremental , lo que le otorgaba cierta flexibilidad , como permitir nuevas definiciones de funciones en tiempo de ejecución y la modificación de definiciones de funciones mientras se ejecuta un programa (ambas características de la compilación dinámica ), sin la sobrecarga de un lenguaje interpretado. [ 1 ]

Descripción

Pila

La sintaxis de POP-2 es similar a la de ALGOL , excepto que las asignaciones están en orden inverso: en lugar de escribir

a := 3;

uno escribe

3 -> a;

La razón de esto es que el lenguaje tiene una noción explícita de pila de operandos . Por lo tanto, la asignación previa se puede escribir como dos instrucciones separadas :

3;

que evalúa el valor 3 y lo deja en la pila, y

-> a;

que extrae el valor superior de la pila y lo asigna a la variable 'a'. De manera similar, la llamada a la función

f(x, y, z);

se puede escribir como

x, y, z; f();

(las comas y los puntos y comas son en gran medida intercambiables) o incluso

x, y, zf;

o

(x, y, z).f;

Debido al paradigma basado en pilas , no hay necesidad de distinguir entre sentencias y expresiones ; por lo tanto, las dos construcciones

si a > b entonces c -> e demás d -> e cerca;

y

si a > b entonces do demás d cerrar -> e;

son equivalentes (el uso de close, ya que aún endifno se había convertido en una notación común end-of-if-clause).

Matrices y funciones dobletes

No hay construcciones de lenguaje especiales para crear matrices o estructuras de registro como se entienden comúnmente: en cambio, estas se crean con la ayuda de funciones integradas especiales, por ejemplo, newarray[ 2 ] (para matrices que pueden contener cualquier tipo de elemento) y newanyarray[ 3 ] para crear tipos restringidos de elementos.

Por lo tanto, los accesores de elementos de matriz y campos de registro son simplemente casos especiales de una función doblete : esta es una función que tiene otra función adjunta como su actualizador , [ 4 ] que se llama en el lado receptor de una asignación. Por lo tanto, si la variable acontiene una matriz, entonces

3 -> a(4);

es equivalente a

actualizador(a)(3, 4);

La función integrada updaterdevuelve el actualizador del doblete. Por supuesto, updateres un doblete y se puede usar para cambiar el componente actualizador de un doblete.

Funciones

Las variables pueden contener valores de cualquier tipo, incluidas las funciones, que son objetos de primera clase. Por lo tanto, las siguientes construcciones

función max xy; si x > y entonces x sino y cerrar fin;

y

vars max; lambda xy; si x > y entonces x sino y cerrar fin -> máximo;

son equivalentes.

Una operación interesante sobre funciones es la aplicación parcial (a veces denominada currificación ). En la aplicación parcial, algunos de los argumentos más a la derecha de la función (los últimos que se colocan en la pila antes de que la función intervenga) se fijan a valores dados para producir una nueva función con menos argumentos, que es un cierre de la función original. Por ejemplo, consideremos una función para calcular polinomios generales de segundo grado:

función poly2 xabc; a * x * x + b * x + c fin;

Esto puede vincularse, por ejemplo, como

vars menos1cuadrado; poli2(% 1, -2, 1%) -> menos1cuadrado;

de tal manera que la expresión

menos1cuadrado(3)

Aplica el cierre de poly2 con tres argumentos congelados al argumento 3, devolviendo el cuadrado de (3 - 1), que es 4. La aplicación de la función parcialmente aplicada hace que los valores congelados (en este caso 1, -2, 1) se sumen a lo que ya esté en la pila (en este caso 3), después de lo cual se invoca la función original poly2. Luego usa los cuatro elementos superiores de la pila, produciendo el mismo resultado que

poli2(3, 1, -2, 1)

es decir

1*3*3 + (-2)*3 + 1

Definición de operador

En POP-2, fue posible definir nuevas operaciones (operadores en términos modernos). [ 5 ]

vars operación 3 +*; lambda xy; x * x + y * y fin -> no opera +*

La primera línea declara una nueva operación +* con precedencia (prioridad) 3. La segunda línea crea una función f(x,y)=x*x+y*y y la asigna a la operación +* recién declarada.

Historia

La versión original de POP-2 se implementó en una computadora Elliott 4130 en la Universidad de Edimburgo (con solo 64 KB de RAM, que se duplicó a 128 KB en 1972). [ 6 ]

El POP-2 fue adaptado a la serie ICT 1900 en un modelo 1909 en la Universidad de Lancaster por John Scott en 1968.

A mediados de la década de 1970, el POP-2 fue adaptado al BESM-6 (Sistema POPLAN).

En 1978, Hamish Dewar implementó una versión de POP-2 específicamente para su uso por estudiantes de pregrado de la Universidad de Edimburgo en la clase de IA2 (Inteligencia Artificial, segundo año) utilizando el sistema operativo EMAS . Esta implementación fue escrita desde cero en el lenguaje de programación de Edimburgo, IMP . [ 7 ]

Las versiones posteriores se implementaron para Computer Technology Limited (CTL) Modular One, PDP-10 y la serie ICL 1900 (que ejecutaban el sistema operativo George ). Julian Davies, en Edimburgo, implementó una versión extendida de POP-2, a la que denominó POP-10, en el ordenador PDP-10 con TOPS-10 . Este fue el primer dialecto de POP-2 que distinguía entre mayúsculas y minúsculas en los nombres de los identificadores, utilizaba minúsculas para la mayoría de los identificadores del sistema y admitía identificadores largos de más de 8 caracteres.

Poco después, Robert Rae y Allan Ramsay implementaron en Edimburgo una nueva versión conocida como WPOP (por WonderPop), en un proyecto financiado por un consejo de investigación. Esta versión introdujo espacios de direcciones restringidos, tipado sintáctico en tiempo de compilación (por ejemplo, para enteros y reales) y algunas construcciones de coincidencia de patrones para su uso con diversas estructuras de datos .

Paralelamente, Steve Hardy, de la Universidad de Sussex, implementó un subconjunto de POP-2, al que denominó POP-11 , que se ejecutaba en un ordenador PDP-11/40 de Digital Equipment Corporation (DEC). Originalmente, se diseñó para ejecutarse en el sistema operativo RSX-11D de DEC, en modo de tiempo compartido para la enseñanza, pero esto causó tantos problemas que se instaló y utilizó una versión temprana de Unix . Esta versión de Pop-11 se escribió en lenguaje ensamblador de Unix , y el código se compilaba incrementalmente a un bytecode intermedio que se interpretaba. Esta adaptación se completó alrededor de 1976, y como resultado, Pop-11 se utilizó en varios lugares con fines docentes. Para apoyar su función didáctica, se modificaron muchas de las características sintácticas de POP-2, por ejemplo, reemplazando function ... endy define ... enddefineañadiendo una mayor variedad de estructuras de bucle con corchetes de cierre que coincidieran con sus corchetes de apertura en lugar del uso de bucles closepara todos los bucles en POP-2. Pop-11 también introdujo un comparador de patrones para estructuras de lista, lo que facilitó enormemente la enseñanza de la programación de inteligencia artificial (IA).

Hacia 1980, Steve Hardy y John Gibson adaptaron Pop-11 a una computadora VAX-11/780 , y poco después fue reemplazado por un compilador incremental completo (que generaba código máquina en lugar de código intermedio interpretado). La existencia del compilador y todas sus subrutinas en tiempo de ejecución permitieron admitir extensiones de lenguaje mucho más ricas que las posibles con macros, y como resultado, Pop-11 fue utilizado (por Steve Hardy, Chris Mellish y John Gibson) para producir una implementación de Prolog , utilizando la sintaxis estándar de Prolog, y el sistema combinado se conoció como Poplog , al que posteriormente se añadieron Common Lisp y Standard ML . Esta versión fue adaptada más tarde a una variedad de máquinas y sistemas operativos, y como resultado, Pop-11 se convirtió en el dialecto dominante de POP-2, todavía disponible en el sistema Poplog.

Alrededor de 1986, una nueva empresa de IA, Cognitive Applications Ltd., colaboró ​​con miembros de la Universidad de Sussex para producir una variante de Pop-11 llamada AlphaPop, que funcionaba en ordenadores Apple Mac con gráficos integrados. Esta se utilizó en numerosos proyectos comerciales y para impartir clases de programación de IA en varias universidades. El hecho de que estuviera implementada en un dialecto primitivo de C, utilizando un compilador peculiar, dificultó enormemente su mantenimiento y actualización a nuevas versiones del sistema operativo Mac. Además, AlphaPop no era compatible con 32 bits debido al uso de bits de dirección altos como bits de etiqueta para indicar el tipo de objetos, lo que resultaba incompatible con el uso de memoria superior a 8 MB en los Macintosh posteriores.

Véase también

  • Lenguaje de programación POP-11
  • Entorno de programación Poplog

Referencias

General
  • Burstall, R.; Collins, J.; Popplestone, R. (1968). Programación en Pop-2 . Edimburgo: Edinburgh University Press.
  • Davies, DJM (1976). "Manual de usuario de POP-10". Computer Science Report (25).
  • Smith, R.; Sloman, A.; Gibson, J. (1992). "Soporte de máquina virtual de dos niveles de POPLOG para lenguajes interactivos". En D. Sleeman y N. Bernsen (eds.). Direcciones de investigación en ciencia cognitiva . Vol.  5: Inteligencia artificial. Lawrence Erlbaum Associates. págs. 203–231 . 
  • Referencias POP
En línea
  1. Burstall, RM ; Collins, JS; Popplestone, RJ (1968). Documentos POP-2 (PDF) . Londres: The Round Table.
  2. Rubinstein, Mark; Sloman, A. (octubre de 1985 – abril de 1989). "Ayuda a Newarray" . Universidad de Birmingham . Recuperado el 22 de marzo de 2024 .
  3. Hardy, Steven; Williams, John; Sloman, A. (enero de 1978 – abril de 1986). "Ayuda a Newanyarray" . Universidad de Birmingham . Recuperado el 22 de marzo de 2024 .
  4. Sloman, A. (abril de 1985). "Actualizador de ayuda" . Universidad de Birmingham . Recuperado el 21 de marzo de 2024 .
  5. Manual de referencia de POP-2 , página 217, y Una introducción al estudio de los lenguajes de programación, por David William Barron, página 75
  6. Dunn, Raymond D. (febrero de 1970). "Manual del usuario de POP-2/4100" (PDF) . Escuela de Inteligencia Artificial . Universidad de Edimburgo . Consultado el 3 de junio de 2022 .
  7. Dewar, Hamish. "Código fuente de EMAS Pop-2" .
  • El desarrollo inicial de POP ( Archivado el 29 de mayo de 2016 en Wayback Machine)
  • Computadoras y pensamiento: una introducción práctica a la inteligencia artificial.
  • Introducción al lenguaje de programación POP-2, por PM Burstall y JS Collins. Manual de referencia de POP-2, por PM Burstall y JS Collins.