Preprocesor alebopredkompilátor je v informatikeprogram, ktorý spracováva svoje vstupné dáta, aby vytvoril výstup, ktorý sa používa ako vstup pre iný program. Výstup je považovaný zapredspracovanú formu vstupných údajov, ktoré často používajú niektoré následné programy, ako súkompilátory. Množstvo a druh vykonaného spracovania závisí od povahy preprocesora; niektoré preprocesory sú schopné vykonávať iba relatívne jednoduché textové substitúcie a rozšírenia makier, zatiaľ čo iné majú silu plnohodnotnýchprogramovacích jazykov.
Bežným príkladom zpočítačového programovania je spracovanie vykonané nazdrojovom kóde pred ďalším krokom kompilácie. V niektorýchpočítačových jazykoch (napr.C aPL/I) existuje fázaprekladu známa ako predspracovanie (preprocessing). Môže tiež zahŕňať spracovanie makier, zahrnutie súborov a jazykové prípony.
Lexikálne preprocesory sú najnižšou úrovňou preprocesorov, pretože vyžadujú ibalexikálnu analýzu, to znamená, že pracujú so zdrojovým textom pred akoukoľvekanalýzou vykonávaním jednoduchého nahradeniatokenizovaných sekvencií znakov za iné tokenizované sekvencie znakov podľa užívateľom definovaných pravidiel. Zvyčajne vykonávajúsubstitúciu makra,textové zahrnutie iných súborov a podmienenú kompiláciu alebo zahrnutie.
Najbežnejším príkladom jeC preprocesor, ktorý používa riadky začínajúce znakom '#' akodirektívy. Pretože nevie nič o základnom jazyku, jeho použitie bolo kritizované a mnohé z jeho funkcií sú priamo zabudované do iných jazykov. Napríklad makrá nahradené agresívnym vložením a šablónami, vrátane importov v čase kompilácie (to si vyžaduje zachovanie typových informácií v kóde objektu, čo znemožňuje spätné prispôsobenie tejto funkcie do jazyka);podmienená kompilácia sa v niektorých jazykoch efektívne vykonáva pomocouif-then-else aeliminácie mŕtveho kódu. Kľúčovým bodom na zapamätanie je však to, že všetky príkazy preprocesora by mali začínať na novom riadku.
Medzi ďalšie lexikálne preprocesory patrí univerzálny m4, ktorý sa najčastejšie používa v systémoch zostavovania medzi platformami, ako je autoconf, a GEMA, makroprocesor s otvoreným zdrojovým kódom, ktorý pracuje so vzormi kontextu.
Syntaktické preprocesory boli zavedené s rodinou jazykovLisp. Ich úlohou je transformovať syntaktické stromy podľa niekoľkých pravidiel definovaných používateľom. Pre niektoré programovacie jazyky sú pravidlá napísané v rovnakom jazyku ako program. To je prípadLisp aOCaml. Niektoré iné jazyky sa pri definovaní transformácií spoliehajú na úplne externý jazyk, ako napríklad preprocesorXSLT preXML alebo jeho staticky typovaný náprotivokCDuce.
Syntaktické preprocesory sa zvyčajne používajú na prispôsobenie syntaxe jazyka, rozšírenie jazyka pridaním nových primitív alebo vloženiedoménovo špecifického programovacieho jazyka (DSL) do jazyka na všeobecné použitie.
Dobrým príkladom prispôsobenia syntaxe je existencia dvoch rôznych syntaxov v programovacom jazykuObjective Caml. Programy môžu byť napísané ľahostajne pomocou „normálnej syntaxe“ alebo „revidovanej syntaxe“ a môžu byť na požiadanie pekne vytlačené s ktoroukoľvek syntaxou.
Podobne množstvo programov napísaných vOCaml prispôsobuje syntax jazyka pridaním nových operátorov.
Najlepšie príklady rozšírenia jazyka prostredníctvom makier možno nájsť v rodine jazykovLisp. Zatiaľ čo jazyky sú samy osebe jednoduchými dynamicky typovanými funkčnými jadrami, štandardné distribúcieScheme alebo Common Lisp umožňujú imperatívne alebo objektovo orientované programovanie, ako aj statické písanie. Takmer všetky tieto funkcie sú implementované syntaktickým predspracovaním, aj keď je potrebné poznamenať, že fázu kompilácie „rozširovania makra“ má na starosti kompilátor v Lispe. Toto možno stále považovať za formu predspracovania, pretože prebieha pred ďalšími fázami kompilácie.
Jednou z neobvyklých vlastností rodiny jazykovLisp je možnosť použitia makier na vytvorenie interného DSL. Vo veľkom projekte založenom na jazykuLisp môže byť modul zvyčajne napísaný v rôznych minijazykoch, jeden môže používať dialekt jazykaLisp založený naSQL, ďalší je napísaný v dialekte špecializovanom nagrafické používateľské rozhranie alebo peknú tlač atď. Štandardná knižnica Common Lisp obsahuje príklad tejto úrovne syntaktickej abstrakcie vo forme makra LOOP, ktoré implementuje minijazyk podobný Algolu na opis komplexnej iterácie, pričom stále umožňuje použitie štandardných operátorov Lisp.
Preprocesor/jazykMetaOCaml poskytuje podobné funkcie pre externé DSL. Tento preprocesor preberá popis sémantiky jazyka (tj tlmočníka) a kombináciou interpretácie v čase kompilácie a generovania kódu premení túto definíciu na kompilátor do programovacieho jazykaOCaml – az tohto jazyka buď do bajtkódu alebo do natívny kód.
Väčšina preprocesorov je špecifická pre konkrétnu úlohu spracovania údajov (napr.kompilácia jazyka C). Preprocesor môže byť propagovaný akovšeobecný, čo znamená, že nie je zameraný na konkrétne použitie alebo programovací jazyk a je určený na použitie pre širokú škálu úloh spracovania textu.
M4 je pravdepodobne najznámejším príkladom takéhoto preprocesora na všeobecné použitie, hoci preprocesor C sa niekedy používa v úlohe, ktorá nie je špecifická pre C.
Príklady:
GPP je všeobecný lexikálny preprocesor, ktorý sa podobá cpp. Okrem iného ho možno použiť na predbežné spracovanie markdown súborov.
Tento článok je čiastočný alebo úplný preklad článkuPreprocessor na anglickej Wikipédii.