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 memorandos sobre IA del Instituto Tecnológico de Massachusetts (MIT), conocidos como los Lambda Papers (1975-1980). Esto dio lugar a la creciente 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 ]
Prehistoria
El desarrollo de Scheme estuvo fuertemente influenciado por dos predecesores muy diferentes entre sí: Lisp aportó su semántica y sintaxis generales, y ALGOL su ámbito 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 aquel entonces— son muy diferentes de cualquier Lisp moderno. Scheme pertenece a la gran familia de lenguajes Lisp, que incluye Common Lisp, Scheme, ISLisp, EuLisp, XLisp y AutoLisp.
Ceceo
Lisp fue inventado por John McCarthy en 1958 mientras estudiaba 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 computación 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, se concibió inicialmente como una medida provisional a la espera del desarrollo de un lenguaje que empleara lo que McCarthy denominó " expresiones m ". Por 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 resultaron populares y los numerosos intentos de implementar expresiones m no tuvieron éxito.
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 primer elemento de una lista y su último elemento, evolucionaron a partir de dos comandos del 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 de 36 bits del IBM 704 .
El primer compilador completo de Lisp, escrito en Lisp, fue implementado en 1962 por Tim Hart y Mike Levin en el MIT. [ 3 ] Este compilador introdujo el modelo de compilación incremental de Lisp, 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 ] desarrollada por McCarthy y otros, y Maclisp [ 5 ] – desarrollada 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 a la comunidad de investigación en inteligencia artificial (IA), especialmente en el PDP-10 . El tamaño de palabra de 36 bits del PDP-6 y el PDP-10 se vio influenciado por la utilidad de tener dos punteros Lisp de 18 bits en una palabra. [ 6 ]
ALGOL
ALGOL 58 , originalmente llamado IAL por "International Algorithmic Language" (Lenguaje Algorítmico Internacional), fue desarrollado conjuntamente por un comité de científicos informáticos europeos y estadounidenses en una reunión celebrada en 1958 en la ETH Zúrich . ALGOL 60 , una revisión posterior desarrollada en la reunión ALGOL 60 en París y ahora comúnmente conocida como ALGOL , se convirtió en el estándar para la publicación de algoritmos y tuvo un profundo impacto en el desarrollo de lenguajes futuros, a pesar de su falta de éxito comercial y sus limitaciones. Tony Hoare comentó: "Este es un lenguaje tan adelantado a su tiempo que no solo representó una mejora con respecto a sus predecesores, sino también con respecto a casi todos sus sucesores". [ 7 ]
ALGOL introdujo el uso de la estructura de bloques y el ámbito léxico. También fue conocido por su difícil mecanismo de paso de parámetros por nombre , que se definió de tal manera que requería la sustitución textual de la expresión que representaba el parámetro de trabajo en lugar del parámetro formal durante la ejecución de un procedimiento o función, lo que provocaba que se reevaluara cada vez que se hacía referencia a él durante la ejecución. Los implementadores de ALGOL desarrollaron un mecanismo que denominaron thunk , que capturaba el contexto del parámetro de trabajo, permitiendo su evaluación 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 desarrollaron un sistema llamado Micro-Planner , una implementación parcial y algo insatisfactoria del ambicioso proyecto Planner de Carl Hewitt . Sussman y Hewitt colaboraron con otros en Muddle, posteriormente renombrado MDL , una extensión de Lisp que formaba parte del proyecto de Hewitt. En 1972, Drew McDermott y Sussman desarrollaron Conniver , un lenguaje basado en Lisp que revisaba el uso del retroceso automático en Planner, el cual consideraban improductivo. Hewitt dudaba de que la "estructura de control compleja" de Conniver fuera la solución a los problemas de Planner. Pat Hayes comentó: "Su solución [la de Sussman y McDermott], de 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 de computación Actor como solución a los problemas de Planner. [ 9 ] Se desarrolló una implementación parcial de Actores 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 "tiny Lisp" desarrollado en Maclisp , para comprender mejor el modelo. Utilizando esta base, comenzaron a desarrollar mecanismos para crear actores y enviar mensajes. [ 10 ]
El uso del ámbito léxico de PLASMA era similar al cálculo lambda . Sussman y Steele decidieron intentar modelar los Actores en el cálculo lambda. Llamaron a su sistema de modelado Schemer, cambiándolo finalmente a Scheme para ajustarse 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 momento, descubrieron que habían escrito un dialecto de Lisp muy pequeño y capaz. Hewitt siguió siendo crítico con la "estructura de control peluda" en Scheme [ 11 ] [ 12 ] y consideró que las primitivas (por ejemplo, START!PROCESS, STOP!PROCESS, y EVALUATE!UNINTERRUPTIBLY) utilizadas en la implementación de Scheme eran un paso atrás.
Veinticinco años después, en 1998, Sussman y Steele reflexionaron que el minimalismo de Scheme no fue un objetivo de diseño consciente, sino más bien el resultado no intencionado del proceso de diseño. «En realidad, estábamos intentando construir algo complicado y descubrimos, por casualidad, que habíamos diseñado accidentalmente algo que cumplía 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 sencillo— podía servir como núcleo de un lenguaje de programación potente y expresivo». [ 10 ]
Por otro lado, Hewitt se mantuvo crítico con el cálculo lambda como fundamento para la escritura de computación: «La situación real 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 lo que contiene el cálculo lambda y más». También criticó aspectos de Scheme que derivan del cálculo lambda, como la dependencia de las funciones de continuación y la falta de excepciones. [ 13 ]
Los documentos de 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 de programación avanzada, como la optimización de la recursión de cola , y las publicaron en una serie de memorandos sobre IA que se conocen colectivamente como los Lambda Papers . [ 14 ]
Lista de documentos
- 1975: Scheme: Un intérprete para el cálculo lambda extendido
- 1976: Lambda: El imperativo definitivo
- 1976: Lambda: La declaración definitiva
- 1977: Desmintiendo el mito de la "llamada a procedimiento costosa", o, Implementaciones de llamadas a procedimiento consideradas perjudiciales, o, Lambda: El GOTO definitivo
- 1978: El arte del intérprete o el complejo de modularidad (Partes cero, uno y dos)
- 1978: RABBIT: 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 el ámbito léxico . También fue uno de los primeros lenguajes de programación, después del Definitional Language de Reynolds [ 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ó. [ 16 ]
Normalización
El lenguaje Scheme está estandarizado en el estándar oficial del Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) [ 17 ] y en un estándar de facto llamado Informe Revisado sobre el Lenguaje Algorítmico Scheme (RnRS ) . 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 ser añadidas por las implementaciones de Scheme.
Cronología
Referencias
- ↑ Steele, Guy (2006). "Historia de Scheme" (PDF) . Sun Microsystems Laboratories . Archivado del original el 2 de marzo de 2023. Consultado el 5 de abril de 2023 .
{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace ) - ↑ McCarthy, John . "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, parte I" . Archivado del original el 4 de octubre de 2013. Consultado el 13 de octubre de 2006 .
- ↑ Hart, Tim; Levin, Mike. "AI Memo 39, The New Compiler" (PDF) . Archivado del original (PDF) el 6 de julio de 2017. Consultado el 13 de octubre de 2006 .
- ↑ McCarthy, John ; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1985). LISP 1.5 Programmer's Manual . MIT Press . ISBN 978-0-262-13011-0.
- ↑ "Manual de referencia de Maclisp" . 3 de marzo de 1979. Archivado del original el 14 de diciembre de 2007.
- ↑ Hurley, Peter J. (18 de octubre de 1990). "La historia de TOPS o la vida en los AC rápidos" . Grupo de noticias : alt.folklore.computers . Usenet: 84950@tut.cis.ohio-state.edu .
El proyecto PDP-6 comenzó a principios de 1963, como una máquina
de 24 bits
. Se amplió a 36 bits para LISP, un objetivo de diseño.
- ↑ Hoare, Tony (diciembre de 1973). Consejos sobre el diseño de lenguajes de programación (PDF) . pág. 27. (Esta afirmación a veces se atribuye erróneamente a Edsger W. Dijkstra , quien también participó 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 .
- ↑ Hewitt, Carl ; Bishop, Peter; Steiger, Richard (1973). "Un formalismo de actor modular universal para la inteligencia artificial". IJCAI.
{{cite journal}}: Para citar una revista se requiere|journal=( ayuda ) - 1 2 Sussman, Gerald Jay ; Steele Jr., Guy L. (diciembre de 1998). "El primer informe sobre Scheme revisado" (PDF) . Higher-Order and Symbolic Computation . 11 (4): 399– 404. doi : 10.1023/A:1010079421970 . ISSN 1388-3690 . S2CID 7704398. Archivado del original (PDF) el 15 de junio de 2006. Recuperado el 19 de junio de 2006 .
- ↑ Hewitt, Carl (diciembre de 1976). "Considerando las estructuras de control como patrones de paso de mensajes". AI Memo 410 .
- ↑ Hewitt, Carl (junio de 1977). "Visualizando las estructuras de control como patrones de paso de mensajes". Journal of Artificial Intelligence . 8 (3): 323– 364. doi : 10.1016/0004-3702(77)90033-9 . hdl : 1721.1/6272 .
- ↑ Hewitt, Carl (2009). "ActorScript: Integración de fuerza industrial de concurrencia local y no local para computación en la nube del cliente". arXiv : 0907.3330 [ cs.PL ].
- ↑ "Versión en línea de los Lambda Papers" . scheme.org . 2025. Consultado el 4 de diciembre de 2025 .
- ↑ Reynolds, John (1972). "Intérpretes definicionales para lenguajes de programación de orden superior". Actas de la Conferencia ACM . Asociación para la Maquinaria de Computación.
- ↑ "Hiperespecificación de Common Lisp – 1.1.2 Historial" . LispWorks . 2005. Consultado el 2 de diciembre de 2018 .
- ↑ 1178-1990 (R1995) Norma IEEE para el lenguaje de programación Scheme
- ↑ Kelsey, Richard; Clinger, William; Rees, Jonathan; et al. (agosto de 1998). " Informe revisado 5 sobre el esquema del lenguaje algorítmico" . Higher-Order and Symbolic Computation . 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 del lenguaje algorítmico" . Journal of Functional Programming . 19 (S1): 1–301 . CiteSeerX 10.1.1.154.5197 . doi : 10.1017/S0956796809990074 . S2CID 62724224 .
- ↑ "Resultados de la votación de ratificación de R6RS" .
- Historia del software
- Scheme (lenguaje de programación)