A programozási paradigma egy osztályozási forma, amely a programozási nyelvek jellemzőin alapul. A nyelvek több paradigmába is sorolhatók.
Néhány paradigmát elsősorban a végrehajtási modell nyelvezetének következménye foglalkoztat, mint például, hogy megengedi a mellékhatást, vagy hogy az műveletek sorozata meghatározható-e a végrehajtási modell alapján. Más paradigmákat elsősorban a kód szervezettsége foglalkoztatja, például egy kód egységekre csoportosítása az állapottal együtt, amelyet a kód módosított. Más paradigmák azonban elsősorban a szintaxis és a nyelvtan stílusával foglalkoznak.
imperatív, amelyben a programozó utasítja a gépet az állapotának megváltoztatására,
procedurális, amely az utasításokat eljárásokba csoportosítja,
objektumorientált, amely az utasításokat csoportosítja az alap azon részével együtt, amelyen működnek,
deklaratív, amelyben a programozó deklarálja a kívánt eredmény tulajdonságait, de nem azt, hogy hogyan kell azt kiszámítani,
funkcionális, amelynél a kívánt eredményt függvényalkalmazásként deklarálnak
logikai, amelyben a kívánt eredményt a tények és szabályok rendszerével kapcsolatos kérdésre adott válaszként deklarálnak
matematikai, amelyben a kívánt eredményt egy optimalizálási probléma megoldásaként deklarálnak
A szimbolikus technikák, mint a reflexió, amelyek lehetővé teszik a programnak, hogy magára hivatkozzon, szintén programozási paradigmának tekinthető. Ez azonban összeegyeztethető a fő paradigmákkal, tehát önmagában nem valódi paradigma.
Például azok a nyelvek, melyek az imperatív paradigmákba esnek két fő jellemzőjük van: meghatározzák a műveletek sorrendjét olyan konstrukciókkal, amelyek kifejezetten ellenőrzik ezt a sorrendet, és lehetővé tesznek olyan mellékhatásokat, amelyben az állapot módosítható egy időben, egy kód egységben, majd később egy másik időpontban olvasható egy másik kód egységén belül. A kommunikáció a kódegységek között nem egyértelmű. Közben az objektumorientált programozásban a kód objektumokba van rendezve, amik olyan állapotot tartalmaznak, amelyet csak az objektum részét képező kód módosít. A legtöbb objektumorientált nyelv imperatív nyelv is. Ezzel szemben a deklaratív paradigmához illeszkedő nyelvek nem határozzák meg a műveletek végrehajtásának sorrendjét. Ehelyett számos, a rendszerben elérhető műveletet szolgáltatnak, valamint azokat a feltételeket, amelyek között az egyes műveletek végrehajthatók. A nyelv végrehajtási modelljének végrehajtása nyomon követi azokat a műveleteket, amelyek szabadon végrehajthatók, és önmagának választja ki a sorrendet.
Ahogy a programtervezést (mint folyamat) eltérő módszerek határozzák meg, úgy a programozási nyelveket (mint a számítási modelleket) különböző paradigmák határozzák meg. Néhány nyelv úgy lett megtervezve, hogy egy paradigmát támogasson (a Smalltalk az objektumorientált programozást, a Haskell a funkcionális programozást támogatja), míg más programozási nyelvek többszörös paradigmákat támogatnak (Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, PHP, Python, Ruby, Wolfram Language, Oz, és F#). Például ha a program C++-ban van megírva, az Object Pascal vagy a PHP tisztán procedurális jellegű, tisztán objektumorientált, vagy tartalmazhatja mindkettőt, vagy más paradigmákat. A szoftver tervezők és programozók eldönthetik, hogyan használják ezen paradigmák elemeit.
Az objektumorientált programozásban a programokat interaktív objektumok halmazaként kezelik. A funkcionális programozásban a programokat állapot nélküli funkcióértékelések sorozataként kezelik. Mikor a programozó számítógépek vagy rendszerek több processzorral, folyamat-orientált programozásban, a programokat párhuzamos folyamatok halmazának tekintik, amelyek logikusan megosztott adatszerkezetekben működnek.
Sok programozási paradigmát arról ismerünk fel, hogy mit tilt és mit engedélyez. Például a tiszta funkcionális programozás nem engedélyezi a reflexiók használatát, míg a strukturált programozás nem engedi a GOTO utasítás használatát. Részben ennek okán, az új paradigmákat gyakran doktrínálisnak vagy túl merevnek tekintik azok, akik korábbi stílusokkal dolgoztak.[4] Ugyanakkor bizonyos technikák elkerülése megkönnyítheti a program viselkedésének megértését és a program helyességével kapcsolatos tételek bizonyítását.
A programozási paradigmák összehasonlíthatók olyan programozási modellekkel is, amelyek lehetővé teszik egy végrehajtási modell meghívását csak egy API használatával. A programozási modellek szintén osztályozhatók paradigmákként, a végrehajtási modell jellemzői alapján.
Párhuzamos számításhoz nyelv használata helyett programozási modellt használunk. Ennek oka az, hogy a párhuzamos hardver adatai kiszivárognak a hardver programozásához használt absztrakciókba. Ez azt okozza, hogy a programozónak az algoritmusban mintákat kell leképeznie a végrehajtási modell mintáira (amelyeket a hardver szivárgása miatt helyeztek be az absztrakciókba). Következésképpen senki nem képes párhuzamos programozási nyelven feltérképezni az összes számítási problémát. Ezért kényelmesebb egy alapszekvenciális nyelv használata és az API-hívások beszúrása a párhuzamos végrehajtási modellbe egy programozási modell segítségével. Az ilyen párhuzamos programozási modelleket az absztrakciók szerint lehet besorolni, amelyek tükrözik a hardvert, például a megosztott memória, elosztott memória üzenet átadásával, a kódban látható hely fogalma, stb. Ezek a programozási paradigma ízeként tekinthetők, amelyek csak a párhuzamos nyelvekre és a programozási modellekre vonatkoznak.
Kritika
Néhány programnyelv-kutató kritizálja a programozási nyelvek paradigmába sorolását, mint például Harper,[5] és Krishnamurthi.[6] Szerintük sok programozási nyelvet nem lehet kizárólag egy paradigmába sorolni, inkább több paradigma jellemzőit tartalmazza.
Történet
A programozás különböző megközelítései az idők során alakultak ki, amelyeket akkor, vagy utólag azonosítottak. Egy korai megközelítést, a strukturált programozást az 1960-as évek közepén ismertették. A "programozási paradigma", mint koncepció az 1978-as évre nyúlik vissza, amikor a Turing Díjátadón Robert W. Floyd említette meg A Programozási Paradigmák elnevezéssel, idézve a paradigma fogalmát, amelyet Thomas Kuhn használt A tudományos forradalmak szerkezete (1962) című könyvében.[7]
Az 1960-as években az assembly nyelveket azért hozták létre, hogy támogassák a könyvtárak másolását, a meglehetősen kifinomult feltételes macro generálást, az előfeldolgozás képességét, a meghívást (CALL), a környezeti változókat és globális szekciókat, amelyek lehetővé teszik a jelentős kód újrafelhasználást és a hardvertől való függetlenséget logikai operátorok segítségével, mint az írás/olvasás/get/put. Az assemblyt időkritikus és gyakran beágyazott rendszerekre használták és használják, mivel ezzel a nyelvvel lehet a legközvetlenebbül irányítani a számítógépet.
Procedurális nyelvek
A következő előrelépés a procedurális nyelvek létrehozása volt. Ezekben a harmadik generációs nyelvekben (az első, amit magas szintű nyelvnek nevezünk) szavak segítségével tudunk problémákat megoldani. Például:
COmmon Business Oriented Language (COBOL) - olyan kifejezéseket használ, mint a file, move, copy.
FORmula TRANslation (FORTRAN) - a matematikai nyelv terminológiáját használja, főleg tudományos és mérnöki problémák megoldására fejlesztették ki.
ALGOrithmic Language (ALGOL) - algoritmusok megfelelő definiálására fejlesztették ki, a matematikai nyelv terminológiáját használja, tudományos és mérnöki problémák megoldására, mint a FORTRAN.
Programming Language One (PL/I) - egy hibrid kereskedelmi-tudományos általános célnyelv, ami támogatja a mutatók használatát.
Beginners All purpose Symbolic Instruction Code (BASIC) - azért fejlesztették ki, hogy emberek szélesebb köre tudjon programot írni.
C - Egy általános célú programozási nyelv, amelyet Dennis Ritchie fejlesztett ki 1969 és 1973 között az AT&T Bell Labs vállalatnál.
Ezek a nyelvek mind a procedurális paradigmát követik, vagyis lépésről lépésre pontosan leírják azt az eljárást, amelyet legalább az adott programozó szerint követni kell egy adott probléma megoldásához. Az ilyen megoldások hatékonysága tehát teljesen szubjektív, és nagymértékben függ a programozó tapasztalatától, találékonyságától és képességétől.
Objektumorientált programozás
A procedurális nyelvek széles körű elterjedése után létrejöttek az objektumorientált programozási (OOP) nyelvek, mint például a Simula, a Smalltalk, a C++, a C#, az Eiffel, a PHP és a Java. Ezekben a nyelvekben az adatokat és a metódusokat egy egységként, objektumnak nevezik. A tökéletes beágyazás mellett, amely az OOP egyik legfőbb tulajdonsága, az objektum metódusain keresztül csak egy másik objektum vagy felhasználó férhet hozzá az adatokhoz. Így egy objektum belső működése megváltozhat anélkül, hogy bármilyen kód megváltozna, amely az objektumot használja. Még mindig van némi vita, amelyet Alexander Stepanov, Richard Stallman[8] és más programozók vetettek fel az OOP paradigma hatékonyságával, a procedurális paradigmával szemben. Annak szükségessége, hogy minden objektum rendelkezzen asszociatív metódusokkal vezérelt sok szkeptikust, hogy az OOP szoftver felfúvódást okoz, egy megoldás, hogy eredményre jussanak ebben a dilemmában, a polimorfizmus révén jött létre.
Mivel az objektumorientált programozást paradigmának, és nem nyelvnek tekintik, így lehetőség van objektumorientált asszembler nyelv létrehozására. Erre példa a Magas szintű Assembly (High Level Assembly - HLA), amely a korai eredete ellenére teljes mértékben támogatja a fejlett adattípusokat és az objektumorientált Assembly nyelven való programozást, így az eltérő programozási paradigmák inkább úgy tekinthetők, mint motivációs mémek, és nem feltétlenül előrehaladásként egyik szintről a másikra. A versengő paradigmák hatékonyságának pontos összehasonlítását gyakran megnehezítik a hasonló elemekre és folyamatokra alkalmazott új és eltérő terminológiák, valamint a nyelvek közötti számos végrehajtási különbség.
További paradigmák
A literáció programozás, mint az imperatív programozás egyik formája a programokat ember-központúbban strukturálja, mint egy hiperszövegben: a dokumentáció a program szerves része, és a program egy próza logikája szerint épül fel, nem pedig a fordító kényelme érdekében.
Az imperatív ágtól függetlenül deklaratív programozási paradigmákat is dolgoztak ki. Ezekben a nyelvekben a számítógépnek meg kell mondani, hogy mi a probléma, nem pedig, hogy hogyan lehet megoldani azt - a program olyan tulajdonságok halmazaként van felépítve, amelyek megtalálhatók a várt eredményben, nem pedig követendő eljárásokat tartalmazza. Egy adott adatbázis vagy szabálykészlet alapján a számítógép megpróbálja megtalálni a kívánt tulajdonságoknak megfelelő megoldást. A deklaratív nyelv ősi formája a negyedik generációsSQL nyelv, valamint a funkcionális nyelvek és a logikai programozás családja.
A funkcionális programozás a deklaratív programozás egy része. Az ezzel a paradigmával írt programok olyan függvényeket, kódblokkokat használnak, amelyek matematikai függvényekként viselkednek. A funkcionális nyelvek ellenzik a változók értékének megváltoztatását hozzárendelés révén, sokkal inkább a rekurzió használatát részesíti előnyben.
A logikai programozási paradigma a számítást automatizált érvelésként kezeli. A problémakörrel kapcsolatos tényeket logikai képletek formájában fejezik ki, és a programokat következtetési szabályok alkalmazásával hajtják végre, amíg nem találnak választ a problémára, vagy a képletek halmaza nem következetes.
A szimbolikus programozás olyan paradigma, amely leírja azokat a programokat, amelyek képesek manipulálni a képleteket és a program alkotóelemeit adatokként.[9] A programok tehát hatékonyan módosíthatják magukat, ezáltal úgy tűnik, hogy "tanulnak", ez alkalmassá teszi őket olyan alkalmazásokhoz, mint a mesterséges intelligencia, a szakértői rendszerek, a természetes nyelv feldolgozása és a számítógépes játékok. Az ezt a paradigmát támogató nyelvek közé tartozik a Lisp és a Prolog.[10]
A legtöbb programozási nyelv támogatja az egynél több programozási paradigma használatát, annak érdekében, hogy egy adott munkára a programozók a legmegfelelőbb programozási stílusokat és társított nyelvi konstrukciókat használják.[13]
Ez a szócikk részben vagy egészben a Programming paradigm 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.