Programozási paradigmák — imperatív, deklaratív és egyéb típusok

Átfogó ismertető a programozási paradigmákról: imperatív, deklaratív, objektumorientált és egyéb típusok összehasonlítása, példák és történeti áttekintés.

Szerző: Leandro Alegsa

A programozási paradigmák a programozási nyelvek csoportosítását jelentik aszerint, hogy milyen elvek szerint írjuk meg a számítógépes programokat. A paradigma nem feltétlenül kizárólagos tulajdonság: egy nyelv vagy egy adott projekten belül használt kód gyakran több paradigmát is ötvöz. A paradigmák a következő kérdésekkel foglalkoznak például: hogyan kezeljük az állapotot (state), engedélyezünk-e mellékhatásokat, milyen a vezérlés áramlása (sorrend), hogyan osztjuk darabokra a kódot (modularitás), és hogyan írjuk le az információt és a viselkedést (adat- vagy viselkedésközpontú megközelítés).

Egyes paradigmák elsősorban a végrehajtás módjára koncentrálnak (például hogy a lépéseknek meghatározott sorrendben kell történniük), mások a szerkezetre és a kód elemeire (például függvények, eljárások, objektumok, szabályok, események). A paradigmák nagy csoportosítása általában az imperatív és a deklaratív megközelítések közé helyezi őket, de a gyakorlatban sok nyelv és rendszer kevert megközelítést használ.

Tartalomjegyzék

·         1 Imperatív programozás

·         2 Deklaratív programozás

·         3 Egyéb paradigmák

·         4 Áttekintés

·         5 Problémák a paradigmákkal

·         6 Történelem

o    6.1 Gépi kód

o    6.2 Procedurális nyelvek

o    6.3 Objektumorientált programozás

o    6.4 Deklaratív paradigmák

·         7 Kapcsolódó oldalak

·         8 Hivatkozások

·         9 Egyéb weboldalak

Imperatív programozás

Az imperatív programokban a programozók a számítógépnek megadják a végrehajtandó lépések egy sorát, amelyeket el kell végezni ahhoz, hogy valamit elvégezzenek. Az imperatív kód gyakran mutatja meg explicit módon a vezérlés áramlását és az állapot változását: változókat állítunk be, adatokat módosítunk, utasításokat hajtunk végre. Ha valaki azt szeretné, hogy a számítógép rajzoljon egy macskaarcot, akkor olyan utasításokat adhat, hogy "rajzolj ide egy kört, rajzolj oda két kisebb kört, rajzolj rá két háromszöget", és így tovább. Az imperatív programoknak ezért gyakran több mellékhatása (side effect) van: változók módosítása, fájlok írása, hálózati kérések indítása stb.

Két fő imperatív paradigma létezik, és sokszor egy nyelv mindkettővel rendelkezik:

  • Strukturált - A számítógép olyan utasításokat kap, amelyek mindig egy bizonyos sorrendben vannak megadva. Az olyan lépések, mint a "menj vissza a 3. lépéshez" (ún. goto utasítások) nem engedélyezettek. A strukturált programozás segít átláthatóbb, karbantarthatóbb kódot írni, és gyakran támogatja az ellenőrzött vezérlési szerkezeteket (if, while, for, switch).
    • Eljárási (procedurális) - A program lehetővé teszi a programozó számára, hogy nevet adjon a parancsok listájának, ami ezeket a parancsokat egy "eljárássé" vagy függvénnyé alakítja, amelyet később hívhatunk. Ez a modularitás alapja: a kód részekre bontása könnyíti a visszahasználhatóságot és a tesztelhetőséget. Tipikus példák: C, Pascal, korai BASIC változatok.
  • Objektumorientált - Az ötleteket a számítógépnek objektumok segítségével magyarázzák el: ezek olyan kóddarabok, amelyeknek van egy sor parancsuk, és van róluk némi információ (állapot). Az objektumok kapszulázzák az adatot és a viselkedést, öröklődés és polimorfizmus segítségével modellezhetünk valós világbeli fogalmakat. Gyakori példák: Java, C++, C#, Python (részben).

Az imperatív programozás előnyei között szerepel a közvetlen vezérlés a végrehajtás felett és gyakran jobb teljesítmény finomhangolási lehetőségekkel. Hátránya lehet, hogy a sok állapotváltozás és mellékhatás megnehezíti a párhuzamosítás, a tesztelés és a formális bizonyítás folyamatát. A versenyhelyzetek, zárolások és más párhuzamossági problémák tipikusan itt jelentkeznek.

