Preprocesor: Porovnání verzí
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á
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.
====
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
=== 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]]▼
* [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í]]
|