Förprocessor

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

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.

Förbearbetning i C/C++

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 programmeringsspråk

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

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

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.

Syntaxändringar

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.

Språktillägg

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.

Specialiserat språk

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.

Makroprocessor för allmänna ändamål

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.

Exempel

  • Använda C Preprocessor för att förbearbeta JavaScript - kod [2] .
  • Använder M4 (se exempel i artikeln) eller C-förprocessorn som en mallmotor för HTML - generering . [3]
  • imake (från interface make ) använder C-förprocessorn. Används i X Window System- projektet innan du bytte till autofabrikat .
  • grompp är en makroprocessor för modellfiler av GROMACS- projektet (Free Open Source Software for Computational Chemistry ). Som standard använder den C-förprocessorn, men vilken annan förprocessor som helst kan anges i modellfilen. Används för att validera uppmärkning. Använder direktiv #defineoch #include.

Intressanta fakta

  • Namnet på den ofta använda PHP -förprocessorn är en rekursiv akronym : PHP är " p hp: h ypertext preprocessor " .

Se även

Anteckningar

  1. Den reviderade syntaxen . Hämtad 13 juli 2008. Arkiverad från originalet 24 september 2015.
  2. T. Snyder. JavaScript är inte industriell styrka Arkiverad 16 januari 2008 på Wayback Machine Hur man använder C-förprocessorn för JavaScript-kod
  3. J. Korpela. Att använda en C-förprocessor som ett HTML-författarverktyg Arkiverad 8 december 2015 på Wayback Machine 2000.

Länkar