Deklarativno programiranje

U informatici, deklarativno programiranje je paradigma programiranja, stil izgradnje struktura i elemenata računarskih programa, koji izražavaju logiku računanja bez opisivanja njenog kontrolnog toka.[1] Mnogi jezici primenjuju ovaj pokušaj da se smanje ili eliminišu neželjeni efekti opisujući šta program treba da postigne u smislu domena problema, pre nego opisuje kako ostvaruje niz u programskom jeziku primitivnog stila[2] (u koliko se levo od realizacije jezika). Ovo je u suprotnosti sa imperativnim programiranjem, u kojoj se algoritmi sprovode u smislu eksplicitnih koraka.

Deklarativno programiranje često smatra programe kao teorija u formalne logike, i izračunavanja kao odbitke u tom logičkom prostoru. Deklarativno programiranje može u velikoj meri pojednostaviti pisanje paralelnih programa.[3]

Uobičajeni deklarativni jezici uključuju one baze jezika upita sistema (na primer, SQL, XQuery), regularni izrazi, logičko programiranje, funkcionalno programiranje i upravljanje konfiguracijom sistema.

Definicija uredi

Deklarativno programiranje se često definiše kao bilo koji stil programa koji nije imperativ. Izvestan broj drugih zajedničkih definicija postoji da pokuša da se taj termin osim jednostavnog kontrasta sa imperativnim programiranjem definiše. Na primer:

Ove definicije se preklapaju značajno.

Deklarativno programiranje je u suprotnosti sa imperativom i procesnim programiranjem. Deklarativno programiranje je ne imperativ stila programiranja u kome programi opisuju svoje željene rezultate bez eksplicitnog listinga komandi ili koraka koji se moraju obavljati. Funkcionalni i logički programski jezici se odlikuju u stilu deklarativnog programiranja. U logičkim programskim jezicima, programi se sastoje od logičkih iskaza, a program izvršava tražeći dokaze o izjavama.

U čistom funkcionalnom jeziku, kao što je Haskell, sve funkcije su bez neželjenih efekata, i promene stanja su samo predstavljene kao funkcije koje transformišu stanja, koja je eksplicitno predstavljena kao prva klasa objekta u programu. Iako čisti funkcionalni jezici su ne imperativ, oni često daju objekat za opisivanje efekta funkcije kao niz koraka. Ostali funkcionalni jezici, kao što su Lisp, OCaml i Erlang, podržavaju mešavinu procesnog i funkcionalnog programiranja.

Neki logički programski jezici, kao što je Prolog, i jezici upita baze, kao što je SQL, dok je deklarativan u principu, takođe podržavaju proceduralni stil programiranja.

Potparadigme uredi

Deklarativno programiranje je kišobran termin koji uključuje veliki broj poznatijih paradigmi programiranja.

Ograničeno programiranje uredi

U ograničenom programiranju, odnosi između varijabli su navedeni u vidu ograničenja, navodeći da se svojstva rešenje mogu naći. Skup ograničenja je tada rešen davanjem vrednosti svake varijable, tako da je rešenje u skladu sa maksimalnim brojem ograničenja.

Ograničenje programiranja se često koristi kao dodatak drugim paradigmama: Funkcionalno, logičko ili čak imperativno programiranje.

Domen specifičnih jezika uredi

Neki poznati primeri deklarativnog domena specifičnih jezika (DSLs) uključuju Yacc parser generator unosa jezika, Make izrade tehničke karakteristike jezika, Puppet jezik upravlja konfiguracijom, regularni izrazi, i podskup SQL (SELECT upite, na primer). DSLs ima prednost jer koristi Tjuringovu potpunost, što olakšava da jezik bude čisto deklarativan.

Mnogi jezici označavanja kao što su HTML, MXML, XAML, XSLT ili drugi korisnički interfejs jezici označavanja su često deklarativni. HTML, na primer, samo opisuje šta treba da se pojavi na veb stranici - precizira kontrolu protoka niti donošenja strana, niti njene moguće interakcije sa korisnikom.

