Peter J. Landin y los 700 próximos lenguajes de programación

Peter J. Landin

Todo el mundo tiene sus ídolos, gente a la que admira por sus acciones o sus palabras. Uno de los míos es Peter J. Landin un señor inglés que nació en 1930 y se nos fué en 2009, y que en 1963 sentó las bases de muchas cosas importantes en la programación, que marcaron investigaciones en software durante las siguientes décadas. Un resumen biográfico genial, y emotivo, sobre Peter Landin y su importancia en el mundo del software es el artículo que Olivier Danvy le dedicó tras su muerte.

Peter J. Landin en una foto de Wikipedia

Tengo la sensación de que en España se le conoce poco. Creo que se estudia en algunas asignaturas de informática, y espero que algún alumno aventajado se anime a escribir entradas en español en la Wikipedia sobre el operador J, sobre continuaciones o sobre él mismo, creo que serían unos buenos ejercicios.

La evaluación mecánica de expresiones

Los años sesenta y setenta del siglo pasado debieron ser, pienso yo, muy divertidos. Por aquél entonces se empezaron a construir los lenguajes de programación de más alto nivel, muchos de los cuales existen todavía hoy, cincuenta años después.

Quizá el artículo más importante de Landin fue "La evaluación mecánica de expresiones", o, en inglés, The mechanical evaluation of expressions (The Computer Journal (British Computer Society), 1964, PDF). Una joya que todavía hoy es una lectura divertida.

El artículo relaciona las expresiones de un lenguaje de programación con el cálculo lambda (un sistema formal de lógica matemática para razonar sobre llamdas a funciones). En el artículo se presenta la máquina SECD, un "invento" brillante por su simplicidad (ver más abajo), y se sientan las bases de las clausuras (closures, en inglés), de bloques de instrucciones para retrasar los cálculos, de evaluación parcial, de los índices de Brujin y de muchas cosas más que son habituales en los lenguajes de programación de hoy en día.

La máquina SECD

La máquina SECD de Landin fue, creo, la primera máquina abstracta (y máquina virtual) utilizada para construir un lenguaje de programación.

Esta máquina consta de cuatro listas enlazadas: S (stack o Pila), E (environment o entorno), C (code o código, con las instrucciones) y D (dump, usada como un espacio de almacenamiento adicional).

Sobre estas cuatro listas enlazadas se definen diez instrucciones básicas muy sencillas, que permiten modificar la información entre estas listas, cambiando cosas de una lista a la otra. Por ejemplo, la instrucción 'nil' añade un elemento vacío a la lista 'S', y así con el resto de las instrucciones de la máquina. (La máquina virtual de Java dispone de la instrucción 'aconst_null', que hace lo mismo).

La máquina SECD es, creo yo, una verdadera virguería. Es realmente simple y, sin embargo, permite construir lenguajes de programación potentísimos. La máquina no permite recursividad final, porque las pilas crecerían sin límite, aunque hay variaciones de la máquina que añaden instrucciones especiales que sí permiten recursividad final, como la máquina TR-SECD recursiva final, de Ramsdell, MITRE Corporation, 1996-1997.

Con esta máquina tan sencilla uno podría construir, por ejemplo, un intérprete de Scheme, de Lisp, o de Lua, con soporte para clausuras y continuaciones.

Construir una máquina SECD es relativamente sencillo en cualquier lenguaje de programación de hoy en día. Creo que es un buen ejercicio para los alumnos de informática. He aquí una pequeña lista de máquinas SECD construidas en diferentes lenguajes de programación:

y posiblemente en muchísimos lenguajes de programación más.

Los 700 siguientes lenguajes de programación

En 1966 Landin publicó The Next 700 Programming Languages (PDF) (CACM 9(3):157–65, March 1966.) en el que presentaba el lenguaje de programación ISWIM, o "If you See What I Mean", o "Si comprendes lo que quiero decir". En el artículo se sentaban las bases para los lenguajes específicos de dominio, y, quizá, para la "lingüística" en los lenguajes de programación. Se mostró la importancia de separar la sintaxis del lenguaje (un aspecto meramente estético) de cómo funcionaba por dentro (una máquina virtual razonable en base al cálculo lambda).

Desde entonces los programadores han estado discutiendo sobre si los puntos y comas son o no necesarios en Javascript, o en Lua, o de la sintaxis de las clausuras de Java es o no adecuada. Aspectos meramente estéticos que no afectan al funcionamiento de la máquina virtual que los hace funcionar.

En resumen

La verdad es que muchos de los lenguajes de programación de hoy en día podrían construirse con la máquina SECD de Landin (o alguna de sus primas hermanas), y reducirse de algún modo a su lenguaje de programación ISWIM.

Cuando programemos en Haskell, Lua, Scheme, Javascript, Clojure, Java, C#, Lisp u otros "700 otros lenguajes de programación" recordemos que en general no son son más que variaciones estéticas de aquél lenguaje ISWIM de Landin, que se transforman en instrucciones para una máquina virtual (JVM, Lua, CLR o Dalvik, por ejemplo) que son, también, una variación más o menos compleja de aquella máquina SECD que Landin inventó hace hoy unos cincuenta años.

Desde entonces todo ha cambiado, y todo sigue igual.