**Deklaratiivne programmeerimine** on arvutiteaduses kasutatav programmeerimise paradigma, kus programmide struktuur ja elemendid, mis väljendavad arvutuste loogikat, ei kirjelda programmi juhtimisvoogu. Deklaratiivne programmeerimine defineeritakse sageli kui kõik mitteimperatiivsed programmeerimise stiilid. Leidub ka definitsioone, mis ei defineeri seda imperatiivse programmeerimise kaudu.

Näiteks:

* kõrgetasemeline programm, mis kirjeldab, mida arvutus peaks täitma;
* keel, mis on selges vastavuses matemaatilise loogikaga.

Deklaratiivne programmeerimine
------------------------------

Deklaratiivne keel, erinevalt imperatiivsest keelest, kirjeldab otseselt matemaatilisi objekte ja abstraktseid seoseid nende vahel. Deklaratiivne programm koosnebki deklaratsioonidest. Deklaratiivses keeles ei kasutada tavapäraseid silmuseid (*loops*) ja *if/then* tingimusi. Deklaratiivses programmeerimises pole küll vaja arvutuslike protsesse kirjeldada, kuid siiski tuleb nendega programmeerimisel arvestada ja seega nõuab deklaratiivse keele õppimine rohkem aega ja mõttetööd.

Deklaratiivne ja imperatiivne programmeerimine tekkisid üsna samal ajal – aastal 1936. Tänapäeval on populaarsemad imperatiivsed keeled. Tehisintellekti ringkonnas ja akadeemilises arvutiteaduses on deklaratiivsete keelte kasutamine näidanud häid tulemusi.

Paljud programmeerimiskeeled võimaldavad ka imperatiivse ja deklaratiivse paradigma kombineerimist. Näiteks võib tuua Javas kasutavad märkused (inglise k *annotations*), mis lisavad imperatiivsele koodile deklaratiivse võimekuse.

Alamparadigmad
--------------

Deklaratiivse programmeerimise kaks põhiklassi on funktsionaalsed keeled ja loogilised keeled. Deklaratiivsete keelte hulka kuuluvad ka relatsioonikeeled.

### Loogilised programmeerimiskeeled

Loogilised programmeerimiskeeled põhinevad formaalsetel loogikareeglitel. Kõige kasutatavam loogilise programmeerimise keel on Prolog. 

Loogilises programmeerimiskeeles kirjutatud programm koosneb loogilises vormis lausetest, mis väljendavad fakte ja reegleid mingi probleemi kohta. Reeglid kirjutatakse klauslitena ja loetakse deklaratiivselt kui loogilised implikatsioonid.

### Funktsionaalsed programmeerimiskeeled

Funktsionaalses keeles esitatakse arvutused avaldisena ja masina töö on selle väärtustamine ja täitmine. Funktsionaalsed programmid koosnevadki suuremal hulgal definitsioonidest, mis kirjeldavad seoseid andmete vahel.

Funktsionaalsetest programmeerimiskeeltest on tuntuimad Sisal, Concurrent ML ja Haskell. On tõestatud, et Sisal on väga efektiivne paralleelprogrammeerimiseks.

### Relatsioonikeeled

Andmebaasi päringukeeli võib pidada deklaratiivseks, kuna päringutes kirjeldatakse, mis ülesandeid on vaja täita, kuid ei anta täpseid juhiseid, kuidas neid täita. Andmebaasi päringud keskenduvad rohkem tulemusele ja vähem täpsetele ülesannete täitmise detailidele. Kuigi päringukeeltel on ka imperatiivseid lisafunktsioone, loetakse neid siiski deklaratiivse programmeerimisstiili alla. Näiteks on deklaratiivsed päringukeeled Cypher, SPARQL ja Gremlin.

Deklaratiivseid päringukeeli peetakse lihtsasti arusaadavateks ja kergelt kasutatavateks, kuna nad keskenduvad tulemuse leidmisele ja jõuavad vastuseni kiirelt.

Viited
------

1. ↑  Lloyd, J.W. Practical Advantages of Declarative Programming
2. ↑  Chakravarty, Manuel M. T. (14 February 1997). On the Massively Parallel Execution of Declarative Programs (Doctoral dissertation). Technische Universität Berlin
3. 1 2 3 4  "http://kodu.ut.ee/~nestra/mat/inf/p/d/f/fpm/07s/pr/pr.pdf" (PDF). Originaali (PDF) arhiivikoopia seisuga 15.11.2018. Vaadatud 30.11.2018. `{{netiviide}}`: välislink kohas ``|Pealkiri=`` (juhend)
4. 1 2  "https://searchitoperations.techtarget.com/definition/declarative-programming". Vaadatud 30.11.2018. `{{netiviide}}`: välislink kohas ``|Pealkiri=`` (juhend)
5. ↑  M.Baldoni, C.Baroglio, V.Mascardi, A.Omicini, P.Torroni (n.d.), Agents, Multi-Agent Systems and Declarative Programming: What, When, Where, Why, Who, How?
6. 1 2  Timothy G. Mattson, Beverly Sanders, Berna Massingill, Patterns for Parallel Programming
7. ↑  "http://foldoc.org/declarative%20language". Vaadatud 28.11.2018. `{{netiviide}}`: välislink kohas ``|Pealkiri=`` (juhend)
8. ↑  U.Nilsson,J.MaÃluszy´nski, LOGIC, PROGRAMMING AND PROLOG 2nd Edition
9. ↑  "https://dzone.com/articles/imperative-vs-declarative-query-languages-whats-th". Vaadatud 28.11.2018. `{{netiviide}}`: välislink kohas ``|Pealkiri=`` (juhend)