stringtranslate.com

Historia del lenguaje de programación Scheme

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]

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 de Lisp de los que evolucionó Scheme (aunque eran los más utilizados en ese momento) son bastante diferentes de cualquier Lisp moderno.

Ceceo

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

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.

Carl Hewitt, el modelo de actor 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 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]

Los documentos 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 los publicaron en una serie de AI Memos que se han denominado colectivamente Lambda Papers . [14]

Lista de trabajos

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 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]

Normalización

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.

Cronología

Referencias

  1. ^ Steele, Guy (2006). "Historia de Scheme" (PDF) . Sun Microsystems Laboratories . Archivado desde el original el 2023-03-02 . Consultado el 2023-04-05 .{{cite web}}: CS1 maint: bot: estado de URL original desconocido ( enlace )
  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. ^ Hart, Tim; Levin, Mike. "AI Memo 39, El nuevo compilador" (PDF) . Archivado desde el original (PDF) el 2020-12-13 . Consultado el 2006-10-13 .
  4. ^ McCarthy, John ; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1985). Manual del programador de LISP 1.5 . MIT Press . 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 sistemas de aire acondicionado 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ó hasta los 36 bits para LISP, un objetivo de diseño.
  7. ^ Hoare, Tony (diciembre de 1973). Consejos para 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 , 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 ; Bishop, Peter; Steiger, Richard (1973). "Un formalismo de actor modular universal para la inteligencia artificial". IJCAI. {{cite journal}}: Requiere citar revista |journal=( ayuda )
  10. ^ ab Sussman, Gerald Jay ; Steele Jr., Guy L. (diciembre de 1998). "El primer informe sobre Scheme revisitado" (PDF) . Higher-Order and Symbolic Computation . 11 (4): 399–404. doi :10.1023/A:1010079421970. ISSN  1388-3690. S2CID  7704398. Archivado desde el original (PDF) el 2006-06-15 . Consultado el 2006-06-19 .
  11. ^ Hewitt, Carl (diciembre de 1976). "Visualización de las estructuras de control como patrones de transmisión de mensajes". AI Memo 410 .
  12. ^ Hewitt, Carl (junio de 1977). "Visualización de las estructuras de control como patrones de transmisión de mensajes". Journal of Artificial Intelligence . 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 y cliente". arXiv : 0907.3330 [cs.PL].
  14. ^ "Versión en línea de los documentos Lambda". Archivado desde el original (PDF) el 25 de junio de 2018.
  15. ^ Reynolds, John (1972). "Intérpretes definicionales para lenguajes de programación de orden superior". Actas de la conferencia ACM . Association for Computing Machinery.
  16. ^ "Historia de Common Lisp Hyperspec – 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 Scheme
  18. ^ Kelsey, Richard; Clinger, William; Rees, Jonathan; et al. (agosto de 1998). "Informe revisado5 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, Matthew; Van Straaten, Anton; Findler, Robby; Matthews, Jacob (agosto de 2009). "Informe revisado6 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. S2CID  62724224. 
  20. ^ "Resultados de la votación de ratificación del R6RS".