La historia del lenguaje de programación Scheme comienza con el desarrollo de los primeros miembros de la familia de lenguajes Lisp durante la segunda mitad del siglo XX. Durante el período de diseño y desarrollo de Scheme, los diseñadores del lenguaje Guy L. Steele y Gerald Jay Sussman publicaron una influyente serie de notas de inteligencia artificial del Instituto Tecnológico de Massachusetts (MIT) conocidas como Lambda Papers (1975-1980). Esto dio lugar al crecimiento de la popularidad del lenguaje y a la era de la estandarización a partir de 1990. Gran parte de la historia de Scheme ha sido documentada por los propios desarrolladores. [1]
El desarrollo de Scheme estuvo fuertemente influenciado por dos predecesores que eran bastante diferentes entre sí: Lisp proporcionó su semántica y sintaxis generales, y ALGOL proporcionó su alcance léxico y estructura de bloques. Scheme es un dialecto de Lisp, pero Lisp ha evolucionado; los dialectos de Lisp de los que evolucionó Scheme (aunque eran los más utilizados en ese momento) son bastante diferentes de cualquier Lisp moderno.
Lisp fue inventado por John McCarthy en 1958 mientras trabajaba en el Instituto Tecnológico de Massachusetts (MIT). McCarthy publicó su diseño en un artículo en Communications of the ACM en 1960, titulado "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, parte I" [2] (la parte II nunca se publicó). Demostró que con unos pocos operadores simples y una notación para funciones, se puede construir un lenguaje Turing-completo para algoritmos.
El uso de expresiones-s que caracterizan la sintaxis de Lisp fue inicialmente pensado como una medida provisoria a la espera del desarrollo de un lenguaje que empleara lo que McCarthy llamó " expresiones-m ". Como ejemplo, la expresión-m car[cons[A,B]]
es equivalente a la expresión-s (car (cons A B))
. Sin embargo, las expresiones-s se hicieron populares y los muchos intentos de implementar expresiones-m no lograron imponerse.
La primera implementación de Lisp fue en un IBM 704 por Steve Russell , quien leyó el artículo de McCarthy y codificó la función eval que describió en código de máquina. Los nombres familiares (pero desconcertantes para los recién llegados) CAR y CDR utilizados en Lisp para describir el elemento de cabecera de una lista y su cola, evolucionaron a partir de dos comandos de lenguaje ensamblador del IBM 704 : Contents of Address Register y Contents of Decrement Register, cada uno de los cuales devolvía el contenido de un registro de 15 bits correspondiente a segmentos de una palabra de instrucción del IBM 704 de 36 bits .
El primer compilador Lisp completo, escrito en Lisp, fue implementado en 1962 por Tim Hart y Mike Levin en el MIT. [3] Este compilador introdujo el modelo Lisp de compilación incremental, en el que las funciones compiladas e interpretadas pueden mezclarse libremente.
Las dos variantes de Lisp más significativas en el desarrollo de Scheme fueron desarrolladas en el MIT: LISP 1.5 [4] desarrollado por McCarthy y otros, y Maclisp [5] – desarrollado para el Proyecto MAC del MIT , un descendiente directo de LISP 1.5, que se ejecutaba en los sistemas PDP-10 y Multics .
Desde sus inicios, Lisp estuvo estrechamente vinculado con la comunidad de investigación de inteligencia artificial (IA), especialmente en PDP-10 . El tamaño de palabra de 36 bits de PDP-6 y PDP-10 estuvo influenciado por la utilidad de tener dos punteros Lisp de 18 bits en una palabra. [6]
ALGOL 58 , que originalmente se llamaría IAL (por sus siglas en inglés, International Algorithmic Language), fue desarrollado conjuntamente por un comité de científicos informáticos europeos y estadounidenses en una reunión en 1958 en la ETH de Zúrich . ALGOL 60 , una revisión posterior desarrollada en la reunión ALGOL 60 en París y ahora comúnmente llamada ALGOL , se convirtió en el estándar para la publicación de algoritmos y tuvo un profundo efecto en el desarrollo futuro de los lenguajes, a pesar de la falta de éxito comercial del lenguaje y sus limitaciones. Tony Hoare ha señalado: "He aquí un lenguaje tan adelantado a su tiempo que no solo fue una mejora con respecto a sus predecesores sino también a casi todos sus sucesores". [7]
ALGOL introdujo el uso de la estructura de bloques y el alcance léxico. También fue conocido por su difícil mecanismo de paso de parámetros predeterminados de llamada por nombre , que se definió de modo que requiriera la sustitución textual de la expresión que representa el parámetro de trabajo en lugar del parámetro formal durante la ejecución de un procedimiento o función, lo que provocó que se volviera a evaluar cada vez que se hiciera referencia a él durante la ejecución. Los implementadores de ALGOL desarrollaron un mecanismo al que llamaron thunk , que capturaba el contexto del parámetro de trabajo, lo que permitía evaluarlo durante la ejecución del procedimiento o función.
En 1971, Sussman, Drew McDermott y Eugene Charniak habían desarrollado un sistema llamado Micro-Planner , que era una implementación parcial y algo insatisfactoria del ambicioso proyecto Planner de Carl Hewitt . Sussman y Hewitt trabajaron junto con otros en Muddle, posteriormente rebautizado como MDL , un Lisp extendido que formaba parte del proyecto de Hewitt. En 1972, Drew McDermott y Sussman desarrollaron el lenguaje basado en Lisp Conniver , que revisó el uso del retroceso automático en Planner, que consideraban improductivo. Hewitt dudaba de que la "estructura de control peluda" de Conniver fuera una solución a los problemas con Planner. Pat Hayes comentó: "Su solución [de Sussman y McDermott], dar al usuario acceso a las primitivas de implementación de Planner, es, sin embargo, un paso atrás (¿cuál es la semántica de Conniver?)" [8]
En noviembre de 1972, Hewitt y sus estudiantes inventaron el modelo Actor de computación como solución a los problemas con Planner. [9] Se desarrolló una implementación parcial de Actors llamada Planner-73 (más tarde llamada PLASMA). Steele, entonces estudiante de posgrado en el MIT, había estado siguiendo estos desarrollos, y él y Sussman decidieron implementar una versión del modelo Actor en su propio "pequeño Lisp" desarrollado en Maclisp , para comprender mejor el modelo. Usando esta base, comenzaron a desarrollar mecanismos para crear actores y enviar mensajes. [10]
El uso del alcance léxico de PLASMA era similar al del cálculo lambda . Sussman y Steele decidieron intentar modelar a los actores en el cálculo lambda. Llamaron a su sistema de modelado Schemer, y finalmente lo cambiaron a Scheme para adaptarse al límite de seis caracteres del sistema de archivos ITS en su DEC PDP-10 . Pronto concluyeron que los actores eran esencialmente cierres que nunca regresan sino que invocan una continuación , y por lo tanto decidieron que el cierre y el actor eran, para los fines de su investigación, conceptos esencialmente idénticos. Eliminaron lo que consideraban código redundante y, en ese punto, descubrieron que habían escrito un dialecto muy pequeño y capaz de Lisp. Hewitt siguió siendo crítico de la "estructura de control peluda" en Scheme [11] [12] y consideró que los primitivos (por ejemplo, START!PROCESS
, STOP!PROCESS
, y EVALUATE!UNINTERRUPTIBLY
) utilizados en la implementación de Scheme eran un paso atrás.
25 años después, en 1998, Sussman y Steele reflexionaron que el minimalismo de Scheme no era un objetivo de diseño consciente, sino más bien el resultado no deseado del proceso de diseño. “En realidad estábamos tratando de construir algo complicado y descubrimos, por casualidad, que habíamos diseñado accidentalmente algo que cumplía con todos nuestros objetivos pero que era mucho más simple de lo que habíamos previsto... nos dimos cuenta de que el cálculo lambda, un formalismo pequeño y simple, podía servir como núcleo de un lenguaje de programación poderoso y expresivo”. [10]
Por otra parte, Hewitt se mantuvo crítico con el cálculo lambda como base para la computación, escribiendo: "La situación actual es que el cálculo lambda es capaz de expresar algunos tipos de estructuras de control secuenciales y paralelas pero, en general, no la concurrencia expresada en el modelo Actor. Por otro lado, el modelo Actor es capaz de expresar todo en el cálculo lambda y más". También ha sido crítico con aspectos de Scheme que se derivan del cálculo lambda, como la dependencia de funciones de continuación y la falta de excepciones. [13]
Entre 1975 y 1980, Sussman y Steele trabajaron en el desarrollo de sus ideas sobre el uso del cálculo lambda, las continuaciones y otros conceptos de programación avanzada como la optimización de la recursión de cola , y los publicaron en una serie de AI Memos que se han denominado colectivamente Lambda Papers . [14]
Scheme fue el primer dialecto de Lisp en elegir el ámbito léxico . También fue uno de los primeros lenguajes de programación después del lenguaje de definición de Reynolds [15] en admitir continuaciones de primera clase . Tuvo un gran impacto en el esfuerzo que llevó al desarrollo de su lenguaje hermano, Common Lisp , al que Guy Steele contribuyó. [16]
El lenguaje Scheme está estandarizado en el estándar oficial del Instituto de Ingenieros Eléctricos y Electrónicos (IEEE), [17] y un estándar de facto llamado Informe revisado sobre el lenguaje algorítmico Scheme (R n RS). El estándar más ampliamente implementado es R5RS (1998), [18] y un nuevo estándar, R6RS , [19] fue ratificado en 2007. [20] Además de los estándares RnRS también existen documentos de Solicitudes de implementación de Scheme , que contienen bibliotecas adicionales que pueden agregarse mediante implementaciones de Scheme.
{{cite web}}
: CS1 maint: bot: estado de URL original desconocido ( enlace )El proyecto PDP-6 comenzó a principios de 1963 como una máquina
de 24 bits
. Creció hasta los 36 bits para LISP, un objetivo de diseño.
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )