Deklarativ programmalastırıw

Kompyuter iliminde, **deklarativ programmalastırıw** — bul kompyuter programmalarınıń strukturasın hám elementlerin qurıw stili, esaplaw logikasın onıń basqarıw aǵımın táriyiplemesten ańlatatuǵın programmalastırıw paradigması.

Bul stildi qollanatuǵın kóplegen tiller programmalıq támiynattıń orınlanıw usılın programmalastırıw tili primitivleriniń izbe-izligi retinde táriyiplew ornına, programma máseleniń tarawı boyınsha neni orınlawı kerekligin táriyiplew arqalı qosımsha tásirlerdi minimallastırıwǵa yamasa joq etiwge umtıladı (orınlanıw usılı tildiń implementaciyasına qaldırıladı). Bul algoritmlerdi anıq qádemler menen ámelge asıratuǵın imperativ programmalastırıwǵa qarama-qarsı.

Deklarativ programmalastırıw kóbinese programmalardı formal logikanıń teoriyaları, al esaplawlardı sol logika keńisligindegi juwmaqlar retinde qarastıradı. Deklarativ programmalastırıw parallel programmalardı jazıwdı ádewir ańsatlastırıwı múmkin.

Keń tarqalǵan deklarativ tillerge maǵlıwmatlar bazası soraw tilleri (mısalı, SQL, XQuery), turaqlı ańlatpalar, logikalıq programmalastırıw (mısalı, Prolog, Datalog, juwaplar toplamın programmalastırıw), funkcional programmalastırıw, konfiguraciyanı basqarıw hám algebralıq modellestiriw sistemaları kiredi.

## Anıqlaması
Deklarativ programmalastırıw kóbinese imperativ emes hár qanday programmalastırıw stili retinde anıqlanadı. Basqa da bir qatar keń tarqalǵan anıqlamalar onı tek imperativ programmalastırıw menen salıstırıw arqalı anıqlawǵa háreket etedi. Mısalı:

* Esaplawdıń neni orınlawı kerekligin táriyipleytuǵın joqarı dárejeli programma.
* Qosımsha tásirleri joq yamasa anıǵıraq aytqanda, siltemelik ashıqlıǵı bar hár qanday programmalastırıw tili.
* Matematikalıq logika menen anıq sáykesligi bar til.

Bul anıqlamalar ádewir dárejede bir-birin basıp ótedi.

Deklarativ programmalastırıw — bul programmalar orınlanıwı kerek bolǵan buyrıqlardı yamasa qádemlerdi anıq kórsetpesten, ózleriniń qálegen nátiyjelerin táriyipleytuǵın imperativ emes programmalastırıw stili. Funkcional hám logikalıq programmalastırıw tilleri deklarativ programmalastırıw stili menen xarakterlenedi. Logikalıq programmalastırıwda programmalar logikalıq formada ańlatılǵan sózler diziminen ibarat boladı hám esaplaw sol sózler dizimin logikalıq formada ańlatılǵan máselelerdi sheshiw ushın paydalanadı.

Haskell sıyaqlı taza funkcional tilde barlıq funkciyalar qosımsha tásirlerge iye emes hám jaǵday ózgerisleri tek jaǵdaydı túrlendiretuǵın funkciyalar retinde kórsetiledi, bul jaǵdaydıń ózi programmada birinshi dárejeli obyekt retinde anıq kórsetiledi. Taza funkcional tiller imperativ emes bolsa da, olar kóbinese funkciyanıń tásirin qádemler izbe-izligi retinde táriyiplew ushın imkaniyat beredi. Lisp, OCaml hám Erlang sıyaqlı basqa funkcional tiller proceduralıq hám funkcional programmalastırıwdıń aralaspasın qollap-quwatlaydı.

Prolog sıyaqlı geypara logikalıq programmalastırıw tilleri hám SQL sıyaqlı maǵlıwmatlar bazası soraw tilleri, principte deklarativ bolsa da, sonday-aq proceduralıq programmalastırıw stilin de qollap-quwatlaydı.

## Kishi paradigmalar
Deklarativ programmalastırıw — bul bir qatar jaqsı belgili programmalastırıw paradigmaların óz ishine alǵan ulıwma termin.

### Sheklewli programmalastırıw
Sheklewli programmalastırıw maqsetli sheshimniń qásiyetlerin kórsetetuǵın sheklewler formasında ózgeriwshiler arasındaǵı qatnaslardı bildiredi. Sheklewler toplamı hárbir ózgeriwshige sheshimniń maksimal sanlı sheklewlerge sáykes keliwi ushın mánis beriw arqalı sheshiledi. Sheklewli programmalastırıw kóbinese basqa paradigmalarǵa: funkcional, logikalıq yamasa hátte imperativ programmalastırıwǵa tolıqtırıwshı boladı.

