Deklaratív programozás

A Wikipédiából, a szabad enciklopédiából

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.[1]

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[2] (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.[3]

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.[4]

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ó[szerkesztés]

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.[5]

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[szerkesztés]

A deklaratív programozás egy gyűjtőfogalom, amely számos ismertebb programozási paradigmát foglal magában.

Kényszerprogramozás[szerkeszté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[szerkesztés]

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[szerkeszté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.[6] 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[szerkesztés]

A makefile-ok például deklaratív módon határozzák meg a függőségeket,[7] 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[szerkeszté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[szerkeszté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.[8]

Jegyzetek[szerkesztés]

  1. Lloyd, J.W., Practical Advantages of Declarative Programming
  2. declarative language. FOLDOC, 2004. május 17. [2015. augusztus 10-i dátummal az eredetiből archiválva]. (Hozzáférés: 2020. január 26.)
  3. Sebesta, Robert. Concepts of programming languages. Pearson (2016). ISBN 978-0-13-394302-3. OCLC 896687896 
  4. DAMP 2009: Workshop on Declarative Aspects of Multicore Programming. Cse.unsw.edu.au, 2009. január 20. (Hozzáférés: 2013. augusztus 15.)
  5. Chakravarty, Manuel M. T. (14 February 1997), On the Massively Parallel Execution of Declarative Programs, Technical University of Berlin, <http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz>. Hozzáférés ideje: 26 February 2015
  6. Revised7 Report on the Algorithmic Language Scheme. Scheme Working Group 1. (Hozzáférés: 2020. december 5.)
  7. [1] Archiválva 2007. október 23-i dátummal a Wayback Machine-ben.
  8. Declarative modelling. Simulistics. (Hozzáférés: 2013. augusztus 15.)

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a Declarative programming című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

További információk[szerkesztés]