En förprocessor är ett datorprogram som tar in och matar ut data som är avsedda för inmatning av ett annat program (som en kompilator ). Utdata från förprocessorn sägs vara i en förbehandlad form som är lämplig för bearbetning av efterföljande program (kompilator). Resultatet och typen av bearbetning beror på typen av förprocessor; till exempel kan vissa förprocessorer endast utföra enkel textsubstitution, andra kan jämföras med programmeringsspråk. Den vanligaste användningen av en förprocessor är att bearbeta källkoden innan den skickas till nästa kompileringssteg. Programmeringsspråken C / C++ och TeX -datorlayoutsystemet använder förprocessorer som avsevärt utökar sina möjligheter.
I vissa programmeringsspråk kallas kompilerings- och översättningsstegen "förbearbetning".
Lexikaliska förprocessorer kallas lågnivåförprocessorer eftersom de endast kräver lexikal analys , det vill säga de bearbetar bara källtexten innan de analyserar , och ersätter helt enkelt lexem och specialtecken med givna teckensekvenser, enligt regler som fastställs av användare. De utför vanligtvis makrosubstitution , textinfogningar från andra filer och villkorlig kompilering eller fillänkning.
Den mest använda lexikala förprocessorn är C-språkförprocessorn som används i C-programmeringsspråken och dess ättling, C++ . Förprocessorn tar bort kommentarer från koden , transformerar koden i enlighet med makron och exekverar andra direktiv som börjar med tecknet "#" (som #include, #define, olika direktiv som #pragma).
PHP är vanligast vid bearbetning av webbsidor . Texten på sidan läses och visas oförändrad. Det enda undantaget är förekomsten av PHP-instruktioner i brödtexten på sidan, avgränsade <?phpi början och ?>i slutet.
Ett exempel på texten på en sida som innehåller aktuell tid:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html > < head > < title > Current tid </ title > </ head > < body > < h1 > Aktuell tid </ h1 > <?php print strftime('Den aktuella tiden är %H timmar, %M minuter %S sekunder'); ?> </ body > </ html >PHP-förprocessorn kommer att ersätta den markerade raden med:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html > < head > < title > Current tid </ title > </ head > < body > < h1 > Aktuell tid </ h1 > Det är nu 10 timmar, 15 minuter 20 sekunder </ body > </ html >Andra lexikaliska förprocessorer stöder det universella m4- språket , som vanligtvis används i plattformsoberoende byggsystem som autoconf och GEMA , en makromotor med öppen källkod baserad på kontextmallar .
Syntax-förprocessorer introducerades först i Lisp- familjen av språk . Deras roll var att bearbeta syntaxträd enligt en uppsättning regler definierade av användaren. För vissa programmeringsspråk var reglerna skrivna på samma språk som själva programmet (kompileringssymmetri). Lisp och OKaml är exempel . Vissa språk använder ett helt oberoende språk för att beskriva transformationer, till exempel XSLT -förprocessorn för XML eller motsvarande med statiska CDuce- typer .
Syntaxförprocessorer används vanligtvis för att förfina ett språks syntax, utöka ett språk genom att lägga till nya primitiver eller bädda in ett domänspecifikt programmeringsspråk i ett värdspråk.
Ett bra exempel på syntaxmodifiering är förekomsten av två olika syntaxer [1] i programmeringsspråket Objective Caml . Program kan skrivas med vanlig syntax eller fast syntax , valet beror på programmerarens preferenser.
På samma sätt har en uppsättning program skrivna i OCaml förmågan att anpassa syntaxen för språket genom att lägga till nya operatorer.
Ett utmärkt exempel på att utöka ett språk med makron är deras användning i Lisp- familjen av programmeringsspråk . Medan dessa språk själva har enkla kärnor fokuserade på dynamiska typer, är standardtillbehör Schema , Common Lisp - imperativ , objektorienterad programmering fokuserade på statiska typer. Nästan alla dessa funktioner implementeras av syntaktiska förprocessorer, även om detta bär intrycket av kompileringssteget "makroexpansion" som kontrolleras av Lisp-kompilatorn. Detta kan fortfarande betraktas som en form av förbearbetning, eftersom det sker före resten av kompileringsstegen.
På liknande sätt kan typsäkra reguljära uttryck eller kodgenerering läggas till i syntaxen och semantiken för OCaml med hjälp av makron, såsom mikrotrådar (även kända som koroutiner eller fibrer ), monader eller transparent XML-behandling.
En av de ovanliga egenskaperna hos Lisp -familjen av språk är möjligheten att använda makron för att skapa ett inbäddat domänspecifikt programmeringsspråk . Vanligtvis, i ett stort antal projekt skrivna i Lisp, kan en modul skrivas på många sådana minispråk, d.v.s. en kan använda SQL- dialekten av Lisp, och en annan kan vara skriven i en GUI eller skrivarorienterad dialekt. och så vidare. Common Lisp- standardbiblioteket innehåller ett exempel på en sådan nivå av syntaktisk abstraktion i form av LOOP-makrot, som implementerar minispråk som Algol för att beskriva komplex iteration samtidigt som man behåller möjligheten att använda vanliga Lisp-operatorer.
Förprocessorn/språket MetaOCaml tillhandahåller liknande funktioner som ett externt domänspecifikt programmeringsspråk . Denna förprocessor, som tar emot en beskrivning av språkets semantik (den så kallade "tolkningen") och kombinerar tolkning under kompilering och kodgenerering, skickar denna definition till kompilatorn av OCaml- språket , som, baserat på detta språk, skapar bytekod eller naturlig kod.
Förprocessorer, som endast utför ett av översättningsstadierna, är fokuserade på uppgiften att bearbeta fragmentarisk data (till exempel att kompilera C- språket ). Liknande program, då kallade makroprocessorer , kan också vara avsedda för allmänna ändamål, det vill säga att de inte är avsedda att implementera en specifik användning eller programmeringsspråk, utan är designade för att använda ett brett utbud av databehandlingsuppgifter.
M4-makroprocessorn är förmodligen det mest kända exemplet på en sådan generell makroprocessor.