Smazaný obsah Přidaný obsah
Doplnění některých informací. Správné nastavení odkazů.
Formulace
Řádek 1:
'''Preprocesor''' je [[počítačový program]], který zpracovává svá vstupní data tak, aby výstup mohl dále zpracovávat jiný program. ČastýmPreprocesor příkladem,je kdyčasto sepoužíván používá preprocesor, jepro předzpracování [[zdrojový kód|zdrojového kódu]] před dalším krokem, kterým jevlastním [[Překladač|kompilacekompilací]]. Druh a míra předzpracování závisí primárnězejména na požadavcíchschopnostech kompilátorupreprocesoru. Většina preprocesorů je relativně jednoduchá, zvládá nahrazování textu a jednoduchá [[makroMakro (software)|makra]]. MaléExistují procentotéž preprocesorůsofistikované disponujepreprocesory, silnýmipřípadně prostředkyplně narozvinuté zpracování[[Programovací programovacíhojazyk|programovací jazyka. V takových případech není zpravidla nutné používat složité kompilátoryjazyky]].
 
Některé programovací jazyky (například [[C (programovací jazyk)|jazyk C]]) vždy používají preprocesor ve fázi, která se nazývá ''preprocesing''.
==Lexikální preprocesory==
 
== Lexikální preprocesory ==
Lexikální preprocesory jsou nejnižším stupněm preprocesorů. Pro svoji činnost využívají pouze [[lexikální analýza|lexikální analýzu]], tzn. že, pracují se zdrojovým kódem pouze jako s textem. Ve vstupním textu provádějí úpravy typu: najít a nahradit, použít makro, připojit externí soubor, atd.
 
=== Preprocesing v jazyce C/C++ ===
Nejznámějším a hojně využívaným preprocesorem je [[Preprocesor jazyka C|preprocesor jazyka C/C++]]. Tento preprocesor funguje na výše zmíněném principu.
 
==== Připojení externích souborů ====
Preprocesoru v jazyce C/C++ se nejčastěji používá pro připojení hlavičkových souborů.
<source lang="c">#include "..."</source>
Řádek 19 ⟶ 21:
Od roku 1970, bylo vymyšleno mnoho alternativ hlavičkových souborů používaných v jazyce C/C++. Tyto alternativy jsou mnohdy efektivnější, rychlejší a použití je přehlednější. Vybrané implementace zdílených souborů: [[Java_(programovací_jazyk)|Java]] a [[Common Lisp]] používají balíčky, [[Pascal_(programovací_jazyk)|Pascal]] má unity, [[Modula-2|Modula]], [[OCaml]], [[Haskell_(programovací_jazyk)|Haskell]] a [[Python]] mají moduly a [[C_Sharp|C#]] podobně jako Java využívá importy balíčků.
 
==== Makra ====
Makra jsou primárně používána v jazyce C. Umožňují vkládat drobné části kódu na mnoho míst, čímž se šetří velikost zdrojového kódu a přehlednost. V makrech je možné používat i zástupné znaky (něco jako parametry funkcí). Makra jsou zpracovávána preprocesorem, proto je tento kód kompilovám vícekrát, ikdyž je zapsán pouze jednou. Makra nemají vliv na rychlost překladu.
 
Řádek 32 ⟶ 34:
Většina moderních programovacích jazyků již nevyužívá tyto možnosti maker, právě z těchto nejednoznačných důvodů a snadného zaměnění za funkce. Z toho důvodu existují v dnešních jazycích pouze funkce nebo metody.
 
====Podmíněná kompilacePodmíněný překlad ====
Preprocesor jazyka C/C++ podporuje podmíněnou kompilaci. To umožňuje mít více verzí stejného kódu, který se například liší ve výpisu logovacích informací a podobně. Takto je možné do jednoho zdrojového kódu napsat program kompilovatelný na více platforem, či různé jazykové mutace, ...
 
Řádek 63 ⟶ 65:
Naneštěstí většina moderních programovacích jazyků odstraňuje tuto schopnost a uchyluje se k tradičnímu použití <code>if...then...else...</code>. To má ale za následek pomalejší běh programu, neboť tato podmínka musí být vyhodnocena za běhu programu a nikoliv pouze při kompilaci.
 
== Syntaktické preprocesory ==
Syntaktické preprocesory byly poprvé představeny v jazyce [[Lisp]]. Jejich úkolem je převést syntaktické strom na sérii uživatelem definovaných přepisovacích pravidel. V několika jazycích jsou pravidla napsána ve stejném jazyce jako program (compile-time reflection), případ právě jazyka [[Lisp]] a [[OCaml]]. Ostatní jazyky mají tyto pravidla definovaná v jiných jazycích jako například [[XSLT]] preprocesor pro [[XML]] nebo statické [[CD]].
 
Syntaktické preprocesory jsou typicky použity kepro custimizaciindividuální přizpůsobení jazyka, doplnění nových primitiv, atd. Takto je možné dosáhnout všeobecně použitelného jazyka.
 
=== Přizpůsobení syntaxe ===
Dobrý příklad se nachází na adrese http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html. Program může být zapsán dvěma různými syntaxemi při zachování stejné funkčnosti a záleží hlavně na subjektivním posouzení programátora.
 
Velký počet programů napsaných v [[OCaml]] přispůsobuje syntaxi doplněním nových operátorů. Definici vlastních operátorů podporuje i jazyk C++.
 
=== Specializace jazyka ===
Jedna z neobvyklých vlastností jazyka [[Lisp]] je možnost použít makra k vytvoření vlastního minijazyka uvnitř projektu. Typicky ve velkých projektech bývají některé moduly napsány v takovýchto minijazycích. Modul pro přístup k [[SQL]] databázi využívá dialekt se základem právě v SQL příkazech. Jiné moduly mohou využívat jiné minijazyky, například modul pro práci s [[GUI]], tiskem, atd. Standardní knihovna [[Common Lisp]] obsahuje příklad tohoto typu, kdy se k využívá ke složitému iterování v cyklu minijazyk založený na jazyce [[Algol]].
 
== Všeobecně použitelné preprocesory ==
Drtivá většina preprocesorů je zaměřena na jeden konkrétní jazyk, resp. spolupracuje s konkrétním kompilátorem. Ale existují také tzv. ''všeobecně použitelné'' preprocesory, které nejsou svázány s konkrétním jazykem. V takovýchto případech je možné preprocesor "programovat" vlastními pravidly pro každý konkrétní jazyk.
 
== Související články ==
===Externí zdroje===
* [[Preprocesor jazyka C]]
 
=== Externí zdroje=odkazy ==
* [http://lispm.dyndns.org/news?ID=NEWS-2005-07-08-1 DSL Design in Lisp]
* [http://www.paulgraham.com/progbot.html Programming from the bottom up]
Řádek 85 ⟶ 90:
* Gema, the [http://gema.sourceforge.net General Purpose Macro Processor]
* The [[PIKT]] [http://pikt.org/pikt/ref/ref.4.piktc.html piktc] [http://pikt.org/pikt/ref/ref.3.html text, script, and configuration file preprocessor]
 
== Související články ==
*[[Preprocesor jazyka C]]
 
[[Kategorie:Programování]]