Deklaratív programozás

A deklaratív paradigmákban a programozó megmondja a számítógépnek mit akar elérni, ahelyett, hogy megmondaná, hogyan érje el azt. A program így inkább egy kívánt állapotot, szabályrendszert vagy lekérdezést ír le, nem pedig a lépések sorozatát. Ha azt akarják, hogy a számítógép rajzoljon egy macskaarcot, akkor deklaratív módon például azt írhatják le, hogy "Rajzolj egy arcot, rajzolj két szemet, két fület és egy szájat", anélkül hogy részleteznék az egyes vonalak és görbék felrajzolásának sorrendjét.

A legismertebb deklaratív paradigmák a következők:

  • Funkcionális - A munka nagy részét a funkciók végzik, mellékhatások nélkül vagy minimalizálva. A funkcionális programozás hangsúlyozza az immutabilitást, a függvénykompozíciót, és a referenciális transzparenciát, ami megkönnyíti a kód megértését és párhuzamosítását. Példák: Haskell, Clojure, Erlang, Scala, részben F# és Lisp család.
  • Logika - Egy sor tényt és szabályt (példákat) közölnek, majd egy vagy több "kérdést" tesznek fel. A futtató rendszer (pl. Prolog) a megadott szabályok alapján következtetéseket von le. A logikai programozás deklaratív módon írja le a problémát, a megoldások keresését a rendszerre bízza.
  • Eseményvezérelt - A kódrészletek úgy vannak beállítva, hogy bizonyos dolgok bekövetkezésekor (például a számítógép bekapcsolásakor, egy gomb megnyomásakor vagy egy hálózati üzenet érkezésekor) fussanak. Az eseményvezérelt megközelítés jól illeszkedik felhasználói felületekhez és aszinkron rendszerekhez; ide tartozik az eseménykezelők és callback-ek használata, valamint a reaktív programozás (pl. Rx-keretrendszerek).

A deklaratív megközelítés előnye, hogy a program logikája gyakran rövidebb, könnyebben érthető, és magasabb szintű absztrakciót kínál. Hátránya lehet, hogy nehezebb lehet finomhangolni a teljesítményt, és a deklaratív leírást a mögöttes futtató rendszernek kell hatékonyan végrehajtania. Emellett a hibakeresés (debugging) néha kevésbé intuitív, mert a végrehajtás részletei el vannak rejtve.

Más paradigmák

Egyes paradigmák mind az imperatív, mind a deklaratív nyelvekben megtalálhatók. Ezek a paradigma-elemek gyakran a fenti főbb osztályokkal együtt fordulnak elő, nem feltétlenül önállóan. Néhány további megközelítés:

  • Reaktív és adatfolyam (dataflow) - Adatok folyamként érkeznek, és a számítások a bejövő értékekre reagálnak; népszerű GUI, valós idejű adatelemzés és aszinkron rendszerek esetén.
  • Feltételes/konstraint alapú (constraint programming) - Feltételeket (korlátokat) adunk meg, és a rendszer olyan értékeket keres, amelyek megfelelnek ezeknek a korlátoknak (pl. egyes tervezési és ütemezési feladatok).
  • Funkció-orientált hibakezelés és monádikus minták - A funkcionális paradigmában külön minták (pl. monádok) segítenek mellékhatások kezelésében és komponálásában.
  • Komponens-alapú és aspektusorientált - Kód újrafelhasználhatóságát és keresztmetszeti problémák (pl. naplózás, jogosultság) kezelését célozzák.
  • Elosztott és üzenetalapú - Rendszerek tervezése, ahol az elemek üzeneteket küldenek egymásnak (pl. aktor-modell, mint az Erlangban vagy Akka-ban).

Áttekintés

Röviden: az imperatív programok a végrehajtandó lépésekre és az állapot explicit változtatására koncentrálnak; a deklaratív programok a kívánt eredményt vagy szabályokat írják le, a hogyan végrehajtást a rendszerre bízzák. A választás gyakran a feladattól, a rendelkezésre álló eszközöktől, a teljesítménykövetelményektől és a fejlesztői csapat ismeretétől függ. Sok modern nyelv és keretrendszer ötvözi a paradigmakat: például egy Java- vagy Python-projekt lehet elsősorban objektumorientált és imperatív, de ugyanakkor alkalmazhat funkcionális stílusú függvényeket és deklaratív lekérdezéseket.

