POP-2 (también conocido como 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 basó en muchas fuentes: los lenguajes LISP y ALGOL 60 , y las ideas teóricas de Peter J. Landin . Usó un compilador incremental , lo que le dio algo de la flexibilidad de un lenguaje interpretado., incluido el permitir nuevas definiciones de funciones en tiempo de ejecución y la modificación de las definiciones de funciones mientras se ejecuta un programa (las cuales son características de la compilación dinámica ), sin la sobrecarga de un lenguaje interpretado. [1]
Descripción
Apilar
La sintaxis de POP-2 era similar a la de Algol, excepto que las asignaciones eran al revés: en lugar de escribir
a: = 3;
uno escribió
3 -> a;
La razón de esto fue que el lenguaje tenía una noción explícita de una pila de operandos ; por lo tanto, la asignación anterior podría escribirse como dos declaraciones separadas:
3;
que evaluó el valor 3 y lo dejó en la pila, y
-> a;
que sacó el valor superior de la pila y lo asignó a la variable 'a'. Del mismo modo, la llamada a la función
f (x, y, z);
podría escribirse como
x, y, z; F();
(las comas y el punto y coma son en gran parte intercambiables) o incluso
x, y, zf;
o
(x, y, z) .f;
Debido al paradigma basado en pilas, no era necesario distinguir entre declaraciones y expresiones ; así, los dos constructos
si a> b entonces c -> e demás d -> e cerca;
y
si a> b entonces C demás D cerrar -> e;
eran equivalentes (tenga en cuenta el uso de close
, ya que endif
aún no se había inventado).
Matrices y funciones de doblete
No había construcciones de lenguaje especiales para crear matrices o estructuras de registro como se entienden comúnmente: en cambio, estas se crearon con la ayuda de funciones integradas especiales, por ejemplo, newarray (para matrices que podrían contener cualquier tipo de elemento) y newanyarray para crear tipos restringidos de artículos.
Por lo tanto, los accesores de campo de registro y elemento de matriz eran simplemente casos especiales de una función de doblete : esta era una función que tenía otra función adjunta como su actualizador , que se llamaba en el lado receptor de una asignación. Por lo tanto, si la variable a
contenía una matriz, entonces
3 -> a (4);
era equivalente a
actualizador (a) (3, 4);
la función incorporada updater
devuelve el actualizador del doblete. Por supuesto, updater
era en sí mismo un doblete y podría usarse para cambiar el componente de actualización de un doblete.
Funciones
Las variables pueden contener valores de cualquier tipo, incluidas funciones, que son objetos de primera clase. Por lo tanto, las siguientes construcciones
función max xy; si x> y entonces x si no y cerrar el final;
y
vars max; lambda xy; si x> y entonces x si no y cerrar fin -> max;
eran equivalentes.
Una operación interesante sobre las funciones fue la aplicación parcial (a veces denominada " curado "). En la aplicación parcial, algunos de los argumentos más a la derecha de la función (que serían los últimos colocados en la pila antes de que la función esté involucrada) se congelaron a valores dados, para producir una nueva función de menos argumentos, que es un cierre del función original. Por ejemplo, considere una función para calcular polinomios generales de segundo grado:
función poly2 xabc; a * x * x + b * x + c final;
Esto podría estar ligado, por ejemplo, como
vars less1squared; poli2 (% 1, -2, 1%) -> less1squared;
tal 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 aplicada parcialmente provoca los valores congelados (en este caso 1, -2, 1 ) para agregarlo 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). [2]
operación vars 3 + *; lambda xy; x * x + y * y final -> nonop + *
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, duplicada a 128 KB en 1972).
A mediados de la década de 1970, POP-2 se transfirió a BESM-6 (sistema POPLAN).
Las versiones posteriores se implementaron para CTL Modular One, PDP-10 , serie ICL 1900 (ejecutando el sistema operativo George). Julian Davies, en Edimburgo, implementó una versión extendida de POP-2, que llamó POP-10 en la computadora PDP-10 que ejecuta TOPS-10 . Este fue el primer dialecto de POP-2 que trató el caso como significativo en los nombres de los identificadores, usó minúsculas para la mayoría de los identificadores del sistema y admitió identificadores largos con más de 8 caracteres.
Poco después de eso, Robert Rae y Allan Ramsay en Edimburgo implementaron una nueva implementación conocida como WPOP (para WonderPop) en un proyecto financiado por el consejo de investigación. Esa versión introdujo espacios de direcciones enjaulados, algunos tipos sintácticos en tiempo de compilación (por ejemplo, para enteros y reales), así como algunas construcciones de coincidencia de patrones para su uso con una variedad de estructuras de datos.
Paralelamente, Steve Hardy de la Universidad de Sussex implementó un subconjunto de POP-2, al que llamó POP-11, que se ejecutaba en una computadora DEC PDP-11/40. Originalmente fue diseñado para ejecutarse en el sistema operativo DEC RSX-11D, en modo de tiempo compartido para la enseñanza, pero eso causó tantos problemas que en su lugar se instaló y utilizó una versión anterior de Unix . Esa versión de Pop-11 se escribió en ensamblador Unix, y el código se compiló de forma incremental en un código de bytes intermedio que se interpretó. Ese puerto se completó alrededor de 1976 y, como resultado, el Pop-11 se utilizó en varios lugares para la enseñanza. Para respaldar su función de enseñanza, se modificaron muchas de las características sintácticas de POP-2, por ejemplo, reemplazando function ... end with define ... enddefine y agregando una variedad más amplia de construcciones de bucle con corchetes de cierre para que coincidan con sus corchetes de apertura en lugar de el uso de cerrar para todos los bucles en POP-2. Pop-11 también introdujo un comparador de patrones para estructuras de listas, lo que facilita mucho la enseñanza de la programación de IA.
Alrededor de 1980, Steve Hardy y John Gibson portaron Pop-11 a una computadora VAX-11/780 , y poco después fue reemplazado por un compilador incremental completo (produciendo código de máquina en lugar de un código intermedio interpretado). La existencia del compilador y todas sus subrutinas en tiempo de ejecución hizo posible admitir extensiones de lenguaje mucho más ricas que las que eran posibles con Macros y, como resultado, se utilizó Pop-11 (por Steve Hardy, Chris Mellish y John Gibson) para producir un la implementación de Prolog , utilizando la sintaxis estándar de Prolog, y el sistema combinado se conoció como Poplog , al que luego se agregaron Common Lisp y Standard ML . Esta versión se trasladó 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 compañía de inteligencia artificial, Cognitive Applications Ltd., colaboró con miembros de la universidad de Sussex para producir una variante de Pop-11 llamada AlphaPop que se ejecuta en computadoras Apple Mac, con gráficos integrados. Esto se utilizó para una serie de proyectos comerciales, así como para enseñar programación de IA en varias universidades. El hecho de que se implementó en un dialecto temprano de C, usando un compilador idiosincrásico hizo que fuera muy difícil de mantener y actualizar a nuevas versiones del sistema operativo Mac. Además de esto, AlphaPop no estaba "limpio de 32 bits" debido al uso de bits de dirección alta como "bits de etiqueta" para indicar el tipo de objetos, que era incompatible con el uso de memoria por encima de 8 Mb en Macintosh posteriores.
Ver también
- Lenguaje de programación POP-11
- Entorno de programación poplog
Referencias
- Burstall, R .; Collins, J .; Popplestone, R. (1968). Programación en Pop-2 . Edimburgo: Edinburgh University Press.
- Davies, DJM (1976). "Manual del usuario de POP-10". Informe de Ciencias de la Computación (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 (ed.). Direcciones de investigación en ciencia cognitiva . 5: Inteligencia artificial. Lawrence Erlbaum Associates. págs. 203–231.
- Referencias POP
enlaces externos
Referencias
- ^ Burstall, RM ; Collins, JS; Popplestone, RJ (1968). Papeles POP-2 (PDF) . Londres: la mesa redonda.
- ^ Manual de referencia de POP-2 , página 217, e Introducción al estudio de lenguajes de programación, por David William Barron, página 75