Od 2013. neki softverski sistemi kombinuju tradicionalne korisničke interfejs jezike za označavanje (kao što su HTML) deklarativnih oznaka da definišu šta (ali ne i kako) The Back-end server sistemi treba da urade da bi pomogli proglašen interfejs. Takvi sistemi, tipično koristeći domen-specifični XML namespace, može uključivati apstrakcije SQL baze podataka sintakse ili parametriranje poziva na veb servisa pomoću Representational State Transfer (REST) i SOAP.

Funkcionalno programiranje uredi

Funkcionalno programiranje, a posebno čisto funkcionalno programiranje, pokušava da minimizira ili eliminiše neželjene efekte, pa se stoga smatra deklarativnim. Većina funkcionalnih jezika, kao što su ŠEME, Clojure, Erlang, Haskell, OCaml, Standard ML i Unlambda, će dozvoliti neželjene efekte u praksi.

Dok funkcionalni jezici obično izbegavaju da navode "kako", prevodilac za čiste funkcionalne programske jezike je slobodan da intenzivno prepiše operativno ponašanje funkcije, sve dok se isti rezultat vraća za isti ulaz. Ovo se može iskoristiti, na primer, da napravi fuknciju sa paralelnim rezultatom ili da izvede značajne optimizacije (kao sa deforestacijom) da kompajler možda ne prihvati jezik sa suprotnim efektima.

Hibridni jezik uredi

Makefile, na primer, navesti zavisnosti u delkarativne metode,[5] ali uključuju imperativni spisak akcija. Slično tome, Yacc određuje kontekst slobodan gramatici deklarativnosti, ali uključuje Code Snippets od jezika domaćina, koji je obično imperativ (kao što je S).

Logično programiranje uredi

Logički programski jezici su na primer Prolog stanja i upita odnosa. Specifičnosti kako su ovi upiti odgovorili da je realizacija teorema prover, ali obično uzimaju oblik neke vrste ujedinjenja. Kao funkcionalno programiranje, mnogi logički programski jezici dozvoli su neželjene efekte, koji kao rezultat nisu striktno deklarativni.

Modelovanje uredi

Modeli, ili matematičke reprezentacije, fizičkih sistema mogu biti implementirani u računarskom kodu koji je deklarativan. Kod sadrži veliki broj jednačina, a ne imperativne zadatke, koje opisuju ("proglasi") i ponašanja odnosa. Kada je model izražen u ovom formalizmu, računar je u stanju da obavlja algebarske manipulacije najbolje formulisanih rastvora algoritma. Matematička kauzalnost se obično nameće na granicama fizičkog sistema, dok ponašanje opisa samog sistema je deklarativno ili akauzalno. Deklarativni jezici za modelovanje i okruženja uključuju analitiku, modelovanje i poređenje.[6]

Vidi još uredi

Reference uredi

  1. ^ Lloyd, J.W., Practical Advantages of Declarative Programming 
  2. ^ Declarative language in The Free On-line Dictionary of Computing, Editor Denis Howe.
  3. ^ „DAMP 2009: Workshop on Declarative Aspects of Multicore Programming”. Cse.unsw.edu.au. 20. 1. 2009. Pristupljeno 15. 8. 2013. 
  4. ^ Chakravarty, Manuel M. T. (14. 2. 1997). On the Massively Parallel Execution of Declarative Programs (Doctoral dissertation). Technische Universität Berlin. Pristupljeno 26. 2. 2015. „In this context, the criterion for calling a programming language declarative is the existence of a clear, mathematically established correspondence between the language and mathematical logic such that a declarative semantics for the language can be based on the model or the proof theory (or both) of the logic. 
  5. ^ „Arhivirana kopija”. Arhivirano iz originala 23. 10. 2007. g. Pristupljeno 18. 11. 2015. 
  6. ^ „Declarative modelling”. Simulistics. Pristupljeno 15. 8. 2013. 

Spoljašnje veze uredi