Preprocesor: Porovnání verzí

Odebráno 1 740 bajtů ,  před 12 lety
Doplnění některých informací. Správné nastavení odkazů.
(Doplnění textu převážně z anglické verze)
(Doplnění některých informací. Správné nastavení odkazů.)
Avšak takovýto lexikální preprocesor není schopný ohlídat vícenásobné připojení jednoho hlavičkového souboru nebo dokonce cyklické připojování hlavičkových souborů. Mimo jiné je takovýto přístup pomalý, neboť je nutné před každou kompilací připojovat hlavičkové soubory, ikdyž se v nich nic nezměnilo.
 
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 Java_(programming languageprogramovací_jazyk)|Java]] a [[Common Lisp]] používají balíčky, [[Pascal Pascal_(programming languageprogramovací_jazyk)|Pascal]] má unity, [[Modula-2|Modula]], [[OCaml]], [[Haskell Haskell_(programming languageprogramovací_jazyk)|Haskell]] a [[Python (programming language)|Python]] mají moduly a [[C_Sharp|C#]] podobně jako Java využívá importy balíčků.
 
====Makra====
 
==Syntaktické preprocesory==
Syntaktické preprocesory byly poprvé představeny v jazyce [[Lisp programming language|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 programming language|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 ke custimizaci 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 syntaxemysyntaxemi 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]].
===Extending a language===
The best examples of language extension through macros are found in the [[Lisp programming language|Lisp]] family of languages. While the languages, by themselves, are simple dynamically-typed functional cores, the standard distributions of [[Scheme (programming language)|Scheme]] or [[Common Lisp]] permit imperative or object-oriented programming, as well as static typing. Almost all of these features are implemented by syntactic preprocessing, although it bears noting that the "macro expansion" phase of compilation is handled by the compiler in Lisp. This can still be considered a form of preprocessing, since it takes place before other phases of compilation.
 
==Všeobecně použitelné preprocesory==
Similarly, statically-checked, type-safe [[regular expressions]] or [[code generation]] may be added to the syntax and semantics of [[OCaml]] through macros, as well as micro-threads (also known as [[coroutines]] or [[fiber (computer science)|fibers]]), [[Monads in functional programming|monads]] or transparent XML manipulation.
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.
 
===Specializing a language===
One of the unusual features of the [[Lisp programming language|Lisp]] family of languages is the possibility of using macros to create an internal
[[Domain-specific programming language|Domain-Specific Programming Language]]. Typically, in a large [[Lisp programming language|Lisp]]-based project, a module may be written in a variety of such minilanguages, one perhaps using a [[SQL]]-based dialect of [[Lisp programming language|Lisp]], another written in a dialect specialized for GUIs or pretty-printing, etc. [[Common Lisp]]'s standard library contains an example of this level of syntactic abstraction in the form of the LOOP macro, which implements an Algol-like minilanguage to describe complex iteration, while still enabling the use of standard Lisp operators.
 
The [[MetaOCaml]] preprocessor/language provides similar features for external [[Domain-specific programming language|Domain-Specific Programming Languages]]. This preprocessor takes the description of the semantics of a language (i.e. an interpreter) and, by combining compile-time interpretation and code generation, turns that definition into a compiler to the [[OCaml]] programming language -- and from that language, either to bytecode or to native code.`
 
==General purpose preprocessor==
Most preprocessors are specific to a particular data processing task (e.g., [[compilers|compiling]] the [[C (programming language)|C]] language). A preprocessor may be promoted as being ''general purpose'', meaning that it is not aimed at a specific usage or programming language, and is intended to be used for a wide variety of text processing tasks.
-->
 
===Externí zdroje===