Deklarativní programování

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

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. +more 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í. +more 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í. +more Příkladem mohou být unit testy, např. JUnit, NUnit….

Další skupinu jazyků řazené mezi deklarativní jazyky tvoří doménově specifické jazyky neboli jazyky pro řešení konkrétního problému. Tyto jazyky bývají typicky turingovsky neúplné. +more 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 doménově specifického 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. +more 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). +more % Šá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

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top