### Arnawlı taraw tilleri
Deklarativ arnawlı taraw tilleri (DSL) arasında keń tarqalǵan mısallarǵa yacc parser generatorınıń kirgiziw tili, QML, Make qurılıs specifikaciya tili, Puppet konfiguraciyanı basqarıw tili, turaqlı ańlatpalar, Datalog, juwaplar toplamın programmalastırıw hám SQL-dıń bir bólimi (mısalı, SELECT sorawları) kiredi. DSL-lerdiń paydalı bolıwı hám sol waqıtta Tyuring-tolıq bolıwı minnetli emesligi artıqmashılıǵı bar, bul tildiń taza deklarativ bolıwın ańsatlastıradı.

HTML, MXML, XAML, XSLT yamasa basqa paydalanıwshı interfeysin belgilew tilleri sıyaqlı kóp belgilew tilleri kóbinese deklarativ bolıp tabıladı. Mısalı, HTML tek veb-bette neniń payda bolıwı kerekligin táriyipleydi — ol bettiń renderleniwi ushın basqarıw aǵımın da, bettiń paydalanıwshı menen múmkin bolǵan óz-ara tásirin de kórsetpeydi.

2013-jılǵa kelip, geypara programmalıq támiynat sistemaları[qaysıları?] dástúrli paydalanıwshı interfeysin belgilew tillerin (mısalı, HTML) járiyalanǵan interfeysti qollap-quwatlaw ushın backend server sistemalarınıń neni (biraq qalay emes) islewi kerekligin anıqlaytuǵın deklarativ belgilew menen biriktiredi. Bunday sistemalar, ádette arnawlı taraw XML atlar keńisligin paydalanıp, SQL maǵlıwmatlar bazası sintaksisiniń abstrakciyaların yamasa reprezentativ jaǵday ótkiziw (REST) hám SOAP paydalanıp veb-xızmetlerge parametrli shaqırıwlardı óz ishine alıwı múmkin.

### Funkcional programmalastırıw
Haskell, Scheme hám ML sıyaqlı funkcional programmalastırıw tilleri funkciya qollanıwı arqalı ańlatpalardı bahalaydı. Baylanıslı, biraq anaǵurlım imperativ bolǵan proceduralıq programmalastırıw paradigmasınan ayırmashılıǵı, funkcional programmalastırıw anıq izbe-izlikke az itibar beredi. Onıń ornına, esaplawlar hár túrli rekursiv joqarı dárejeli funkciya qollanıwı hám kompoziciyası menen sıpatlanadı hám solay etip, olardı ápiwayı túrde domenler menen kodomenler arasındaǵı bir qatar sáwlelendiriwler retinde qarawǵa boladı. ML hám Lisp shańaraqlarındaǵı kópshilikti qosqanda, kóp funkcional tiller taza funkcional emes hám solay etip programmalarda jaǵdayǵa baylanıslı tásirlerdi kirgiziwge imkaniyat beredi.

### Gibrid tiller
Mısalı, Makefile-lar ǵárezliliklerdi deklarativ usılda kórsetedi, biraq sonday-aq orınlanıwı kerek bolǵan háreketlerdiń imperativ dizimin de óz ishine aladı. Sonday-aq, yacc kontekstsiz grammatikanı deklarativ túrde kórsetedi, biraq kóbinese imperativ bolatuǵın (mısalı, C) qabıllawshı tilden alınǵan kod bólimlerin de óz ishine aladı.

### Logikalıq programmalastırıw
Prolog, Datalog hám juwaplar toplamın programmalastırıw sıyaqlı logikalıq programmalastırıw tilleri maqsettiń programmanıń logikalıq aqıbeti ekenin dálillew arqalı yamasa maqsettiń programma tárepinen anıqlanǵan modelde durıs ekenin kórsetiw arqalı esaplaydı. Prolog maqsetlerdi kishi maqsetlerge qısqartıw arqalı, joqarıdan tómenge keri oylaw arqalı esaplaydı, al kópshilik Datalog sistemaları tómennen joqarıǵa alǵa oylaw arqalı esaplaydı. Juwaplar toplamı programmaları ádette programmanıń modelin payda etiw ushın SAT sheshiwshilerin paydalanadı.

