Ein Präprozessor (seltener auch Präcompiler[1]) ist ein Computerprogramm, das Eingabedaten vorbereitet und zur weiteren Bearbeitung an ein anderes Programm weitergibt. Der Präprozessor wird häufig von Compilern oder Interpretern dazu verwendet, einen Eingabetext zu konvertieren und das Ergebnis im eigentlichen Programm weiterzuverarbeiten.
Viele Programmiersprachen, zum Beispiel die Programmiersprache C sowie das Textsatzprogramm TeX besitzen Makroprozessoren als Präprozessoren, die die Möglichkeiten der jeweiligen Sprache zur Steigerung der Lesbarkeit von Programmtexten sowie zur Strukturierung und Modularisierung von Projekten wesentlich erweitern. PHP – eine verbreitete Skriptsprache zur Generierung von Webseiten – kann als Präprozessor für HTML gesehen werden.
Im Bereich des CAD-Entwurfs, des CAM sowie der Finite-Elemente-Simulation wird häufig ein Präprozessor verwendet, um das entworfene Bauteil für die Weiterverarbeitung vorzubereiten. Hierzu gehören beispielsweise Arbeitsschritte wie Kombination mit einem anderen Bauteil, Aufteilung in Segmente, Gittererzeugung, Umsetzen in ein anderes Koordinatensystem usw.
Der Präprozessor der Sprache C führt unter anderem die folgenden Änderungen am Programmtext durch, bevor der eigentliche C-Compiler das Programm übersetzt:[2]
Ersetzen von Trigraph-Sequenzen wie ??=, ??(, ??) durch Symbole wie #,{,} (nicht beim K&R Standard)
Zusammenfügen von physischen zu logischen Quelltextzeilen (Entfernen der \-Zeilentrenner-Sequenzen) (nicht beim K&R Standard)
Ersetzen von Kommentaren durch Leerzeichen
Ersetzen von vordefinierten oder über #define definierten Makros
Bedingte Übersetzung von Zeilen, die zwischen #if, #ifdef, #ifndef, #elif und #endif stehen, wobei #if auch mit einfachen konstanten arithmetischen Ausdrücken und Vergleichsoperatoren umgehen kann
Rekursives Einfügen und Abarbeiten von Dateien per #include-Anweisung
Neben der einfachen Makroersetzung ist die bedingte Übersetzung mittels #if, #ifdef und #ifndef ein wichtiges Merkmal des C-Präprozessors: Der Entwickler kann damit steuern, welche Abschnitte des Programmtextes dem Compiler zugeführt werden und so beispielsweise Debug-Programmcode ein- oder ausblenden oder Anpassungen für unterschiedliche Prozessoren oder Betriebssysteme vornehmen.
Der FreeBASIC-Präprozessor
Der Präprozessor von FreeBASIC funktioniert syntaktisch ähnlich wie der von C. Er interpretiert Anweisungen wie #if, #endif, #ifdef, #else, #define und #include ähnlich oder gleich wie in C. Zusätzlich werden noch Optionen wie #include once (Kein wiederholtes Einschleusen) und #macro … #endmacro (Mehrzeiliges Macro) zur Verfügung gestellt.[3]
Der TeX-Präprozessor
Die Fähigkeiten des im TeX-Satzsystem eingebauten Präprozessors beschränken sich im Wesentlichen auf die Definition von Makros zur Zusammenfassung von Formatierungsbefehlen. Darauf aufbauend wurden im Laufe der Zeit umfangreichere Präprozessoren (genauer: Makrosammlungen) für mitunter sehr spezielle Anwendungsgebiete entwickelt, um den Umgang mit TeX für den Benutzer komfortabler zu gestalten. Prominentester Vertreter ist LaTeX, weitere Beispiele sind ConTeXt, BibTeX und MusiXTeX.[4][5]
Die Programmiersprache PHP
PHP ist eine Skriptsprache, die hauptsächlich zur Erstellung dynamischer Webseiten oder Webanwendungen verwendet wird. Wenn der Webserver eine Anfrage empfängt, liest er eine PHP-Datei. Enthält die Datei PHP-Start- und Endmarken wie <?php und ?>, so wird der Text zwischen diesen Markierungen vom Webserver als PHP-Programm interpretiert, ausgeführt und erst die Ausgabe des Programms (zusammen mit dem Html-Code „darum“) wird an den anfragenden Webbrowser geschickt.
Eine Seite, die die aktuelle Uhrzeit ausgibt, könnte so aussehen:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> <head> <title>Aktuelle Uhrzeit</title> </head> <body> <h1>Aktuelle Uhrzeit</h1> <p><?phpprintstrftime('Jetzt ist es %H Uhr, %M Minuten und %S Sekunden');?></p> </body></html>
Der PHP-Präprozessor wandelt dies z. B. um in
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="de"><head><title>Aktuelle Uhrzeit</title></head><body><h1>Aktuelle Uhrzeit</h1><p>Jetzt ist es 22 Uhr, 27 Minuten und 26 Sekunden</p></body></html>
Der Inhalt einer solchen Seite kann also bei Abruf dynamisch erstellt werden. PHP verhält sich also tatsächlich wie ein Vor- oder Präprozessor, da der Originaltext verändert und erst danach zum Browser gesendet wird.
Präprozessor bei CAD, CAM und FEM
Ein in einem CAD-System entworfenes Bauteil, das mittels Finite-Elemente-Methode simuliert werden soll, muss zuvor mit einem Gitter überdeckt werden. Häufig sind zusätzlich Randbedingungen für die Simulation anzugeben, zum Beispiel, dass eine Seite des Bauteils fest eingespannt/verbunden ist, oder Drehzahl und Achse für eine Rotationsbewegung.
Für derartige Angaben wird meist ein Präprozessor-Programm verwendet, der das entworfene Bauteil für die Weiterverarbeitung vorbereitet. Der Präprozessor muss sowohl das CAD-Format des Entwurfsprogramms einlesen können, als auch das Inputformat des FE-Lösers ausgeben können. Der Präprozessor bietet dann Eingabemasken für entsprechende Angaben.
Aufgaben eines Präprozessors sind unter anderem auch:
Kombination des Bauteils mit einem anderen Bauteil
↑Helmut Herold, Michael Klar, Susanne Klar: C++, UML und Design Patterns. Grundlagen und Praxis der Objektorientierung. Addison-Wesley, München 2005, ISBN 3-8273-2267-7, S.21 (eingeschränkte Vorschau in der Google-Buchsuche).
↑British Standards Institute (Hrsg.): The C Standard – BS ISO/IEC 9899:1999. John Wiley & Sons, 2003, ISBN 0-470-84573-2. Abschnitte 5.1.1.2, 5.2.4.2.1 f., 6.10 ff.