Problémák a paradigmákkal

  • Paradigmák keverése: a különböző stílusok együttes használata hasznos lehet, de konzisztencia és karbantarthatósági problémákat is okozhat, ha nincs projektkultúra vagy szabvány.
  • Tanulási görbe: bizonyos paradigmák (például tisztán funkcionális vagy logikai szemlélet) meredekebb tanulási görbével járhatnak azok számára, akik megszokták az imperatív stílust.
  • Teljesítmény és optimalizáció: deklaratív megoldások esetén a hatékony végrehajtás a futtatórendszeren múlik; néha alacsony szintű optimalizációk nehezebben érhetők el.
  • Eszközök és hibakeresés: a diagnosztika és profilozás eszközei eltérőek lehetnek paradigmánként; egyes paradigmákban nehezebb nyomon követni a futó logikát.
  • Formalizmus és bizonyíthatóság: bizonyos paradigmaszerek (például tiszta funkcionális) könnyebben engedik a formális bizonyítást, míg az állapotot és mellékhatásokat bőven használó rendszereknél ez sokkal nehezebb.

Történelem

A programozási paradigmák fejlődése szorosan követi a számítástechnika történetét:

  • Gépi kód – A kezdetek: a legalsó szint, ahol a programozó közvetlenül a processzor utasításait adja meg, sorozatos, imperatív gondolkodással.
  • Assembly és korai magas szintű nyelvek – Absztrakciók bevezetése (pl. változók, szubrutinok), a strukturált és procedurális programozás kialakulása (pl. Fortran, COBOL, Pascal, C).
  • Objektumorientált forradalom – Az 1970–1990-es évektől kezdve az OOP népszerűsége nőtt, nagy nyelvekben (Smalltalk, C++, Java) terjedt el a modellálás és újrafelhasználhatóság igénye miatt.
  • Deklaratív és funkcionális megújulás – A funkcionális nyelvek (pl. Lisp, Haskell) és a logikai programozás (Prolog) korai munkái mellett a 2000-es évektől a funkcionális ötletek (immutabilitás, elsőrendű függvények) bekerültek a mainstream nyelvekbe is (pl. JavaScript, Python, Java 8+).
  • Modern sokszínűség – Ma a legtöbb modern rendszer több paradigmát használ: reaktív könyvtárak az eseményvezérelt rendszerekhez, aktor-modellek elosztott rendszerekhez, deklaratív lekérdezőnyelvek adatkezeléshez stb.

Összességében a paradigmák olyan eszköztárat és gondolkodási sémákat adnak a fejlesztők kezébe, amelyek segítenek a problémák modellezésében és megoldásában. A jó gyakorlat az, hogy megértsük egy paradigma erősségeit és korlátait, és a feladathoz legjobban illeszkedő megközelítést válasszuk, akár több paradigmát kombinálva.

Áttekintés

A programozási nyelveket paradigmák szerint csoportosítják, ugyanúgy, ahogy a gépeket is csoportosíthatják aszerint, hogy mire használják őket.

Néhány nyelv csak egy fő paradigmába illeszkedik, mint például:

  • Smalltalk (objektum-orientált)
  • Assembly (imperatív, de nem strukturált vagy objektumorientált)
  • Haskell (funkcionális)
  • Prolog (logika)

A legtöbb nyelv azonban egynél több paradigmában létezik. Néhány azok közül, amelyek kiemelkednek azzal, hogy egynél több paradigmájuk van, a következők:

  • Scala (objektum-orientált, funkcionális, párhuzamos)
  • Visual Basic (eseményvezérelt, objektumorientált)
  • Common Lisp (procedurális, funkcionális, objektumorientált, meta)
  • Scheme (funkcionális, procedurális, meta)
  • Perl (funkcionális, procedurális, meta, objektumorientált, eseményvezérelt)
  • Python (funkcionális, objektumorientált, procedurális)
  • Ruby (funkcionális, objektumorientált, procedurális)
  • Wolfram Language (funkcionális, procedurális, általában deklaratív)
  • Oz (logikai, funkcionális, imperatív, objektumorientált)
  • F# (funkcionális, imperatív, objektumorientált, meta)

