2010-06-17 12 views
27

He leído el artículo de McCarthy de 1960 sobre LISP y no encontré ninguna referencia a nada que sea similar a las macros definidas por el usuario o la evaluación normal de órdenes. Me preguntaba cuándo macros aparecieron por primera vez en la historia de lenguaje de programación (y también en la historia de Lisp):¿Cuándo apareció la idea de las macros (transformación de código definida por el usuario)?

  • cuándo fue la idea de transformación de código definido por el usuario (antes de la interpretación o compilación) describió por primera vez (en teoría)?
  • ¿Cuál fue la primera implementación de lenguaje de programación en tener macros similares a Lisp (por "Lisp-like" me refiero a "usar un lenguaje legible de Turing para hacer la transformación de código")? (incluido el no Lisp - Por ejemplo, Forth es bastante viejo, pero no estoy seguro de si la primera implementación de Forth ya tenía "INMEDIATO")
  • También cuál de esos era el primer lenguaje de programación de alto nivel (excluir lenguajes de ensamblador ...)
  • ¿Cuál fue el primer dialecto Lisp en tener macros?

¡Gracias!

Respuesta

10

Creo que la idea vuelve a Post systems, reescribiendo con cadenas ("si ve esta cadena, reemplácela con esa cadena"). Los sistemas de publicación son aptos para Turing y, por lo tanto, pueden computar cualquier cosa (¡incluidos los textos del programa!). El artículo de Emil Post sobre estos está fechado en 1943, pero supuestamente hizo la conceptualización original en la década de 1920.

The General Purpose Macro Processor, uno de los primeros ampliamente utilizados, estaba disponible a principios de los años 60.

TRAC es otro macroprocesador antiguo que data del mismo período. El History of Computer Languages (TRAC) dice que fue diseñado en 1959.

Ambos son procesadores de macros compatibles con Turing.

SNOBOL también pertenecen a la misma época.

El hecho de que se hayan construido macroprocesadores de uso muy general a principios de los años 60 me sugiere que probablemente existían macroprocesadores creados especialmente para proporcionar inspiración. Estoy bastante seguro de que los macroprocesadores estaban en uso en los ensambladores antes de este punto, pero no tengo pruebas específicas.

Sé que COBOL tiene las llamadas bibliotecas COPY, que son un cruce entre macros e incluyen archivos. No sé cuándo se introdujo esto en COBOL, pero el lenguaje se remonta a 1958.

Es interesante observar que las macros LISP se pueden considerar como un caso especial de reescrituras de árbol a árbol ("si ve una s-expresión que se ve así, reemplácela por una s-expresión que se parece a eso "). Los árboles se pueden modelar fácilmente como cadenas (ver: "LISP" :) y, por lo tanto, las macros LISP son un caso especial de reescritura de cadenas.

El caso generalizado de reescritura de árboles ahora es la base para Program Transformation Systems, que puede llevar a cabo cambios masivos en el texto del programa.

+0

Gracias - Me había olvidado de macros del ensamblador y sistemas de correos. Esto es muy útil, y también editaré mi pregunta para incluir "el primer lenguaje de alto nivel", que aún no está claro si fue COBOL o no. – Jay

16

para tener en cuenta las macros cuando se introduzcan en Lisp, usted debe buscar menciones de FEXPRs y FSUBRs el que los predecesores de macros Lisp modernas (o más exactamente, FEXPRs son los predecesores de macros definidos por el usuario)Estos se mencionan en varios lugares, por ejemplo, en la sección From LISP 1 to LISP 1.5 de McCarthy's History of Lisp. Pero, de hecho, también se menciona antes que eso: en la p.48 del LISP I PROGRAMMER'S MANUAL (desde 1960) puede ver una descripción de FEXPR y FSUBR.

Por cierto, es un poco falso comparar macros Lisp con sistemas basados ​​en cadenas. La ventaja de utilizar un transformador de árbol frente a manipulaciones de cadena es lo suficientemente significativo como para convertirlo en un sistema completamente diferente. Otro aspecto importante de las macros de Lisp es que son transformación local frente a una transformación de programa global (el documento más obvio para leer es Felleisen's On the Expressive Power of Programming Languages). Y, por supuesto, hay un área completa aquí -desde las FEXPR hasta las macros modernas y más correctas, luego las macros higiénicas en Scheme (que trata de una representación que es más rica que los árboles de análisis simbólicos), luego una combinación de macros y un sistema de módulos, fases de expansión de sintaxis, etc, etc, etc. probablemente hay suficiente material aquí por un par de años de lectura ...

Cuestiones relacionadas