A számítástechnikában a deklaratív programozás egy programozási paradigma – a számítógépes programok szerkezetének és elemeinek felépítésének stílusa –, amely kifejezi a számítás logikáját anélkül, hogy leírná a vezérlési folyamatát.
Azok a nyelvek, amely ezt a programozást használják, megpróbálják minimalizálni vagy kiküszöbölni a mellékhatásokat, úgy, hogy leírják, hogy a programnak mit kell elérnie a probléma tartományában, ahelyett, hogy a programozási nyelv primitívjeinek sorozataként írná le, hogyan kell azt megvalósítani (a hogyan marad meg a nyelv megvalósításáig). Ez ellentétben áll az imperatív programozással, amely az algoritmusokat explicit lépésekben valósítja meg.
A deklaratív programozás gyakran tekinti a programokat a formális logika elméletének, a számításokat pedig a logikai térben levont következtetéseknek. A deklaratív programozás nagymértékben leegyszerűsítheti a párhuzamos programok írását.
A gyakran használt deklaratív nyelvek közé tartoznak az adatbázis-lekérdezési nyelvek (pl. SQL, XQuery), a reguláris kifejezések, a logikai programozás, a funkcionális programozás és a konfigurációkezelő rendszerek.
Definíció A deklaratív programozás definícióját a legtöbb helyen csak úgy fogalmazzák meg, hogy "nem imperatív programozási stílus". Azonban számos más általános definíció megpróbálja meghatározni konkrétabban, egyszerűen szembeállítva az imperatív programozással. Például:
Magas szintű program, amely leírja, mit kell végrehajtania egy számításnak. Bármilyen programozási nyelv, amelynek nincsenek mellékhatásai (vagy pontosabban referenciálisan átlátható). Egy nyelv, amely egyértelműen megfelel a matematikai logikának.
Ezek a meghatározások lényegesen fedik egymást.
A deklaratív programozás egy nem imperatív programozási stílus, amelyben a programok leírják a kívánt eredményt anélkül, hogy kifejezetten felsorolnák a végrehajtandó parancsokat vagy lépéseket. A funkcionális és logikai programozási nyelveket deklaratív programozási stílus jellemzi. A logikai programozási nyelvekben a programok logikai utasításokból állnak, és a program az utasítások bizonyításának keresésével fut.
Egy tisztán funkcionális nyelvben, mint például a Haskell, minden függvény mellékhatásoktól mentes, és az állapotváltozások csak olyan függvényekként jelennek meg, amelyek átalakítják az állapotot, ez pedig kifejezetten első osztályú objektumként jelenik meg a programban. Bár a tiszta funkcionális nyelvek nem imperatívak, gyakran lehetőséget adnak egy függvény hatásának leírására lépések sorozataként. Más funkcionális nyelvek, mint például a Lisp, OCaml és az Erlang, támogatják az eljárási és funkcionális programozás keverékét.
Egyes logikai programozási nyelvek, mint például a Prolog és az adatbázis-lekérdező nyelvek (SQL), bár elvileg deklaratívak, szintén támogatják a programozás procedurális stílusát.
Alparadigmák A deklaratív programozás egy gyűjtőfogalom, amely számos ismertebb programozási paradigmát foglal magában.
Kényszerprogramozás A megszorítások programozása a változók közötti kapcsolatokat megszorítások formájában határozza meg, amelyek meghatározzák a célmegoldás tulajdonságait. A megszorítások halmazát úgy oldjuk meg, hogy minden változónak értéket adunk, hogy a megoldás összhangban legyen a megszorítások maximális számával. A kényszerprogramozás gyakran kiegészít más paradigmákat is: a funkcionális, a logikai vagy akár az imperatív programozást.
Domainspecifikus nyelvek A deklaratív domainspecifikus nyelvek (DSL) jól ismert példái közé tartozik a yacc elemző generátor beviteli nyelve, a QML, a Make build specifikációs nyelv, a Puppet konfigurációkezelési nyelve, a reguláris kifejezések és az SQL egy részhalmaza (például a SELECT-lekérdezések). A DSL-ek előnye, hogy úgy hasznosak, hogy közben nem feltétlenül kell Turing-teljesnek lenniük, ami megkönnyíti, hogy egy nyelv tisztán deklaratív legyen.
Számos jelölőnyelv, például a HTML, MXML, XAML, XSLT vagy más felhasználói felület jelölőnyelvei gyakran deklaratívak. A HTML például csak azt írja le, hogy mi jelenjen meg egy weboldalon – nem határozza meg sem az oldal megjelenítésének vezérlési folyamatát, sem az oldal lehetséges interakcióit a felhasználóval.
2013-tól kezdődően egyes szoftverrendszerek a hagyományos felhasználói felület jelölőnyelveit (pl. HTML) kombinálják deklaratív jelöléssel, amely meghatározza, hogy a háttérkiszolgáló rendszerek mit tegyenek a deklarált felület támogatása érdekében. Az ilyen, jellemzően tartományspecifikus XML-névteret használó rendszerek tartalmazhatják az SQL-adatbázis szintaxisának absztrakcióit vagy a webszolgáltatások paraméterezett hívásait reprezentációs állapotátvitel (REST) és SOAP használatával.
Funkcionális programozás A funkcionális programozási nyelvek, például a Haskell, a Scheme és az ML függvényalkalmazáson keresztül értékelik a kifejezéseket. Ellentétben a procedurális programozás ehhez kapcsolódó, de még imperatívabb paradigmájával, a funkcionális programozás kevés hangsúlyt fektet az explicit szekvenálásra. Például a Scheme-ben sokféle részkifejezés értékelési sorrendje nem definiált vagy implicit. Ehelyett a számításokat különféle rekurzív, magasabb rendű függvényalkalmazások és összetételek jellemzik, explicit hivatkozásokkal az I/O-ra és az adatokra, amelyek takarékosan jelennek meg, és ahol csak lehetséges, elkerülik vagy elzárják az állapotmutációt.
Hibrid nyelvek A makefile-ok például deklaratív módon határozzák meg a függőségeket, de tartalmazzák az imperatív műveletek kötelezően végrehajtandó listáját is. Hasonlóképpen, a yacc kontextusmentes nyelvtant határoz meg deklaratív módon, de tartalmaz kódrészleteket a gazda nyelvéből, ami általában imperatív (például C).
Logikai programozás A logikai programozási nyelvek közé tartoznak például a Prolog állapot- és lekérdezési relációk. A kérdéseik megválaszolásának sajátosságai az implementációtól és annak tételbizonyítójától függenek, de általában valamilyen egységesítés formáját öltik. A funkcionális programozáshoz hasonlóan sok logikai programozási nyelv megengedi a mellékhatásokat, és ennek eredményeként nem szigorúan csak deklaratívak.
Modellezés A fizikai rendszerek modelljei vagy matematikai ábrázolásai deklaratív számítógépes kódban is megvalósíthatók. A kód számos egyenletet tartalmaz, nem kötelező hozzárendelésekkel, amelyek leírják ("kijelentik") a viselkedési kapcsolatokat. Ha egy modell ebben a formalizmusban van kifejezve, a számítógép képes algebrai manipulációkat végrehajtani a megoldási algoritmus legjobb megfogalmazása érdekében. A matematikai ok-okozati összefüggést jellemzően a fizikai rendszer határain kényszerítik ki, míg maga a rendszer viselkedési leírása deklaratív vagy okozati. A deklaratív modellezési nyelvek és környezetek közé tartozik az Analytica, a Modelica és a Simile.
Jegyzetek
Fordítás
További információk Frans Coenen. Characteristics of declarative programming languages. 1999. Robert Harper. What, If Anything, Is A Declarative Language?. 2013. There Is Such A Thing As A Declarative Language, and It’s The World’s Best DSL. 2013. Olof Torgersson. A Note on Declarative Programming Paradigms and the Future of Definitional Programming. 1996.
Kategória:Programozási paradigmák Kategória:Lapok ellenőrizetlen fordításokkal