Předprocesor - Preprocessor
V počítačové vědě je preprocesor (nebo předkompilátor ) program, který zpracovává svá vstupní data a vytváří výstup, který se používá jako vstup do jiného programu. Výstup se říká, že je předem zpracovaný forma vstupních dat, který je často používán v některých dalších programů, jako je překladačů . Množství a druh provedeného zpracování závisí na povaze preprocesoru; některé preprocesory jsou schopny provádět pouze relativně jednoduché textové substituce a makro rozšíření, zatímco jiné mají sílu plnohodnotných programovacích jazyků .
Běžným příkladem počítačového programování je zpracování provedené na zdrojovém kódu před dalším krokem kompilace. V některých počítačových jazycích (např. C a PL/I ) existuje fáze překladu známá jako předzpracování . Může také zahrnovat zpracování makra, zahrnutí souboru a jazykové přípony.
Lexikální preprocesory
Lexikální preprocesory jsou nejnižší úrovní preprocesorů, protože vyžadují pouze lexikální analýzu , to znamená, že operují se zdrojovým textem před jakoukoli analýzou provedením jednoduché substituce tokenizovaných znakových sekvencí za jiné tokenizované znakové sekvence podle uživatelem definovaných pravidla. Obvykle provádějí substituci maker , textové zahrnutí jiných souborů a podmíněné kompilace nebo zahrnutí.
Preprocesor C.
Nejběžnějším příkladem je preprocesor C , který bere jako směrnice řádky začínající na '#' . Protože neví nic o základním jazyce, jeho použití bylo kritizováno a mnoho jeho funkcí bylo zabudováno přímo do jiných jazyků. Například makra nahrazená agresivním vkládáním a šablonami, zahrnující importy v době kompilace (to vyžaduje zachování informací o typu v kódu objektu, což znemožňuje dodatečné vybavení této funkce do jazyka); podmíněný překlad je efektivně provedeno s if-then-else
a mrtvý eliminace kód v některých jazycích. Klíčovým bodem k zapamatování je však to, že všechny směrnice preprocesoru by měly začínat na novém řádku.
Další lexikální preprocesory
Mezi další lexikální preprocesory patří univerzální m4 , nejčastěji používaný v multiplatformních sestavovacích systémech, jako je autoconf , a GEMA , open source makroprocesor, který pracuje na vzorcích kontextu.
Syntaktické preprocesory
S rodinou jazyků Lisp byly představeny syntaktické preprocesory . Jejich úkolem je transformovat stromy syntaxe podle řady uživatelsky definovaných pravidel. U některých programovacích jazyků jsou pravidla napsána ve stejném jazyce jako program (reflexe při kompilaci). To je případ Lisp a OCaml . Některé další jazyky se při definování transformací spoléhají na plně externí jazyk, například preprocesor XSLT pro XML nebo jeho staticky typovaný protějšek CDuce .
Syntaktické preprocesory se obvykle používají k přizpůsobení syntaxe jazyka, rozšíření jazyka přidáním nových primitiv nebo vložení programovacího jazyka specifického pro doménu (DSL) do jazyka pro obecné účely.
Přizpůsobení syntaxe
Dobrým příkladem přizpůsobení syntaxe je existence dvou různých syntaxí v programovacím jazyce Objective Caml . Programy mohou být psány lhostejně pomocí „normální syntaxe“ nebo „revidované syntaxe“ a mohou být pěkně vytištěny buď se syntaxí na vyžádání.
Podobně řada programů napsaných v OCaml přizpůsobuje syntaxi jazyka přidáním nových operátorů.
Rozšíření jazyka
Nejlepší příklady jazykového rozšíření prostřednictvím maker se nacházejí v rodině jazyků Lisp . Zatímco jazyky samy o sobě jsou jednoduchá dynamicky typovaná funkční jádra, standardní distribuce Scheme nebo Common Lisp umožňují imperativní nebo objektově orientované programování a také statické psaní. Téměř všechny tyto funkce jsou implementovány syntaktickým předzpracováním, ačkoli je třeba poznamenat, že fázi kompilace „makro expanze“ zpracovává kompilátor v Lispu. To lze stále považovat za formu předzpracování, protože probíhá před jinými fázemi kompilace.
Specializace na jazyk
Jednou z neobvyklých vlastností rodiny jazyků Lisp je možnost použití maker k vytvoření interního DSL. Typicky ve velkém projektu založeném na Lispu může být modul napsán v řadě takových minijazyků , jeden možná pomocí dialektu Lisp na bázi SQL , jiný napsaný v dialektu specializovaném na GUI nebo hezký tisk atd. Common Lisp Standardní knihovna obsahuje příklad této úrovně syntaktické abstrakce ve formě makra LOOP, které implementuje minijazyk podobný Algolu k popisu komplexní iterace, přičemž stále umožňuje použití standardních operátorů Lisp.
MetaOCaml preprocessor / jazyka poskytuje podobné funkce pro externí DSLs. Tento preprocesor přebírá popis sémantiky jazyka (tj. Tlumočníka) a kombinací interpretace v době kompilace a generování kódu převádí tuto definici na překladač do programovacího jazyka OCaml -a z tohoto jazyka buď do bytecode, nebo do nativní kód.
Preprocesor pro všeobecné použití
Většina preprocesorů je specifická pro konkrétní úlohu zpracování dat (např. Kompilace jazyka C). Preprocesor může být propagován jako obecný účel , což znamená, že není zaměřen na konkrétní použití nebo programovací jazyk a je určen k použití pro širokou škálu úloh zpracování textu.
M4 je pravděpodobně nejznámějším příkladem takového univerzálního preprocesoru, ačkoli C preprocesor je někdy používán v roli, která není specifická pro C. Příklady:
- pomocí preprocesoru C pro předzpracování JavaScriptu .
- pomocí preprocesoru C pro zpracování devicetree v jádře Linuxu .
- pomocí M4 (viz příklad na článku) nebo preprocesoru C jako šablony pro generování HTML .
- imake , rozhraní make využívající preprocesor C, napsané pro X Window System, ale nyní zastaralé ve prospěch automake .
- grompp , preprocesor pro vstupní soubory simulace pro GROMACS (rychlý, bezplatný, otevřený zdrojový kód pro některé problémy ve výpočetní chemii ), který volá preprocesor systému C (nebo jiný preprocesor určený vstupním souborem simulace) k analýze topologie, používá většinou mechanismy #define a #include k určení efektivní topologie za běhu grompp.
GPP je lexikální preprocesor pro obecné účely, který se podobá cpp. Mimo jiné jej lze použít k předzpracování značkovacích souborů.
Viz také
- Směrnice (programování) - Konstrukce jazyka, která určuje, jak má kompilátor zpracovat svůj vstup
- Metaprogramování
- Makra - V informatice výstižné znázornění vzoru
- Překladač zdroj-zdroj , také známý jako Transpiler-překladač, který přebírá zdrojový kód programu a vytváří ekvivalentní zdrojový kód ve stejném nebo jiném programovacím jazyce
- Sass (jazyk šablony stylů) - jazyk šablony stylů
- Stylus (jazyk šablony stylů)
- Méně (jazyk šablony stylů) - dynamický jazyk šablony stylů
- Fragment (programování) -malá oblast opakovaně použitelného zdrojového kódu, strojového kódu nebo textu
- Template engine - Software navržený tak, aby kombinoval šablony s datovým modelem a vytvářel tak výsledkové dokumenty
- C preprocesor - Macro preprocessor používají v C, C ++ a Objective-C programovací jazyky
- Preprocessor-docela-printer OCaml
- PL / I preprocessor
- Windows software trace preprocessor
- Univerzální makroprocesor -Makro procesor, který není svázán s konkrétním jazykem nebo softwarem nebo do něj není integrován.