2010-06-17 8 views
27

Ich habe McCarthy 1960 Papier auf LISP gelesen und fand keine Bezugnahme auf etwas, das benutzerdefinierte Makros oder normale Reihenfolge Auswertung ähnlich ist. Ich frage mich, wenn Makros zuerst in Programmiersprache Geschichte erschien (und auch in Lisp Geschichte):Wann wurde die Idee der Makros (benutzerdefinierte Code-Transformation) angezeigt?

  • Wann wurde die Idee von benutzerdefinierter Code-Transformation (vor Interpretation oder Kompilation) zuerst beschrieben (theoretisch)?
  • Was war die erste Programmiersprachenimplementierung, um Lisp-ähnliche Makros zu haben (mit "Lisp-like" meine ich "Verwenden einer lesbaren Turing-vollständigen Sprache für Code-Transformation")? (einschließlich Nicht-Lisps - Forth zum Beispiel ist ziemlich alt, aber ich bin mir nicht sicher, ob die erste Forth-Implementierung bereits "IMMEDIATE")
  • Auch welche von denen war die erste High-Level-Programmiersprache (Assembler-Sprachen ausschließen ...)
  • Wie war der erste Lisp-Dialekt mit Makros?

Vielen Dank!

Antwort

10

Ich denke, die Idee geht zurück auf Post systems, Umschreiben mit Strings ("Wenn Sie diese Zeichenfolge sehen, ersetzen Sie sie mit dieser Zeichenfolge"). Post-Systeme sind Turing-fähig und können somit alles berechnen (inklusive Programmtexte!). Emil Posts Arbeit zu diesen Arbeiten stammt aus dem Jahr 1943, aber vermutlich hat er die ursprüngliche Konzeptualisierung in den 1920er Jahren gemacht.

The General Purpose Macro Processor, eine der ersten weit verbreiteten, war in den frühen 60er Jahren erhältlich.

TRAC ist ein weiterer früher Makro-Prozessor aus dem gleichen Zeitraum. Die History of Computer Languages (TRAC) sagt, dass es im Jahre 1959 entworfen wurde.

Diese beiden sind Turing-fähige Makro-Prozessoren.

SNOBOL stammt auch aus dem gleichen Zeitraum.

Die Tatsache, dass sehr allgemeine Makro-Prozessoren in den frühen 60er Jahren gebaut wurden, deutet darauf hin, dass es wahrscheinlich vorher speziell entwickelte Makro-Prozessoren gab, die Inspiration lieferten. Ich bin mir ziemlich sicher, dass Makroprozessoren vor diesem Zeitpunkt in Assemblern verwendet wurden, aber ich habe keine spezifischen Beweise.

Ich weiß, dass COBOL sogenannte Copy-Bibliotheken hat, die eine Kreuzung zwischen Makros und Include-Dateien sind. Ich weiß nicht, wann dies in COBOL eingeführt wurde, aber die Sprache geht zurück auf 1958.

Es ist interessant zu beachten, dass LISP-Makros als ein Sonderfall von Tree-to-Tree-Umschreibungen betrachtet werden können ("if Sie sehen einen S-Ausdruck, der so aussieht, ersetzen Sie ihn durch einen S-Ausdruck, der so aussieht "). Bäume können einfach als Strings modelliert werden (siehe: "LISP" :) und somit sind LISP-Makros ein spezieller Fall des String-Rewritings.

Der verallgemeinerte Fall des Umschreibens von Bäumen ist nun die Grundlage für Program Transformation Systems, die massive Änderungen am Programmtext vornehmen kann.

+0

Danke - ich hatte über Assembler-Makros und Postsysteme in Vergessenheit geraten. Das ist sehr nützlich - und ich werde meine Frage auch bearbeiten, um "die erste Hochsprache" einzubeziehen - was noch nicht klar ist, ob es COBOL war oder nicht. – Jay

16

Zur Suche nach, wie Makros, wo in Lisp eingeführt, Sie FEXPRs erwähnt von und FSUBRs aussehen sollte, die die Vorgänger der modernen Lisp-Makros (oder genauer gesagt, FEXPRs die Vorgänger von benutzerdefinierten Makros).Diese werden an mehreren Stellen erwähnt - beispielsweise in dem Abschnitt From LISP 1 to LISP 1.5 von McCarthy's History of Lisp. Aber in der Tat ist es auch früher erwähnt: in S. 48 der LISP I PROGRAMMER'S MANUAL (von 1960) können Sie eine Beschreibung von FEXPRs und FSUBRs sehen.

BTW, es ist ein wenig falsch, Lisp-Makros mit String-basierten Systemen zu vergleichen. Der Vorteil der Verwendung eines Baumtransformers gegenüber String-Manipulationen ist signifikant genug, um ein völlig anderes System zu bilden. Ein weiterer wichtiger Aspekt von Lisp-Makros ist, dass sie lokal Transformation gegen eine globale Programmumwandlung sind (das offensichtlichste Papier, das dafür zu lesen ist, ist Felleisen's On the Expressive Power of Programming Languages). Und natürlich gibt es hier ein ganzes Gebiet - von FEXPRs zu den modernen, besser benommenen Makros, dann zu hygienischen Makros in Scheme (die sich mit einer Repräsentation befassen, die reicher ist als symbolische Parse Bäume), dann eine Kombination von Makros und a Modulsystem, Syntax Expansionsphasen, etc etc etc. Es gibt wahrscheinlich genug Sachen hier für ein paar Jahre zu lesen ...