stringtranslate.com

Historia del lenguaje de programación Scheme

La historia del lenguaje de programación Scheme comienza con el desarrollo de miembros anteriores 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 memorandos de IA del Instituto Tecnológico de Massachusetts (MIT) conocidos como Lambda Papers (1975-1980). Esto resultó en el crecimiento de la popularidad del idioma y la era de 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 generales, y ALGOL proporcionó su alcance léxico y estructura de bloques. Scheme es un dialecto de Lisp pero Lisp ha evolucionado; Los dialectos Lisp a partir de los cuales 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ó). Demostró que con unos pocos operadores simples y una notación para funciones, se puede construir un lenguaje completo de Turing para algoritmos.

Inicialmente se pretendía que el uso de expresiones-s que caracterizan la sintaxis de Lisp fuera una medida provisional en 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 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 de evaluación 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 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 devolvió 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 se pueden mezclar 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 del PDP-6 y PDP-10 estuvo influenciado por la utilidad de tener dos punteros Lisp de 18 bits en una palabra. [6]

ALGOL

ALGOL 58 , originalmente llamado IAL por "Lenguaje Algorítmico Internacional", fue desarrollado conjuntamente por un comité de informáticos europeos y estadounidenses en una reunión celebrada 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 profundo efecto 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 sólo supuso 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 era conocido por su difícil mecanismo de paso de parámetros predeterminado llamado por su nombre , que se definió de manera 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 provocaba que se restituyera. -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, permitiendo 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ó parte 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 complicada" de Conniver fuera una solución a los problemas con Planner. Pat Hayes comentó: "Su solución [Sussman y McDermott], para dar al usuario acceso a las primitivas de implementación de Planner, es sin embargo, una especie de paso retrógrado (¿cuál es la semántica de Conniver?)" [8]

En noviembre de 1972, Hewitt y sus alumnos inventaron el modelo de cálculo Actor 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 "tiny Lisp" desarrollado en Maclisp , para comprender mejor el modelo. A partir de esta base comenzaron a desarrollar mecanismos para crear actores y enviar mensajes. [10]

El uso del alcance léxico por parte de PLASMA fue similar al cálculo lambda . Sussman y Steele decidieron intentar modelar actores mediante 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 de 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 propósitos 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 complicada" del Esquema [11] [12] y consideró que las primitivas (por ejemplo, START!PROCESS, STOP!PROCESSy EVALUATE!UNINTERRUPTIBLY) utilizadas en la implementación del Esquema 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 Sirve 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 base para la escritura de cálculos: "La situación actual 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 funciones de continuación y la falta de excepciones. [13]

Los documentos Lambda

Entre 1975 y 1980, Sussman y Steele trabajaron en el desarrollo de sus ideas sobre el uso del cálculo lambda, continuaciones y otros conceptos de programación avanzados, como la optimización de la recursión de cola , y los publicaron en una serie de AI Memos que en conjunto se denominaron Lambda Papers . [14]

Lista de artículos

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 contribuyó Guy Steele. [dieciséis]

Estandarizació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 n revisado sobre el esquema de lenguaje algorítmico (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 esquemas para la implementación , que contienen bibliotecas adicionales que pueden ser agregados por implementaciones del Esquema.

Línea de tiempo

Referencias

  1. ^ Steele, chico (2006). "Historia del esquema" (presentación de diapositivas en PDF) . Laboratorios Sun Microsystems .
  2. ^ 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 .
  3. ^ Ciervo, Tim; Levin, Mike. "AI Memo 39, el nuevo compilador" (PDF) . Archivado desde el original (PDF) el 13 de diciembre de 2020 . Consultado el 13 de octubre de 2006 .
  4. ^ McCarthy, Juan ; 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.
  5. ^ "Manual de referencia de Maclisp". 3 de marzo de 1979. Archivado desde el original el 14 de diciembre de 2007.
  6. ^ 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:  [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.
  7. ^ Hoare, Tony (diciembre de 1973). Sugerencias sobre el diseño de lenguajes de programación (PDF) . pag. 27. (Esta afirmación a veces se atribuye erróneamente a Edsger W. Dijkstra , también involucrado en la implementación del primer compilador ALGOL 60 ).
  8. ^ 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) .
  9. ^ Hewitt, Carl ; Obispo, Pedro; Steiger, Richard (1973). "Un formalismo de actor modular universal para la inteligencia artificial". IJCAI. {{cite journal}}: Citar diario requiere |journal=( ayuda )
  10. ^ ab Sussman, Gerald Jay ; Steele Jr., Guy L. (diciembre de 1998). "El primer informe sobre el plan revisado" (PDF) . Computación simbólica y de orden superior . 11 (4): 399–404. doi :10.1023/A:1010079421970. ISSN  1388-3690. S2CID  7704398. Archivado desde el original (PDF) el 15 de junio de 2006 . Consultado el 19 de junio de 2006 .
  11. ^ Hewitt, Carl (diciembre de 1976). "Ver las estructuras de control como patrones de paso de mensajes". Memorándum AI 410 .
  12. ^ Hewitt, Carl (junio de 1977). "Ver las estructuras de control como patrones de paso de mensajes". Revista de Inteligencia Artificial . 8 (3): 323–364. doi :10.1016/0004-3702(77)90033-9. hdl : 1721.1/6272 .
  13. ^ 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].
  14. ^ "Versión en línea de los Lambda Papers". Archivado desde el original (PDF) el 25 de junio de 2018.
  15. ^ Reynolds, John (1972). "Intérpretes de definición para lenguajes de programación de orden superior". Actas de la conferencia ACM . Asociación para Maquinaria de Computación.
  16. ^ "Common Lisp Hyperspec - Historial 1.1.2". LispWorks . 2005 . Consultado el 2 de diciembre de 2018 .
  17. ^ 1178-1990 (R1995) Estándar IEEE para el lenguaje de programación de esquemas
  18. ^ Kelsey, Richard; Clinger, William; Rees, Jonathan; et al. (Agosto de 1998). "Informe revisado 5 sobre el esquema de lenguaje algorítmico". Computación simbólica y de orden superior . 11 (1): 7–105. doi :10.1023/A:1010051815785.
  19. ^ Sperber, Michael; Dybvig, R. Kent; Flatt, Mateo; Van Straaten, Antón; Buscador, Robby; Matthews, Jacob (agosto de 2009). "Informe revisado6 sobre el esquema de lenguaje algorítmico". Revista de programación funcional . 19 (T1): 1–301. CiteSeerX 10.1.1.154.5197 . doi :10.1017/S0956796809990074. S2CID  62724224. 
  20. ^ "Resultados de la votación de ratificación del R6RS".