Deklarativní programování: Porovnání verzí

Přidáno 2 615 bajtů ,  před 13 lety
úprava přepracované verze
(úprava přepracované verze)
[[Deklarativní programování]] je styl programování postavenýzaloženo na myšlence, kdyprogramování seaplikací v jazycepomocí definujedefinic '''co se má udělat''' a ne '''jak se to má udělat'''. Opakem tohoto principu jsouje [[imperativní jazyky|imperativní programování]] popisující jednotlivé úkony pomocí [[algoritmus|algoritmů]]. Zjednodušeně to lze popsat tak, že imperativní programy obsahují algoritmy, kterými se dosáhne chtěný cíl, zatímco deklarativní jazyky specifikují cíl a algoritmizace je ponechána programu (interpretu) daného jazyka.
 
Deklarativní programování se snaží programátora ušetřit vytváření chyb, které běžně vznikají při tvorbě v imperativních jazycích. V imperativních jazycích je běžné mít proměnné globálního charakteru, do kterých zapisují ostatní funkce a metody. Toto je zdrojem mnoha chyb. Deklarativní jazyky se tento problém snaží řešit. Proměnné jsou v nich používány velmi střídmě, protože hodnoty se nejčastěji předávají ve formě návratové hodnoty určité funkce. Deklarativní jazyky také neobsahují prostředky, jak provézt cyklus známý jako do-while nebo for. Vše je řešeno pomocí rekurze.
 
K deklarativnímu programování lze přistupovat dvojím způsobem. Tím prvním je použití jazyka ze skupin [[programovací jazyk|programovacích jazyků]], které byly navrženy přímo pro deklarativní programování. Jsou to jazyky patřící mezi [[funkcionální programování|funkcionální programovací jazyky]], [[logické programování|logické programovací jazyky]] a [[programovací jazyky s omezujícími podmínkami]]. V těchto jazycích se zpravidla definuje množina funkčních závislostí nebo pravidel. Po spuštění takového programu jsou vyhodnocovány vstupy těmito podmínkami. V programech nebývá důležitá posloupnost jednotlivých pravidel, protože kód nebývá zpracováván lineárně tak, jak tomu bývá u imperativních programovacích jazyků.
Druhým přístupem je použití [[imperativní programování|imperativního jazyka]] s knihovnou pro podporu deklarativního programování. Jde vlastně jen o skrytí imperativních částí programového kódu a vlastní použití takovéto knihovny je v duchu deklarativního programování. Příkladem mohou být [[unit testing|unit testy]], např. [[JUnit]], [[NUnit]]...
 
Další skupinu jazyků řazené mezi deklarativní jazyky tvoří [[jazykydomain-specific proprograming řešení konkrétních problémůlanguage]] (Domain-specificneboli programmingjazyky language)pro řešení konkrétního problému. Tyto jazyky bývají typicky [[turingův stroj|turingovsky]] neúplné. Příkladem může být jazyk [[SQL]] pro manipulaci s daty v databázi, [[regulární výraz|regulární výrazy]], [[HTML]] jazyk pro definici obsahu webové stránky nebo i konfigurační soubory určité aplikace.
 
 
Deklarativní programovací jazyk, jako každý programovací jazyk, musí mít [[syntax]] a [[sémantika|sémantiku]]. Z tohoto důvodu do této skupiny nelze zařadit obecné [[XML]] bez definovaného [[DTD|doctype]] (významu dat).
 
== Příklady ==
 
* '''Jazyk [[SQL]]''' je typickým příkladem [[domain-specific programing language|domain-specific jazyka]] pro řešení konkrétních problémů. Je to dotazovací jazyk nad daty databáze.
<source lang="sql">
SELECT firstname, lastname FROM users ORDER BY lastname ASC;
</source>
Provede dotaz a vybere všechna jména a příjmení uživatelů z tabulky ''users'' a seřadí je podle příjmení.
 
* '''Jazyk [[Scheme]]''' je [[funkcionální programování|funkcionální jazyk]]. Příkladem může být definice faktoriálu:
<source lang="scheme">
(define (faktorial n)
(cond
[(> 1 n) 1]
[else (* n (faktorial (- n 1)))]
)
)
</source>
a jeho zavolání
<source lang="scheme">
(faktorial 5)
</source>
 
* '''Jazyk [[Prolog]]''' je jazyk pro [[logické programování]]. Definují se v něm pravidla a v dotazovacím módu se uživatel ptá interpreta na skutečnosti, které interpret přímo nezná, ale dokáže si je ze známých skutečností odvodit. Příkladem definování takových pravidel mohou být rodinné vztahy:
<source lang="text">
% Ladislav je rodičem Adriany
rodic(ladislav, adriana).
% Ladislav je rodičem Lubomíra
rodic(ladislav, lubomir).
% Šárka je rodičem Lubomíra
rodic(sarka, lubomir).
% definice sourozence
sourozenec(Sourozenec, X) :- rodic(Y, X), rodic(Y, Sourozenec), \+(Sourozenec = X).
</source>
pokud se pak potřebujeme zeptat jaké má Adriana sourozence, zapíšeme:
<source lang="text">
sourozenec(adriana, X).
</source>
Výstupem pak bude
<source lang="text">
X = lubomir ;
No
</source>
nebo jací jsou rodiče Lubomíra:
<source lang="text">
rodic(X, lubomir).
</source>
výsledkem bude:
<source lang="text">
X = ladislav ;
X = sarka ;
No
</source>
 
== Související články ==
13

editací