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-elsea 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é

Reference

externí odkazy