2010-06-17 19 views
27

J'ai lu l'article de 1960 de McCarthy sur LISP et trouvé aucune référence à quelque chose qui est semblable aux macros définies par l'utilisateur ou à l'évaluation normale d'ordre. Je me demandais quand les macros sont apparues dans l'histoire du langage de programmation (et aussi dans l'histoire Lisp):Quand l'idée de macros (transformation de code définie par l'utilisateur) est-elle apparue?

  • Quand est née l'idée de la transformation de code défini par l'utilisateur (avant l'interprétation ou compilation) d'abord décrit (théoriquement)?
  • Quelle a été la première mise en œuvre du langage de programmation pour avoir des macros Lisp (par « Lisp » Je veux dire « en utilisant un langage Turing-complet lisible à faire code transformation »)? (Y compris les non-Lisps - Forth par exemple est assez vieux, mais je ne sais pas si le premier avait déjà « immédiate » la mise en œuvre Forth)
  • également que des personnes était la première langue de programmation de haut niveau (exclure les langues assembleur ...)
  • Quel était le premier dialecte Lisp à avoir des macros?

Merci beaucoup!

Répondre

10

Je pense que l'idée remonte à Post systems, en réécrivant avec des chaînes ("si vous voyez cette chaîne, remplacez-la par cette chaîne"). Les systèmes de poste sont capables de Turing, et peuvent donc tout calculer (y compris les textes de programme!). Le papier d'Emil Post sur ces derniers est daté 1943, mais censément il a fait la conceptualisation originale dans les années 1920.

The General Purpose Macro Processor, l'un des premiers largement utilisés, était disponible au début des années 60.

TRAC est un autre processeur macro début datant de la même période. Le History of Computer Languages (TRAC) dit qu'il a été conçu en 1959.

Ces deux éléments sont des processeurs macro-Turing capables.

SNOBOL date également de la même période. Le fait que les macro-processeurs à usage très général soient en cours de construction au début des années 60 me laisse penser qu'il existait probablement des macro-processeurs spécialisés construits avant cette date pour inspirer. Je suis assez sûr que les processeurs de macro étaient utilisés dans les assembleurs avant ce point, mais je n'ai pas de preuve spécifique.

Je sais que COBOL a ce que l'on appelle les bibliothèques COPY, qui sont un croisement entre les macros et les fichiers d'inclusion. Je ne sais pas quand cela a été introduit dans COBOL, mais la langue remonte à 1958.

Il est intéressant de noter que les macros LISP peuvent être considérées comme un cas particulier de réécriture d'arbre à arbre ("si vous voyez une expression-s qui ressemble à ceci, remplacez-la par une expression-s qui ressemble à ça "). Les arbres peuvent être facilement modélisés sous forme de chaînes (voir: "LISP" :) et donc les macros LISP sont un cas particulier de réécriture de chaînes.

Le cas généralisé de la réécriture d'arborescence est maintenant la base de Program Transformation Systems, qui peut effectuer des changements massifs sur le texte du programme.

+0

Merci - je l'avais oublié macros assembleur et systèmes de poste. C'est très utile - et je vais aussi éditer ma question pour inclure "le premier langage de haut niveau" - qui n'est pas encore clair si c'était COBOL ou pas. – Jay

16

Pour rechercher des comment macros où introduit dans Lisp, vous devez rechercher les mentions de FEXPRs et FSUBRs que les prédécesseurs de macros Lisp modernes (ou plus exactement, FEXPRs sont les prédécesseurs de macros définies par l'utilisateur).Ceux-ci sont mentionnés à plusieurs endroits - par exemple, dans la section From LISP 1 to LISP 1.5 de History of Lisp de McCarthy. Mais en fait, il est également mentionné plus tôt que cela: dans p.48 du LISP I PROGRAMMER'S MANUAL (à partir de 1960), vous pouvez voir une description de FEXPRs et FSUBRs.

BTW, c'est un peu faux de comparer les macros Lisp avec les systèmes à base de chaînes. L'avantage d'utiliser un transformateur d'arbre par rapport aux manipulations de cordes est suffisamment important pour en faire un système complètement différent. Un autre aspect important des macros Lisp est qu'elles sont transformation locale par rapport à une transformation de programme globale (l'article le plus évident à lire pour ceci est On the Expressive Power of Programming Languages de Felleisen). Et bien sûr, il y a toute une zone ici - allant des FEXPRs aux macros modernes, plus bien élevées, puis aux macros hygiéniques dans Scheme (qui traitent d'une représentation plus riche que les arbres d'analyse symboliques), puis une combinaison de macros et d'un système de module, phases d'extension de syntaxe, etc etc etc Il y a des choses probablement assez ici pour quelques années de lecture ...