### Modellestiriw
Fizikalıq sistemalardıń modelleri yamasa matematikalıq kórinisleri deklarativ bolǵan kompyuter kodında ámelge asırılıwı múmkin. Kodta imperativ tayınlawlar emes, al minez-qulıq qatnasların táriyipleytuǵın («járiyalaytuǵın») bir qatar teńlemeler bar. Model usı formalizmde ańlatılǵanda, kompyuter sheshim algoritmin eń jaqsı formulirovkalaw ushın algebralıq manipulyaciyalardı orınlay aladı. Matematikalıq sebep-aqıbet baylanısı ádette fizikalıq sistemanıń shegaralarında belgilenedi, al sistemanıń óziniń minez-qulıq sıpatlaması deklarativ yamasa sebepsiz boladı. Deklarativ modellestiriw tilleri hám ortalıqları Analytica, Modelica hám Simile-di óz ishine aladı.

## Mısallar

### Lisp
Lisp — bul matematikalıq belgilewden hám Alonzo Cherchtiń lyambda esaplawınan erkin ilhamlanǵan programmalastırıw tilleriniń shańaraǵı. Common Lisp sıyaqlı geypara dialektler tiykarınan imperativ, biraq funkcional programmalastırıwdı qollap-quwatlaydı. Scheme sıyaqlı basqaları funkcional programmalastırıw ushın proektlestirilgen.

Scheme-de faktorial funkciyasın tómendegishe anıqlawǵa boladı:
```scheme
(define (factorial n)
    (if (= n 0)                     
        1                             ;;; 0! = 1
        (* n (factorial (- n 1)))))   ;;; n! = n*(n-1)!
```
Bul faktorial funkciyanı onıń rekursiv anıqlaması arqalı anıqlaydı. Kerisinshe, imperativ til ushın proceduranı anıqlaw kóbirek ádettegi.

Lisplerde hám lyambda esaplawında funkciyalar ulıwma alǵanda birinshi dárejeli puqaralar bolıp tabıladı. Erkin aytqanda, bul funkciyalardıń basqa funkciyalar ushın kiris hám shıǵıs bola alatuǵının bildiredi. Bul geypara funkciyalardıń anıqlamasın ápiwayılastırıwı múmkin.

Mısalı, Racket tilinde birinshi n kvadrat sanlardı shıǵaratuǵın funkciyanı jazıw tómendegishe orınlanıwı múmkin:
```scheme
(define (first-n-squares n)
    (map (lambda (x) (* x x))          ;;; A sáwlelendiriwshi funkciya x -> x^2
         (range n)))                   ;;; Birinshi n natural sandı dizimge aladı
```
map funkciyası funkciyanı hám dizimdi qabıl etedi; shıǵıs — bul kiris dizimniń hárbir elementine kiris funkciyasınıń nátiyjeleri dizimi.

### ML
ML (1973) Meta Language sóziniń qısqartpası. ML statikalıq túrde tiplestirilgen hám funkciya argumentleri menen qaytarıw tipleri annotaciyalanıwı múmkin.`fun times_10(n : int) : int = 10 * n;`

ML Lisp sıyaqlı qawsırmalarǵa baǵdarlanǵan emes, kerisinshe kod elementleri arasındaǵı baylanıstı kodlaw ushın hár túrli sintaksisti keńirek paydalanadı, hám hámmesin ańlatıw ushın dizim tártibi menen ishki jaylasıwǵa súyenbeydi. Tómendegi times_10 funkciyasınıń qollanılıwı:
 times_10 2
Ol «20 : int» nátiyjesin qaytaradı, yaǵnıy 20, int tipindegi mánis. 

Lisp sıyaqlı, ML dizimlerdi qayta islewge beyimlestirilgen, degen menen dizimniń barlıq elementleri birdey tipte bolıwı kerek.

### Prolog
Prolog (1972) «PROgramming in LOGic» sóziniń qısqartpası. Ol tábiyiy tildegi soraw-juwap ushın islep shıǵılǵan, sorawlarǵa juwaplardı shıǵarıw ushın da, tábiyiy til gáplerin analizlew hám generaciyalaw ushın da SL sheshimin paydalanǵan.

