Was ist der Ursprung des C-Präprozessors?

30

Der C-Präprozessor ist an C angehängt, hat jedoch eine völlig andere Syntax als die Hauptsprache:

  • syntaktisch signifikantes Leerzeichen (Zeilenende beendet eine Anweisung, Lücke nachdem das Makro den Anfang der Ersetzungsliste bestimmt)

  • schlüsselwortbasierte Blöcke anstelle von geschweiften Blöcken elifanstelle vonelse if

  • Schlüsselwort-geführte Definitionen anstelle von Deklaration-Reflects-Use, nein =für Wertedefinition

  • Hinweise auf eine alternative String-Syntax ( #include <>vs #include "")

  • Lazy Evaluation (von C natürlich; aber 6.10.3.1 kann so gelesen werden , dass es an den wenigen wichtigen Stellen auch eine bestimmte Reihenfolge der Makroexpansion impliziert )

Es sieht wirklich gar nicht nach C aus! Technisch es ist seine eigene Sprache, aber es ist immer als fast-integraler Bestandteil C verwendet worden und es scheint sehr seltsam , dass es nicht mit ihm syntaktisch integrieren würde.

Wikipedia spricht nicht über seine Geschichte. Das Portland Pattern Repository erwähnt dies nur gelegentlich , geht jedoch nicht weiter ins Detail, als dass es von anderen Personen als dem Rest von C. entworfen wurde. Dennis Ritchies Website mit der Geschichte von C hatte wahrscheinlich die Antwort, ist aber leider nicht länger Erhältlich.

Als Makromodul hat es offensichtlich eine ganz andere Semantik als die Laufzeitsprache, was einige Unterschiede erklären würde , aber nicht die visuellen Designaspekte (für moderne Augen ist es auch unklar, ob es ursprünglich dazu gedacht war , die Art von Spaß zu ermöglichen , die es macht Ersatzsystem erlaubt, oder ob es "nur" eine sinnvolle Möglichkeit war, Funktionen in einer Zeit vor leistungsfähigen Optimierern inline zu schalten). Es fühlt sich so an, als wäre etwas näher an dem, was schließlich zu C ++ - Vorlagen wurde, eine logischere Entwicklung in Richtung Makros gewesen, wenn C-ähnliche Semantik tatsächlich der Ausgangspunkt gewesen wäre, aber es gibt weniger konkrete Beweise dafür als für die Syntax.

Haben wir Aufzeichnungen darüber, warum es so entworfen wurde oder welche Einflüsse die Schöpfer hatten?

Leushenko
quelle
5
archive.org/details/dmr-grab
Mike Supports Monica
@Mike omg danke Ich dachte wirklich, dass der Inhalt der Website für immer verloren gegangen ist, da es keinen durchsuchbaren Eintrag im Archiv gibt.
Leushenko

Antworten:

17

Aus http://www.jslint.com/chistory.html ("Die Entwicklung der C-Sprache" von Dennis M. Ritchie):

Viele andere Veränderungen traten zwischen 1972 und 1973 auf, aber die wichtigste war die Einführung des Präprozessors, teilweise auf Drängen von Alan Snyder [Snyder 74]., sondern auch in Anerkennung der Nützlichkeit der in BCPL und PL / I verfügbaren Dateieinschlussmechanismen. Die ursprüngliche Version war außerordentlich einfach und enthielt nur Dateien und einfache Ersetzungen von Zeichenfolgen: # include und #define von parameterlosen Makros. Bald darauf wurde es hauptsächlich von Mike Lesk und dann von John Reiser erweitert, um Makros mit Argumenten und bedingter Kompilierung aufzunehmen. Der Präprozessor wurde ursprünglich als optionale Ergänzung zur Sprache selbst betrachtet. In der Tat wurde es für einige Jahre nicht einmal aufgerufen, es sei denn, das Quellprogramm enthielt zu Beginn ein spezielles Signal. Diese Haltung hielt an und erklärt sowohl die unvollständige Integration der Syntax des Präprozessors mit dem Rest der Sprache als auch die Ungenauigkeit seiner Beschreibung in frühen Referenzhandbüchern.

Aus dem im obigen Zitat verlinkten Bericht in Abschnitt 4 der [Snyder 74] -Referenz geht hervor, dass Alan Snyder an einem portablen C-Compiler (heute könnte man sagen, "retargetable") gearbeitet hat. Vielleicht war dies die Motivation, nach einem Präprozessor zu fragen.

Ich konnte jedoch keine zusätzlichen Details zum Design des C-Präprozessors selbst als Sprache finden.

James Youngman
quelle
1
Beachten Sie, dass Snyder vom MIT zu Bell Labs kam, wo der MIDAS-Assembler die Anweisungen DEFINE, IFDEF und IFNDEF hat. Zufall?
Lars Brinkhoff
0

Ich möchte nur hinzufügen, dass Assemblersprachen häufig Vorprozessoren für Makro-Assembler haben, die CPP sehr ähnlich sehen.

Tuntable
quelle