<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.multimediaexpo.cz/mmecz/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Preprocesor</id>
		<title>Preprocesor - Historie editací</title>
		<link rel="self" type="application/atom+xml" href="http://www.multimediaexpo.cz/mmecz/index.php?action=history&amp;feed=atom&amp;title=Preprocesor"/>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor&amp;action=history"/>
		<updated>2026-04-29T06:34:15Z</updated>
		<subtitle>Historie editací této stránky</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor&amp;diff=324185&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor&amp;diff=324185&amp;oldid=prev"/>
				<updated>2013-09-20T07:41:55Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Starší verze&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Verze z 20. 9. 2013, 07:41&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	<entry>
		<id>http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor&amp;diff=324184&amp;oldid=prev</id>
		<title>Sysop: 1 revizi</title>
		<link rel="alternate" type="text/html" href="http://www.multimediaexpo.cz/mmecz/index.php?title=Preprocesor&amp;diff=324184&amp;oldid=prev"/>
				<updated>2010-10-21T17:20:27Z</updated>
		
		<summary type="html">&lt;p&gt;1 revizi&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''Preprocesor''' je [[počítačový program]], který zpracovává vstupní data tak, aby výstup mohl dále zpracovávat jiný program. Preprocesor je často používán pro předzpracování [[zdrojový kód|zdrojového kódu]] před vlastní [[Překladač|kompilací]]. Druh a míra předzpracování závisí zejména na schopnostech preprocesoru. Většina preprocesorů je relativně jednoduchá, zvládá nahrazování textu a jednoduchá [[Makro (software)|makra]]. Existují též sofistikované preprocesory, případně plně rozvinuté [[Programovací jazyk|programovací jazyky]].&lt;br /&gt;
&lt;br /&gt;
Některé programovací jazyky (například [[C (programovací jazyk)|jazyk C]]) vždy používají preprocesor ve fázi, která se nazývá ''preprocesing''.&lt;br /&gt;
&lt;br /&gt;
== Lexikální preprocesory ==&lt;br /&gt;
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 jako s obyčejným textem. Ve vstupním textu provádějí úpravy typu: najít a nahradit, použít makro, připojit externí soubor, atd.&lt;br /&gt;
&lt;br /&gt;
=== Preprocesing v jazyce C/C++ ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==== Připojení externích souborů ====&lt;br /&gt;
Preprocesoru v jazyce C/C++ se nejčastěji používá pro připojení [[Hlavičkový soubor|hlavičkových souborů]].&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;quot;...&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
nebo&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;#include &amp;lt;...&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozdíl mezi těmito příkazy je v umístění, kde bude preprocesor zadaný soubor hledat. &amp;quot;...&amp;quot; značí lokální hlavičkový soubor v projektu. &amp;lt;...&amp;gt; znamená soubor umístěný v některém společném úložišti hlavičkových souborů pro všechny projekty.&lt;br /&gt;
Na ukázku, připojení souborů &amp;lt;code&amp;gt;&amp;lt;[[math.h]]&amp;gt;&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;&amp;lt;[[stdio.h]]&amp;gt;&amp;lt;/code&amp;gt; ze standardní C/C++ knihovny umožňuje využívat matematické a I/O operace.&lt;br /&gt;
&lt;br /&gt;
Zmíněný lexikální preprocesor není schopný sám ohlídat vícenásobné připojení jednoho hlavičkového souboru nebo dokonce cyklické připojování hlavičkových souborů. Mnohonásobné připojení musí v tomto případě ohlídat programátor za pomocí podmíněného překladu. Mimo jiné je tento přístup pomalý, neboť je nutné před každou kompilací připojovat hlavičkové soubory i když se v nich nic nezměnilo.&lt;br /&gt;
&lt;br /&gt;
Od roku 1970, bylo vymyšleno mnoho alternativ hlavičkových souborů z jazyka C/C++. Tyto alternativy jsou mnohdy efektivnější, rychlejší a použití je přehlednější. Vybrané implementace sdí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#]] využívá importy jmených prostorů z připojených knihoven.&lt;br /&gt;
&lt;br /&gt;
==== Makra ====&lt;br /&gt;
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, i když je zapsán pouze jednou. Makra nemají vliv na rychlost překladu.&lt;br /&gt;
&lt;br /&gt;
Na ukázku:&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;#define max(a,b) a &amp;gt; b ? a : b&amp;lt;/source&amp;gt;&lt;br /&gt;
definuje makro &amp;lt;tt&amp;gt;max&amp;lt;/tt&amp;gt; se dvěma parametry &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;. Takovéto makro může být „voláno“ jako funkce (stejnou syntaxí).&lt;br /&gt;
Využití maker je v C/C++ velmi významné hlavně při ladění, kdy je možné rychle předefinovat makro a měnit tak kód na mnoha místech zaroveň.&lt;br /&gt;
&lt;br /&gt;
To, že se makra nechovají stejně jako funkce si ukážeme na následujícím příkladu, kde &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt; jsou dvě funkce vracející integer. Zavolání &amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;z = max(f(), g());&amp;lt;/source&amp;gt;&lt;br /&gt;
nevyčíslí &amp;lt;tt&amp;gt;f()&amp;lt;/tt&amp;gt;jednou a &amp;lt;tt&amp;gt;g()&amp;lt;/tt&amp;gt; taky jednou jak by se dalo čekat u funkce, nýbrž jedna z fukcí &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; nebo &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt; bude vyčíslena dvakrát (v závislosti na tom, která vrací větší číslo). Toto chování může mít za následek katastrofální chování v případě, že záleží na počtu volání &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; nebo &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==== Podmíněný překlad ====&lt;br /&gt;
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í nebo je platformě závislý. Takto je možné do jednoho zdrojového kódu napsat program kompilovatelný pro více platforem, či různé jazykové mutace, ...&lt;br /&gt;
&lt;br /&gt;
Nejčastěji se používá následující konstrukce:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SOUBOR_H&lt;br /&gt;
#define SOUBOR_H&lt;br /&gt;
...(zdrojový kód hlavičkového souboru)...&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Programátor tím zabraňuje mnohonásobnému připojení hlavičkového souboru. Tímto problémem jsme se zabývali výše.&lt;br /&gt;
&lt;br /&gt;
Podmíněný překlad je možné využít v kompexnějších případech jako je tento:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #ifdef DEBUG&lt;br /&gt;
 ...&lt;br /&gt;
 #else&lt;br /&gt;
 ...&lt;br /&gt;
 #endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
nebo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 #if DEBUG&lt;br /&gt;
 ...&lt;br /&gt;
 #else&lt;br /&gt;
 ...&lt;br /&gt;
 #endif&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naneštěstí většina moderních programovacích jazyků odstraňuje tuto schopnost a uchyluje se k tradičnímu použití &amp;lt;code&amp;gt;if...then...else...&amp;lt;/code&amp;gt;. To má za následek pomalejší běh programu, neboť podmínka musí být vyhodnocena za běhu programu a nikoliv pouze při kompilaci.&lt;br /&gt;
&lt;br /&gt;
== Syntaktické preprocesory ==&lt;br /&gt;
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 definována v jiných jazycích jako například [[XSLT]] preprocesor pro [[XML]].&lt;br /&gt;
&lt;br /&gt;
Syntaktické preprocesory jsou typicky použity pro individuální přizpůsobení jazyka, doplnění nových primitiv, atd. Takto je možné dosáhnout všeobecně použitelného programovacího jazyka.&lt;br /&gt;
&lt;br /&gt;
=== Přizpůsobení syntaxe ===&lt;br /&gt;
Pěkný příklad naleznete na internetové 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átorem.&lt;br /&gt;
&lt;br /&gt;
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++.&lt;br /&gt;
&lt;br /&gt;
=== Specializace jazyka ===&lt;br /&gt;
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 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, kdy se k využívá ke složitému iterování v cyklu minijazyk založený na jazyce [[Algol]].&lt;br /&gt;
&lt;br /&gt;
== Univerzální preprocesory ==&lt;br /&gt;
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. ''univerzální'' preprocesory, které nejsou svázány s konkrétním jazykem. V takových případech je možné preprocesor &amp;quot;programovat&amp;quot; vlastními pravidly pro konkrétní programovací jazyk.&lt;br /&gt;
&lt;br /&gt;
== Související články ==&lt;br /&gt;
* [[Preprocesor jazyka C]]&lt;br /&gt;
&lt;br /&gt;
== Externí odkazy ==&lt;br /&gt;
* [http://lispm.dyndns.org/news?ID=NEWS-2005-07-08-1 DSL Design in Lisp]&lt;br /&gt;
* [http://www.paulgraham.com/progbot.html Programming from the bottom up]&lt;br /&gt;
* The [http://www.nothingisreal.com/gpp/gpp.html Generic PreProcessor]&lt;br /&gt;
* Gema, the [http://gema.sourceforge.net General Purpose Macro Processor]&lt;br /&gt;
* 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]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programování]]&lt;br /&gt;
{{Článek z Wikipedie}} [[Kategorie:Počítačové jazyky]]&lt;/div&gt;</summary>
		<author><name>Sysop</name></author>	</entry>

	</feed>