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 de lenguaje Guy L. Steele y Gerald Jay Sussman publicaron una influyente serie de notas de inteligencia artificial del Instituto de Tecnología de Massachusetts (MIT) conocidas como Lambda Papers (1975-1980). Esto resultó en el crecimiento de la popularidad en el idioma y 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]
Prehistoria
El desarrollo de Scheme estuvo fuertemente influenciado por dos predecesores que eran bastante diferentes entre sí: Lisp proporcionó su semántica y sintaxis general, y ALGOL proporcionó su alcance léxico y estructura de bloques. Scheme es un dialecto de Lisp pero Lisp ha evolucionado; los dialectos Lisp de los que evolucionó Scheme, aunque estaban en la corriente principal en ese momento, son bastante diferentes de cualquier Lisp moderno.
Ceceo
Lisp fue inventado por John McCarthy en 1958 mientras estaba en el Instituto de Tecnología 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 computación por máquina, Parte I" [2] (la Parte II nunca se publicó). Mostró que con unos pocos operadores simples y una notación para funciones, se puede construir un lenguaje completo de Turing para algoritmos.
El uso de expresiones-s que caracterizan la sintaxis de Lisp fue inicialmente pensado como una medida provisional pendiente del desarrollo de un lenguaje que emplee 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 demostraron ser populares y los muchos intentos de implementar expresiones-m fallaron.
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 máquina. Los nombres familiares (pero desconcertantes para los recién llegados) CAR y CDR utilizados en Lisp para describir el elemento principal de una lista y su cola, evolucionaron a partir de dos comandos en lenguaje ensamblador IBM 704 : Contenido del registro de direcciones y Contenido del registro de decremento, cada uno de los cuales regresó. el contenido de un registro de 15 bits correspondiente a segmentos de una palabra de instrucción 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 entremezclarse libremente.
Las dos variantes de Lisp más importantes 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 ejecutó en los sistemas PDP-10 y Multics .
Desde sus inicios, Lisp estuvo estrechamente relacionado 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 fue influenciado por la utilidad de tener dos punteros Lisp de 18 bits en una palabra. [6]
ALGOL
ALGOL 58 , originalmente llamado IAL para "Lenguaje algorítmico internacional", fue desarrollado conjuntamente por un comité de científicos informáticos europeos y estadounidenses en una reunión en 1958 en ETH Zurich . 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 efecto profundo en el desarrollo futuro del lenguaje, a pesar de la falta de éxito comercial del lenguaje y sus limitaciones. Tony Hoare ha comentado: "Aquí hay 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 estructura de bloques y alcance léxico. También fue notorio por su difícil llamada por el mecanismo de paso de parámetro predeterminado de nombre , que se definió para requerir 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 hace que sea re -evaluado cada vez que se hace referencia a él durante la ejecución. Los implementadores de ALGOL desarrollaron un mecanismo al que llamaron procesador , que capturaba el contexto del parámetro de trabajo, lo que permitía evaluarlo durante la ejecución del procedimiento o función.
Carl Hewitt, el actor modelo y el nacimiento de Scheme
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 juntos junto con otros en Muddle, más tarde rebautizado como MDL , un Lisp extendido que formó un componente del proyecto de Hewitt. Drew McDermott y Sussman desarrollaron en 1972 el lenguaje Conniver basado en Lisp , que revisó el uso del retroceso automático en Planner, que pensaban que era improductivo. Hewitt tenía dudas de que la "estructura de control peluda" en Conniver fuera una solución a los problemas con Planner. Pat Hayes comentó: "Su solución [de Sussman y McDermott], para dar al usuario acceso a las primitivas de implementación de Planner, es sin embargo, algo así como un paso retrógrado (¿qué es la semántica de Conniver?)" [8]
En noviembre de 1972, Hewitt y sus estudiantes inventaron el modelo de computación Actor como una solución a los problemas con Planner. [9] Se desarrolló una implementación parcial de Actors llamada Planner-73 (más tarde llamado 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 "Lisp diminuto" desarrollado en Maclisp , para comprender mejor el modelo. Sobre esta base, comenzaron a desarrollar mecanismos para crear actores y enviar mensajes. [10]
El uso de PLASMA del alcance léxico fue similar al cálculo lambda . Sussman y Steele decidieron intentar modelar actores en el cálculo lambda. Llamaron a su sistema de modelado Schemer, y finalmente lo cambiaron a Scheme para ajustarse al límite de seis caracteres en el 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 momento, descubrieron que habían escrito un dialecto muy pequeño y capaz de Lisp. Hewitt sigue siendo crítica de la "estructura hairy control" en el Esquema [11] [12] y consideradas primitivas (por ejemplo, START!PROCESS
, STOP!PROCESS
, y EVALUATE!UNINTERRUPTIBLY
) utilizada en la aplicación Esquema ser un paso hacia atrás.
25 años después, en 1998, Sussman y Steele reflejaron que el minimalismo de Scheme no era un objetivo de diseño consciente, sino el resultado no deseado del proceso de diseño. "De hecho, 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 pretendíamos ... nos dimos cuenta de que el cálculo lambda, un formalismo pequeño y simple, podía sirven como el núcleo de un lenguaje de programación poderoso y expresivo ". [10]
Por otro lado, Hewitt se mantuvo crítico con el cálculo lambda como base para la escritura computacional "La situación real es que el cálculo λ 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 λ y más ". También ha criticado aspectos de Scheme que se derivan del cálculo lambda, como la dependencia de las funciones de continuación y la falta de excepciones. [13]
Los papeles Lambda
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 avanzados de programación, como la optimización de la recursividad de la cola , y los publicaron en una serie de Memos de IA que se han denominado colectivamente Papeles Lambda . [14]
Lista de trabajos
- 1975: Esquema: un intérprete para el cálculo lambda extendido
- 1976: Lambda: el imperativo definitivo
- 1976: Lambda: el declarativo definitivo
- 1977: Desmentir el mito de la 'llamada a procedimiento costoso', o las implementaciones de llamadas a procedimiento consideradas dañinas, o Lambda: el GOTO definitivo
- 1978: El arte del intérprete o el complejo de modularidad (partes cero, uno y dos)
- 1978: CONEJO: un compilador para SCHEME
- 1979: Diseño de procesadores basados en LISP, o SCHEME: un dialecto de LISP, o memorias finitas consideradas perjudiciales, o LAMBDA: el código de operación definitivo
- 1980: Optimización del compilador basada en ver LAMBDA como RENAME + GOTO
- 1980: Diseño de un procesador basado en Lisp
Influencia
Scheme fue el primer dialecto de Lisp en elegir alcance léxico . También fue uno de los primeros lenguajes de programación después del lenguaje de definición de Reynold [15] en admitir continuaciones de primera clase . Tuvo un gran impacto en el esfuerzo que condujo al desarrollo de su lenguaje hermano, Common Lisp , al que Guy Steele contribuyó. [dieciséis]
Estandarización
El lenguaje del esquema 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 n revisado sobre el esquema de lenguaje algorítmico (R n RS). El estándar más implementado es R5RS (1998), [18] y un nuevo estándar, R6RS , [19] fue ratificado en 2007. [20]
Cronología
Referencias
- ^ Steele, Guy (2006). "Historia del esquema" (presentación de diapositivas en PDF) . Laboratorios Sun Microsystems .
- ^ McCarthy, John . "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, parte I" . Archivado desde el original el 4 de octubre de 2013 . Consultado el 13 de octubre de 2006 .
- ^ Hart, Tim; Levin, Mike. "AI Memo 39, el nuevo compilador" (PDF) . Consultado el 13 de octubre de 2006 .[ enlace muerto permanente ]
- ^ McCarthy, John ; Abrahams, Paul W .; Edwards, Daniel J .; Hart, Timothy P .; Levin, Michael I. (1985). Manual del programador LISP 1.5 . Prensa del MIT . ISBN 978-0-262-13011-0.
- ^ "Manual de referencia de Maclisp" . 3 de marzo de 1979. Archivado desde el original el 14 de diciembre de 2007.
- ^ Hurley, Peter J. (18 de octubre de 1990). "La historia de TOPS o vida en los AC rápidos" . Grupo de noticias : alt.folklore.computers . Usenet: [email protected] .
El proyecto PDP-6 comenzó a principios de 1963, como una máquina de 24 bits . Creció a 36 bits para LISP, un objetivo de diseño.
- ^ Hoare, Tony (diciembre de 1973). Sugerencias sobre el diseño de lenguajes de programación (PDF) . pag. 27.(Esta declaración a veces se atribuye erróneamente a Edsger W. Dijkstra , también involucrado en la implementación del primer compilador ALGOL 60 ).
- ^ Hayes, Pat (1974). "Algunos problemas y no problemas en la teoría de la representación". Sociedad para el Estudio de la Inteligencia Artificial y la Simulación del Comportamiento (AISB) .
- ^ Hewitt, Carl ; Obispo, Peter; Steiger, Richard (1973). "Un formalismo universal de actor modular para la inteligencia artificial". IJCAI. Cite journal requiere
|journal=
( ayuda ) - ^ a b Sussman, Gerald Jay ; Steele Jr., Guy L. (diciembre de 1998). "El primer informe sobre el esquema revisado" (PDF) . Computación simbólica y de orden superior . 11 (4): 399–404. doi : 10.1023 / A: 1010079421970 . ISSN 1388-3690 . Archivado desde el original (PDF) el 15 de junio de 2006 . Consultado el 19 de junio de 2006 .
- ^ Hewitt, Carl (diciembre de 1976). "Visualización de estructuras de control como patrones de transmisión de mensajes". AI Memo 410 .
- ^ Hewitt, Carl (junio de 1977). "Visualización de estructuras de control como patrones de transmisión de mensajes". Revista de Inteligencia Artificial .
- ^ Hewitt, Carl (2009). "ActorScript: Integración de fuerza industrial de concurrencia local y no local para Computación cliente-nube". arXiv : 0907,3330 [ cs.PL ].
- ^ "Versión online de los Lambda Papers" . Archivado desde el original (PDF) el 25 de junio de 2018.
- ^ Reynolds, John (1972). "Intérpretes de definiciones para lenguajes de programación de orden superior". Actas de la conferencia ACM . Asociación para Maquinaria de Computación.
- ^ "Common Lisp Hyperspec - 1.1.2 Historia" . LispWorks . 2005 . Consultado el 2 de diciembre de 2018 .
- ^ 1178-1990 (R1995) Estándar IEEE para el lenguaje de programación Scheme
- ^ Kelsey, Richard; Clinger, William; Rees, Jonathan; et al. (Agosto de 1998). " 5 Informe revisado sobre el esquema de lenguaje algorítmico" . Computación simbólica y de orden superior . 11 (1): 7–105. doi : 10.1023 / A: 1010051815785 .
- ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; Findler, Robby; Matthews, Jacob (agosto de 2009). " Informe revisado 6 sobre el esquema de lenguaje algorítmico" . Revista de programación funcional . 19 (S1): 1–301. CiteSeerX 10.1.1.154.5197 . doi : 10.1017 / S0956796809990074 .
- ^ "Resultados de las votaciones de ratificación de la R6RS" .