Deklarativní programování: Porovnání verzí
m řaď jako hlavní článek |
m Robot: -zastaralá značka HTML |
||
Řádek 18: | Řádek 18: | ||
* '''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. |
* '''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. |
||
< |
<syntaxhighlight lang="sql"> |
||
SELECT firstname, lastname FROM users ORDER BY lastname ASC; |
SELECT firstname, lastname FROM users ORDER BY lastname ASC; |
||
</syntaxhighlight> |
|||
</source> |
|||
Provede dotaz a vybere všechna jména a příjmení uživatelů z tabulky ''users'' a seřadí je vzestupně podle příjmení. |
Provede dotaz a vybere všechna jména a příjmení uživatelů z tabulky ''users'' a seřadí je vzestupně podle příjmení. |
||
* '''Jazyk [[Scheme]]''' je [[funkcionální programování|funkcionální jazyk]]. Příkladem může být definice faktoriálu: |
* '''Jazyk [[Scheme]]''' je [[funkcionální programování|funkcionální jazyk]]. Příkladem může být definice faktoriálu: |
||
< |
<syntaxhighlight lang="scheme"> |
||
(define (faktorial n) |
(define (faktorial n) |
||
(if (= n 0) |
(if (= n 0) |
||
1 |
1 |
||
(* n (faktorial (- n 1)))))) |
(* n (faktorial (- n 1)))))) |
||
</syntaxhighlight> |
|||
</source> |
|||
a jeho zavolání |
a jeho zavolání |
||
< |
<syntaxhighlight lang="scheme"> |
||
(faktorial 5) |
(faktorial 5) |
||
</syntaxhighlight> |
|||
</source> |
|||
* '''Jazyk [[Prolog (programovací 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: |
* '''Jazyk [[Prolog (programovací 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: |
||
< |
<syntaxhighlight lang="text"> |
||
% Ladislav je rodičem Adriany |
% Ladislav je rodičem Adriany |
||
rodic(ladislav, adriana). |
rodic(ladislav, adriana). |
||
Řádek 45: | Řádek 45: | ||
% definice sourozence |
% definice sourozence |
||
sourozenec(Sourozenec, X) :- rodic(Y, X), rodic(Y, Sourozenec), \+(Sourozenec = X). |
sourozenec(Sourozenec, X) :- rodic(Y, X), rodic(Y, Sourozenec), \+(Sourozenec = X). |
||
</syntaxhighlight> |
|||
</source> |
|||
pokud se pak potřebujeme zeptat jaké má Adriana sourozence, zapíšeme: |
pokud se pak potřebujeme zeptat jaké má Adriana sourozence, zapíšeme: |
||
< |
<syntaxhighlight lang="text"> |
||
sourozenec(adriana, X). |
sourozenec(adriana, X). |
||
</syntaxhighlight> |
|||
</source> |
|||
Výstupem pak bude |
Výstupem pak bude |
||
< |
<syntaxhighlight lang="text"> |
||
X = lubomir ; |
X = lubomir ; |
||
No |
No |
||
</syntaxhighlight> |
|||
</source> |
|||
nebo jací jsou rodiče Lubomíra: |
nebo jací jsou rodiče Lubomíra: |
||
< |
<syntaxhighlight lang="text"> |
||
rodic(X, lubomir). |
rodic(X, lubomir). |
||
</syntaxhighlight> |
|||
</source> |
|||
výsledkem bude: |
výsledkem bude: |
||
< |
<syntaxhighlight lang="text"> |
||
X = ladislav ; |
X = ladislav ; |
||
X = sarka ; |
X = sarka ; |
||
No |
No |
||
</syntaxhighlight> |
|||
</source> |
|||
== Související články == |
== Související články == |
Verze z 13. 4. 2020, 18:49
Deklarativní programování je založeno na myšlence programování aplikací pomocí definic co se má udělat a ne jak se to má udělat. Opakem tohoto principu je imperativní programování popisující jednotlivé úkony pomocí 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.
Odlišnosti
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ést cyklus známý jako do-while nebo for. Vše je řešeno pomocí rekurze.
Přístupy k deklarativnímu programování
K deklarativnímu programování lze přistupovat dvojím způsobem. Tím prvním je použití jazyka ze skupin programovacích jazyků, které byly navrženy přímo pro deklarativní programování. Jsou to jazyky patřící mezi funkcionální programovací jazyky, 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é přesné pořadí 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í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 testy, např. JUnit, NUnit…
Další skupinu jazyků řazené mezi deklarativní jazyky tvoří domain-specific programing language neboli jazyky pro řešení konkrétního problému. Tyto jazyky bývají typicky turingovsky neúplné. Příkladem může být jazyk SQL pro manipulaci s daty v databázi, regulární výrazy nebo třeba jazyk XSL pro manipulaci s XML daty.
Deklarativní programovací jazyk, jako každý programovací jazyk, musí mít syntax a sémantiku. Z tohoto důvodu do této skupiny nelze zařadit obecné XML bez definovaného doctype (významu dat).
Příklady
- Jazyk SQL je typickým příkladem domain-specific jazyka pro řešení konkrétních problémů. Je to dotazovací jazyk nad daty databáze.
SELECT firstname, lastname FROM users ORDER BY lastname ASC;
Provede dotaz a vybere všechna jména a příjmení uživatelů z tabulky users a seřadí je vzestupně podle příjmení.
- Jazyk Scheme je funkcionální jazyk. Příkladem může být definice faktoriálu:
(define (faktorial n)
(if (= n 0)
1
(* n (faktorial (- n 1))))))
a jeho zavolání
(faktorial 5)
- 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:
% 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).
pokud se pak potřebujeme zeptat jaké má Adriana sourozence, zapíšeme:
sourozenec(adriana, X).
Výstupem pak bude
X = lubomir ;
No
nebo jací jsou rodiče Lubomíra:
rodic(X, lubomir).
výsledkem bude:
X = ladislav ;
X = sarka ;
No