Prolog programmasınıń qurılıs blokları faktler hám qaǵıydalar. Mine, ápiwayı bir mısal:
```prolog
cat(tom). % tom - pıshıq
mouse(jerry). % jerry - tıshqan

animal(X) :- cat(X). % hárbir pıshıq - haywan
animal(X) :- mouse(X). % hárbir tıshqan - haywan

big(X) :- cat(X). % hárbir pıshıq - úlken
small(X) :- mouse(X). % hárbir tıshqan - kishi
eat(X,Y) :- mouse(X), cheese(Y). % hárbir tıshqan hárbir irimshikti jeydi
eat(X,Y) :- big(X), small(Y). % hárbir úlken zat hárbir kishi zattı jeydi
```
Usı programma berilgen bolsa, eat(tom,jerry) sorawı tabıslı boladı, al eat(jerry,tom) sátsizlikke ushıraydı. Bunnan tısqarı, eat(X,jerry) sorawı X=tom juwabı menen tabıslı boladı.

Prolog programmalardı joqarıdan tómenge orınlaydı, maqsetlerdi kishi maqsetlerge qısqartıw ushın keri oylaw arqalı SLD sheshimin paydalanadı. Bul mısalda, ol eat(X,jerry) sorawına juwap beriw maqsetin dáslep big(X) shártin qanaatlandıratuǵın X-ti tabıw, sońınan small(jerry) shártiniń durıs ekenin kórsetiw kishi maqsetlerine qısqartıw ushın programmanıń sońǵı qaǵıydasın paydalanadı. Ol qaǵıydalardı qayta-qayta paydalanıp, kishi maqsetlerdi basqa kishi maqsetlerge taǵı da qısqartadı, aqıbetinde barlıq kishi maqsetlerdi programmadaǵı faktler menen biriktiriwge erisedi. Bul keri oylaw, maqsetti qısqartıw strategiyası logikalıq programmalardaǵı qaǵıydalardı proceduralar retinde qarastıradı hám Prologtı deklarativ te, proceduralıq ta programmalastırıw tiline aylandıradı.

Prologtıń keń kólemli qollanılıwı Prolog-tıń 50 jıllıǵın bayramlaytuǵın Prolog Jılı Kitabında kórsetilgen.

### Datalog
Datalogtıń kelip shıǵıwı logikalıq programmalastırıwdıń baslanıwına barıp taqaladı, biraq ol shama menen 1977-jılı bólek taraw retinde anıqlandı. Sintaksislik hám semantikalıq jaqtan, ol Prologtıń bir bólimi bolıp tabıladı. Biraq quramalı terminleri bolmaǵanlıqtan, ol Tyuring-tolıq emes.

Kópshilik Datalog sistemaları programmalardı tómennen joqarıǵa orınlaydı, bar faktlerden jańa faktlerdi shıǵarıw ushın qaǵıydalardı paydalanıp alǵa qaray oylaydı hám jańa faktler shıǵarılıwı múmkin bolmaǵanda yamasa shıǵarılǵan faktler soraw menen birikkende toqtaydı. Joqarıdaǵı mısalda, ádettegi Datalog sisteması dáslep jańa faktlerdi shıǵaradı:
```prolog
animal(tom).
animal(jerry).
big(tom).
small(jerry).
```
Usı faktlerdi paydalanıp, ol keyin qosımsha fakt shıǵaradı:
```prolog
eats(tom, jerry).
```


Keyin ol toqtaydı, sebebi basqa jańa qosımsha faktler shıǵarılıwı múmkin emes hám de jańa shıǵarılǵan fakt soraw menen birlesedi: 
```prolog
eats(X, jerry).
```
Datalog maǵlıwmatlardı integraciyalaw, informaciyanı alıw, tarmaqlar, qáwipsizlik, bultlı esaplaw hám mashinalıq oqıtıw sıyaqlı máselelerge qollanılǵan.

### Juwaplar toplamın programmalastırıw
Juwaplar toplamın programmalastırıw (ASP) 1990-jıllardıń aqırında logikalıq programmalastırıwdıń turaqlı model (juwaplar toplamı) semantikasına tiykarlanıp payda boldı. Datalog sıyaqlı, ol Prologtıń bir bólimi bolıp tabıladı; hám quramalı terminleri bolmaǵanlıqtan, ol Tyuring-tolıq emes.

ASP-diń kópshilik implementaciyaları programmanı orınlaw ushın dáslep programmanı tiykarlaydı, qaǵıydalardaǵı barlıq ózgeriwshilerdi barlıq múmkin bolǵan usıllar menen konstantalarǵa almastıradı, sońınan programmanıń bir yamasa bir neshe modelin generaciyalaw ushın DPLL algoritmi sıyaqlı propoziciyalıq SAT sheshiwshisin paydalanadı.

Onıń qollanılıwı qıyın izlew máselelerin sheshiwge hám bilimlerdi kórsetiwge baǵdarlanǵan.

## Derekler

__BÖLİDİMÖNDEMEW__