A több paradigma nem mindig jó. Egyetlen esetben lehet jó, ha kevesebb paradigma van, amikor egy nyelv csak funkcionális. Egy függvény egy ilyen nyelvben néha kevesebb munkát végez (például csak a dolgok egy csoportjának azon részein megy át, amelyekre valóban szüksége van), mintha a nyelv procedurális lenne.

Sok programozási paradigma ugyanolyan jól ismert azokról a dolgokról, amelyeket nem engednek megtenni, mint azokról, amelyeket megengednek az embereknek. Ez például a funkcionális nyelvekre igaz. Ha egy funkcionális nyelv csak vagy főleg funkcionális, akkor általában nem engedi meg az oldalhatásokat. Egy másik eset, amikor ez igaz, a strukturált programozás: ez abban különbözik a normál imperatív nyelvektől, hogy nem engedi a programozóknak a "goto utasítások" használatát (utasítások, amelyek azt mondják a programnak, hogy menjen egy korábbi lépésre). Emiatt és más okok miatt az emberek néha úgy gondolják, hogy az új paradigmák nem engednek meg elég dolgot. Néha azonban nem baj, ha a számítógép nem enged meg dolgokat: ez segíthet az embereknek elkerülni a kódjukkal kapcsolatos problémákat, és hagyhatja, hogy a számítógép találgatásokat tegyen, így gyorsabban lefuttathatja a kódot, vagy akár ellenőrizheti a kódot problémákra, mielőtt a kód lefutna!

A különböző programozási paradigmák áttekintése Peter Van Roy szerintZoom
A különböző programozási paradigmák áttekintése Peter Van Roy szerint

Problémák a paradigmákkal

A programozási nyelveket tanulmányozók egy része nem szereti, hogy paradigmákat használnak a programozási nyelvek csoportosítására, például Harper és Krishnamurthi. Ezek az emberek azt mondják, hogy sok programozási nyelvet nem lehet egyszerűen paradigmákba csoportosítani, mert a nyelvek rengeteg paradigmából kölcsönöznek dolgokat és ötleteket.

Történelem

Az idők során új paradigmák jöttek létre, és az emberek vagy akkoriban, vagy visszatekintve rámutattak ezekre. Az egyik első paradigma, amelyet a programozás új módjaként ismertek fel, a strukturált programozás volt az 1960-as évekből. A "programozási paradigma" fogalma 1978-ból származik, ha nem korábbi, amikor Robert W. Floyd használta tanítás közben. A "paradigma" szót abban a formában, ahogy Robert értette, először Thomas Kuhn használta A tudományos forradalmak szerkezete (1962) című könyvében.

Gépi kód

A legalacsonyabb szintű (a számítógéphez legközelebb álló) és legrégebbi programozási paradigma a gépi kód, egy imperatív paradigma. A gépi kódban az utasítások nem mások, mint számok egy bizonyos sorrendben megadott halmaza. Az assembly nyelv egy kicsit kevésbé alacsony szintű (és egy kicsit kevésbé régi). Az assembly nyelvben a számítógépnek szóló utasítások mnemonikus (könnyebben megjegyezhető neveket), a memóriacímek (a számítógépben lévő információ megtalálásának irányai) pedig neveket kaphatnak. Ezeket néha első és második generációs nyelveknek nevezik.

Az 1960-as években az assembly nyelveket olyan új dolgokkal tették jobbá, mint a könyvtár COPY, a makrók ("speciális" kódrészletek, amelyek a program futása előtt normál kóddá alakultak át), a programon kívülről futtatható eljárások (névvel ellátott és későbbre elmentett utasítások) és változók (névvel ellátott és későbbre elmentett elemek). Ez lehetővé tette, hogy az emberek bizonyos kódokat több projektben is használhassanak, és ne kelljen a hardver-specifikus problémákkal (olyan problémákkal, amelyek csak egyfajta számítógépen fordulnak elő) foglalkozniuk, köszönhetően az olyan parancsoknak (az utasítások nevei), mint a READ/WRITE/GET/PUT.

Az assembly-t olyan rendszerekben használták, és néha még mindig használják, ahol fontos, hogy a kód gyors legyen, és a beágyazott rendszerekben is sokat használják, mert a felhasználó pontosan tudja ellenőrizni, hogy mit csinál a gép.

Procedurális nyelvek

Az 1960-as évek végén kezdték el kitalálni a procedurális nyelveket. Ezeknek a harmadik generációs nyelveknek (az első néhány, ma magas szintű nyelvnek nevezett nyelvnek) voltak szavai, amelyek ahhoz kapcsolódtak, amit meg akartak oldani. Például,

  • COmmon Business Oriented Language (COBOL) - olyan szavakat használ, mint file, move és copy.
  • FORmula TRANslation (FORTRAN) - matematikai szavakat és szimbólumokat használ ( írás és gépelés során használt alakzatok). Főleg a természettudományok és a mérnöki tudományok számára fejlesztették ki.
  • ALGOrithmic Language (ALGOL) - algoritmusok (a számítógépnek megmondó lépéssorozatok) írására készült. Matematikai szavakat és szimbólumokat használ, akárcsak a FORTRAN.
  • Programming Language One (PL/I) - mindenki számára hasznosnak kellett volna lennie.
  • Kezdők Minden célt szolgáló szimbolikus utasításkód (BASIC) - a kezdők programozásának segítésére készült.
  • C - egy programozási nyelv, amely sok mindenre alkalmas. Dennis Ritchie 1969 és 1973 között dolgozott rajta az AT&T Bell Labs-ben.

Objektum-orientált programozás

Miután sokan elkezdték használni a procedurális nyelveket, feltalálták az objektumorientált programozási nyelveket. Ezekben a nyelvekben az adatokat és a hozzájuk tartozó "módszereket" (az adatok manipulálásának módjait) egy "objektumba" helyezik. Néhány programozó, például Richard Stallman, nem ért egyet azzal, hogy az objektumorientált nyelvek jobban alkalmasak arra, hogy elmagyarázzák a számítógépnek az ötleteket, mint a procedurális nyelvek.

Mivel az objektumorientált programozás egy paradigma, nem pedig egy nyelv, az emberek olyan objektumorientált assembly nyelveket készítettek, mint a HLA (High Level Assembly).

Deklaratív paradigmák

Ezzel egy időben néhányan deklaratív programozási nyelveket készítettek. A deklaratív nyelvek közül jól ismert az SQL (a táblázatokban dolgok hozzáadására és eltávolítására szolgáló nyelv).

Kapcsolódó oldalak

  • Mindset
  • Típus rendszer
  • Turing teljesség

Kérdések és válaszok

K: Mi az a programozási paradigma?


A: A programozási paradigma a programozási nyelvek csoportosítása a működésük alapján.

K: Mi a paradigmák két fő csoportja?


V: A paradigmák két fő csoportja az imperatív és a deklaratív.

K: Miben különböznek az imperatív és a deklaratív paradigmák?


V: Az imperatív paradigmák a kód futtatásának módját vizsgálják, például a mellékhatások engedélyezése vagy a dolgok meghatározott sorrendben történő elvégzése, míg a deklaratív paradigmák a kód csoportosításának módját vizsgálják, például a kód egy vagy két darabba (vagy inkább sok kis darabba) való rendezését.

K: Lehet egy nyelv imperatív és deklaratív paradigma is?


V: Igen, egy nyelv lehet egyszerre imperatív és deklaratív paradigma is.

K: Hogyan csoportosítja egy programozási paradigma a nyelveket?


V: A programozási paradigmák a nyelveket aszerint csoportosítják, hogy mit csinálnak. Azt nézik, hogy a kód hogyan fut, hogyan van csoportosítva, és milyen sorrendben és milyen darabokból áll össze a program.

K: Vannak más típusú programozási paradigmák is az imperatív és a deklaratív mellett?


V: Igen, vannak más típusú programozási paradigmák is az imperatív és a deklaratív mellett. Egyesek például a kód futtatásának módját vizsgálják (például oldalhatások engedélyezése), míg mások a kód csoportosítását (például a kód egy vagy két darabba rendezése).

K: Minden nyelv csak egyféle programozási paradigmához tartozik?


V: Nem, nem minden nyelv tartozik csak egyféle programozási paradigmához; egyes nyelvek többféle paradigmához is tartozhatnak.


Keres
AlegsaOnline.com - 2020 / 2025 - License CC3