Programozási paradigmák. A programozási paradigma fogalma

A számítógépes programozás korszakának legelején kialakult általános programozási paradigmák, köztük az alkalmazott, elméleti és funkcionális programozás paradigmái a legstabilabbak.

Az alkalmazott programozás problémaorientált, tükrözi az információ számítógépesítését és a numerikus feldolgozás számítási folyamatait, amelyeket jóval a számítógépek megjelenése előtt tanulmányoztak. Itt gyorsan világos gyakorlati eredmény született. Természetesen ezeken a területeken a programozás nem sokban különbözik a kódolástól, ehhez általában elegendő a műveletek ábrázolásának operátori stílusa. Az alkalmazott programozás gyakorlatában az a szokás, hogy megbízunk a bevált sablonokban, eljárások könyvtáraiban, kerüljük a kockázatos kísérleteket. A tudományos számítások pontosságát és stabilitását értékelik. A Fortran nyelv, az alkalmazásprogramozás veteránja, fokozatosan kezdett engedni ezen a területen a Pascal, C, szuperszámítógépeken pedig a párhuzamos programozási nyelvek, például a Sisal felé.

Az elméleti programozás a programozás és a számítástechnika területén végzett tudományos kísérletek eredményeinek összehasonlíthatóságát célzó publikációs orientációt követi. A programozás igyekszik kifejezni formális modelljeit, megmutatni azok jelentőségét, alapvetőségét. Ezek a modellek megörökölték a kapcsolódó matematikai fogalmak főbb jellemzőit, és a számítástechnika algoritmikus megközelítéseivé váltak. A konstrukciók bizonyítékainak vágya, valamint hatékonyságuk, hihetőségük, helyességük, helyességük és egyéb formalizált összefüggések értékelése programdiagramokban és szövegekben szolgált alapul a strukturált programozáshoz és a programfejlesztési folyamatban a megbízhatóság elérésére szolgáló egyéb módszerekhez, például a kompetens programozáshoz. . Az Algol és Pascal szabványos részhalmazait, amelyek a programozási elmélet munkaanyagaként szolgáltak, a kísérletezéshez kényelmesebb alkalmazási nyelvek váltották fel, mint például az ML, Miranda, Scheme, Haskell és mások. Most csatlakoznak hozzájuk a C és a Java újításai.

A funkcionális programozás a mesterséges intelligencia kutatásának és fejlesztésének matematikai orientációja, valamint a számítástechnika új távlatainak kialakítása előtti tisztelgésként jött létre. Az információmegjelenítés absztrakt megközelítése, a függvények felépítésének lakonikus, univerzális stílusa, a végrehajtási környezet áttekinthetősége a különböző függvénykategóriákhoz, a rekurzív konstrukciók szabadsága, a matematikus és a kutató intuíciójába vetett bizalom, az idő előtti teher elkerülése a memóriaallokáció elvtelen problémáinak megoldása, a definíciók körére vonatkozó indokolatlan korlátozások elutasítása - mindezt John McCarthy a Lisp nyelv gondolatához köti. Az első Lisp implementációk átgondoltsága és módszertani érvényessége lehetővé tette az új problémák megoldásában szerzett tapasztalatok gyors felhalmozását és az alkalmazott és elméleti programozásra való felkészítést. Jelenleg több száz funkcionális programozási nyelv létezik, amelyek különböző típusú feladatokra és technikai eszközökre összpontosítanak.

A fő programozási paradigmák a megoldandó problémák összetettségének növekedésével fejlődtek. A számítógépes információfeldolgozási folyamatok szervezésének technikai részleteinek kidolgozásának mélységétől és általánosságától függően a programozási eszközök és módszerek rétegződése következett be. Különféle programozási stílusok jelentek meg, amelyek közül a legérettebbek a géporientált, rendszer-, logikai, transzformációs és nagy teljesítményű párhuzamos programozás.

A gép-orientált programozást hardveres megközelítés jellemzi a számítógép működésének megszervezésében, amelynek célja bármilyen hardver képesség elérése. A hangsúly a hardverkonfiguráción, a memória állapotán, a parancsokon, a vezérlés átvitelén, az események sorrendjén, a kivételeken és meglepetéseken, az eszköz válaszidején és a válasz sikerén van. Az Assembly nyelvet egy ideje háttérbe szorítja a Pascal és a C által választott vizuális médium, még a mikroprogramozásban is, de a felhasználói felület fejlesztései visszanyerhetik pozícióját.

A rendszerprogramozás hosszú ideje fejlődik a szerviz és az egyedi munka nyomása alatt. Az ilyen munkában rejlő gyártási megközelítés a reprodukálható folyamatok és az ismételt felhasználásra tervezett stabil programok preferálásán alapul. Az ilyen programok esetében indokolt a fordítási feldolgozási séma, a tulajdonságok statikus elemzése, az automatizált optimalizálás és vezérlés. Ezen a területen az imperatív-procedurális programozási stílus dominál, amely az alkalmazott programozás operátori stílusának közvetlen általánosítása. Lehetővé teszi némi szabványosítást és moduláris programozást, de meglehetősen bonyolult struktúrákat, specifikációkat, tesztelési módszereket, programintegrációs eszközöket stb. A hatékonyság és a megbízhatóság szigorú követelményeinek megfelelnek a professzionális eszközök fejlesztése, amelyek komplex asszociatív szemantikai heurisztikát, valamint szintaktikailag vezérelt tervezési és programgenerálási módszereket alkalmaznak. Az ilyen eszközökben rejlő vitathatatlan lehetőségeket a gyakorlatban korlátozza a fejlesztés összetettsége - képzettségi követelmény merül fel.

A nagy teljesítményű programozás célja a lehető legnagyobb teljesítmény elérése különösen fontos problémák megoldása során. A számítógépes teljesítmény természetes tartaléka a párhuzamos folyamatok. Szervezetük megköveteli az időviszonyok részletes mérlegelését és a cselekvések irányításának nem kötelező stílusát. A nagy teljesítményű számítástechnikát támogató szuperszámítógépek speciális rendszerprogramozási technikákat igényeltek. A párhuzamos architektúrák rendszereinek és folyamatainak ábrázolásának gráfhálózati megközelítését speciális párhuzamos programozási nyelvekben és szuperfordítókban fejezték ki, amelyek a feladat szintű folyamatok absztrakt hierarchiájának leképezésére szolgálnak a valós berendezések processzorainak sajátos térszerkezetére.

A logikai programozás a funkcionális programozás egyszerűsítéseként jelent meg a szimbolikus feldolgozási problémákat megoldó matematikusok és nyelvészek számára. Különösen vonzó a nondeterminizmus fogalmi alapként való felhasználásának lehetősége, amely megszabadít minket az idő előtti rendezéstől a képletek feldolgozásának programozása során. A megtérüléssel járó folyamatok generálásának termelési stílusa kellően természetes ahhoz, hogy a formalizált tudás szakértők általi tisztázásához nyelvi megközelítést alkalmazzanak, és csökkenti az indulási akadályt.

A transzformációs programozás módszertanilag egyesítette a programoptimalizálás, a makrogenerálás és a részleges számítás technikáit. Ezen a területen a központi fogalom az információs ekvivalencia. Megnyilvánul a programok, folyamatok transzformációinak meghatározásában, az átalakítások alkalmazhatóságának kritériumainak keresésében, felhasználásukra vonatkozó stratégia megválasztásában. Vegyes számítások, elhalasztott műveletek, lusta programozás, késleltetett folyamatok stb. módszerként használják az információfeldolgozás hatékonyságának növelésére bizonyos további meghatározott feltételek mellett.

A kiterjedt programozási megközelítések természetes választ jelentenek a hardver és a számítógépes hálózatok teljesítményének radikális javulására. A számítástechnikai eszközök átmenete zajlik a műszaki eszközök osztályából a háztartási gépek osztályába. Megjelent a talaj a programozási megközelítések korszerűsítésére, valamint a számítógépek alacsony technológiája és teljesítménye miatt gyengén kidolgozott régi ötletek rehabilitációjának lehetőségére. Érdekes olyan kutatási, evolúciós, kognitív és adaptációs megközelítések kialakítása a programozásban, amelyek lehetőséget teremtenek a valós információforrások és a számítógépes potenciál racionális fejlesztésére.

A professzionális, oktatási és amatőr programozás oktatási-játék stílusú kutatási megközelítése lendületet adhat a találékonyság keresésének olyan programozási technológia fejlesztésében, amely a korábbi elembázison nem tudott megbirkózni a válságjelenségekkel. Az evolúciós megközelítés a programok finomításának mobil stílusával elég jól látható az objektum-orientált programozás koncepciójában, amely fokozatosan alany-orientált programozássá fejlődik. A definíciók újrafelhasználása és az objektumtulajdonságok öröklése meghosszabbíthatja a hibakereső információs környezetek életciklusát, növelheti működésük megbízhatóságát és egyszerűbb a használhatóságot.

A kognitív megközelítés a nyílt rendszerek vizuális interfész fejlesztésének interoperábilis stílusával és új audio-video eszközök és nem szabványos eszközök használatával módot nyit az összetett információk észlelésének javítására és a megfelelő feldolgozás egyszerűsítésére.

A személyre szabott információs rendszerek egyénre szabott tervezésének ergonómikus stílusú adaptív megközelítése lehetőséget ad az informatikusoknak az emberi tényezőre érzékeny valós idejű technológiai folyamatok kompetens programozására, szervezésére és támogatására. A programozási paradigma fejlődési iránya az információs rendszerek fejlesztése és alkalmazása iránt érdeklődők körének megváltozását tükrözi. Számos fontos fogalom a programozási gyakorlat számára, mint például események, kivételek és hibák, potenciál, konstrukciók hierarchiája és ortogonalitása, extrapoláció és programnövekedési pontok, minőségmérés stb. nem érte el az absztrakció és a formalizáltság kellő szintjét. Ez lehetővé teszi számunkra, hogy előre jelezzük a programozási paradigmák fejlődését, és válasszuk ki az oktatási anyagokat a komponensprogramozás jövőjéhez. Ha az újrafelhasználható komponensek kiválasztásának hagyományos eszközei és módszerei a modularitás kritériuma alá tartoztak, amely a minimális tengelykapcsoló optimális választása, maximális funkcionalitással, akkor a modern elembázis lehetővé teszi az egyszerű műveleteket végrehajtó többérintkezős egységek működését. De mindezekkel a típusokkal és programozási paradigmákkal megismerkedhetünk akár a Wikipédia segítségével is. Jelenleg nagyon széles skálán mozog a programozás különböző irányú fejlesztése.

Ma megértjük, mik a programozási paradigmák és mindegyikük megkülönböztető jellemzői.

A paradigma meghatározása általában így hangzik:

A paradigmák olyan ötletek és fogalmak alapelvei, amelyek meghatározzák a számítógépes programok írásának stílusát.

Azt is meg kell jegyezni, hogy paradigmák nem csak a programozásban léteznek, hanem a filozófiában stb.

A definíció alapján azt mondhatjuk, hogy a programozási paradigma a számítógépes szoftverek írásának sajátos alapelvei.

A programozási paradigmák típusai

Történt ugyanis, hogy sok programozó javasolta elveit, programírási módjait, és ennek eredményeként számos paradigma született.

Felsoroljuk közülük a legnépszerűbbeket:

  • Kötelező programozás
  • Strukturált programozás
  • Deklaratív programozás
  • Objektumorientált programozás

Valójában sokkal több olyan paradigma van, amelyeket nem soroltunk fel a listában, ezek közül csak a leghíresebbeket ismertetjük.

Nézzük meg röviden mindegyiket

Kötelező programozás

A legelső paradigma, amely közvetlenül a számítógépek megjelenése után alakult ki.

angolról parancsoló- rendelés

Az imperatív programozás megkülönböztető jellemzői:

A forráskódban az „orders” parancsok vannak írva, nem az osztályok, mint például az objektum-orientált programozásban.

Minden utasítást szekvenciálisan, egymás után kell végrehajtani (például nem ugorhatunk a kód egyik szakaszáról a másikra)

Az utasítások végrehajtása után az adatok a memóriába írhatók és a memóriából kiolvashatók.

A paradigmát képviselő nyelvek: gépi (bináris) kódok, Assembly, fortran, algol, cobol

Strukturált programozás

Ezt a módszert egy holland tudós javasolta

Edsger Dijkstra 1930-2002

De a strukturált programozás fő koncepciója a koncepció blokkokés hierarchikus struktúra, és amely három fő vezérlési struktúrát használ:

  • utósorozat
  • elágazó

A strukturált programozásnak 7 Dijkstra által leírt alapelve van:

  1. a goto operátor használatának teljes megtagadása; *
  2. bármely program három vezérlőstruktúrára épül: sorrend, ciklus és elágazás;
  3. az alapvető vezérlőstruktúrák tetszés szerint egymásba ágyazhatók;
  4. Az ismétlődő komponenseket szubrutinként kell megtervezni;
  5. Minden logikai struktúrát úgy kell formázni, mint Blokk;
  6. minden struktúrának egy bemenettel és egy kimenettel kell rendelkeznie, és nem több;
  7. A programfejlesztés lépésről lépésre haladjon „létra” módszerrel (fentről lefelé módszer)

* —
A goto egy feltétel nélküli ugráskezelő, amelyet az 1970-es években széles körben használtak

Deklaratív programozás

egy probléma megoldásának specifikációját képviseli, és leírja, hogy mi a probléma és a munka várható eredménye.

Ezzel szemben az imperatív programozás, mert a deklaratív programozás leírja Mit csinálni, és egy másikban Hogyan csináld.

Objektum-orientált programozás (OOP)

a legnépszerűbb és leggyakrabban használt paradigma, amelyet szinte minden programozó elfogad a világon. Minden ipari programozás erre épül. A fő ötlet az, hogy egy programot objektumként ábrázoljunk, amelyek viszont egy osztály példányát képviselik, az osztályok pedig öröklési hierarchiát alkotnak.

Az OOP alapfogalmai

Adatabsztrakció— a lényeges információk kiemelése és elválasztása a jelentéktelen információktól.

Egységbezárás- ez egy olyan tulajdonság, amely lehetővé teszi adatok és metódusok kombinálását egy osztályban

Öröklés- egy tulajdonság, amely lehetővé teszi új osztály létrehozását egy régi alapján (minden tulajdonságát örökli)

Polimorfizmus- és ez a tulajdonság lehetővé teszi az azonos interfésszel rendelkező objektumok használatát

számú előadás Programozási paradigmák. Kötelező programozás.

    A programozási paradigma fogalma.

    Programozási paradigmák osztályozása.

    Kötelező programozás.

  1. A programozási paradigma fogalma.

A programozási paradigma olyan megközelítések, módszerek, stratégiák, ötletek és koncepciók összessége, amelyek meghatározzák a programok írásának stílusát.

A programozási paradigmát a modern programozási iparban nagyon gyakran a programozó eszközkészlete (programozási nyelv és operációs rendszer) határozza meg.

A programozási paradigma azt ábrázolja (és meghatározza), hogy a programozó hogyan látja a program végrehajtását. Például az objektum-orientált programozásban a programozó a programot kölcsönhatásban lévő objektumok halmazának tekinti, míg a funkcionális programozásban a program funkcióértékelések láncaként jelenik meg.

Egy bizonyos személy elkötelezettsége egy adott paradigma mellett olykor olyan erős, hogy a különféle paradigmák előnyeiről és hátrányairól szóló vitákat számítógépes körökben az úgynevezett „vallási” háborúk közé sorolják.

A kifejezés története

A „paradigma” kifejezés nyilvánvalóan Thomas Kuhnnak és „The Structure of Scientific Revolutions” című könyvének köszönheti modern jelentését a tudományos és műszaki területen (lásd paradigma). Kuhn paradigmáknak nevezte azokat a tudományos nézetrendszereket, amelyeken belül a kutatás folyik. Kuhn szerint egy tudományág fejlődése során az egyik paradigmát felválthatja a másik (mint például Ptolemaiosz geocentrikus égi mechanikáját felváltotta Kopernikusz heliocentrikus rendszere), miközben a régi paradigma továbbra is fennáll. egy ideig, sőt kifejlődik annak a ténynek köszönhető, hogy sok támogatója ilyen vagy olyan okból kiderül, hogy nem tudnak alkalmazkodni a más paradigmában végzett munkához.

A "programozási paradigma" kifejezést először Robert Floyd használta Turing-díjas előadásában.

Floyd megjegyzi, hogy a programozás során megfigyelhető a Kuhn-paradigmákhoz hasonló jelenség, de azokkal ellentétben a programozási paradigmák nem zárják ki egymást:

Ha a programozási művészet egészének fejlődése megköveteli a paradigmák állandó feltalálását és fejlesztését, akkor az egyes programozók művészetének fejlesztése megköveteli, hogy paradigmarepertoárját bővítse.

Így Robert Floyd szerint a Kuhn által leírt tudományos világ paradigmáitól eltérően a programozási paradigmák kombinálhatók, gazdagítva a programozó eszközeit.

2. Programozási paradigmák osztályozása.

Az imperatív vezérlésen és a procedurális-operátoros programépítési stíluson alapuló alkalmazott programozás vezető paradigmája több mint ötven éve vált népszerűvé a számítástechnikai és információs folyamatok szervezésében dolgozó szakemberek magas szakmai színvonalú tevékenysége területén. Az elmúlt évtized élesen kiterjesztette a számítástechnika földrajzát, kiterjesztve azt a tömegkommunikáció és a szabadidő szférájára is. Ez megváltoztatja az információs rendszerek értékelésének kritériumait, valamint az információfeldolgozás eszközeinek és módszereinek megválasztásával kapcsolatos preferenciákat.

A számítógépes programozás korszakának legelején kialakult általános programozási paradigmák - többek között az alkalmazott, az elméleti és a funkcionális programozás paradigmái - a legstabilabbak.

Az alkalmazott programozás problémaorientált, tükrözi az információ számítógépesítését és a numerikus feldolgozás számítási folyamatait, amelyeket jóval a számítógépek megjelenése előtt tanulmányoztak. Itt gyorsan világos gyakorlati eredmény született. Természetesen ezeken a területeken a programozás alig különbözik a kódolástól, ehhez általában elegendő a műveletek ábrázolásának operátori stílusa. Az alkalmazott programozás gyakorlatában az a szokás, hogy megbízunk a bevált sablonokban, eljárások könyvtáraiban, kerüljük a kockázatos kísérleteket. A tudományos számítások pontosságát és stabilitását értékelik. A Fortran nyelv az alkalmazásprogramozás veteránja. Csak az elmúlt évtizedben vált némileg alábbvalóvá ezen a területen a Pascal-C-nél, szuperszámítógépeken pedig a párhuzamos programozási nyelveknél, mint például a Sisal. [, , , ]

Az elméleti programozás a programozás és a számítástechnika területén végzett tudományos kísérletek eredményeinek összehasonlíthatóságát célzó publikációs orientációt követi. A programozás igyekszik kifejezni formális modelljeit, bemutatni azok jelentőségét, alapvető természetét. Ezek a modellek megörökölték a kapcsolódó matematikai fogalmak főbb jellemzőit, és az informatika algoritmikus megközelítéseivé váltak. A konstrukciók bizonyítékának vágya, hatékonyságuk, plauzibilitásuk, helyességük, helyességük és egyéb formalizált összefüggések diagramokban és programszövegekben való értékelése szolgált alapul a strukturált programozáshoz [, ] és a programfejlesztési folyamat megbízhatóságának elérésére szolgáló egyéb módszerekhez, pl. , kompetens programozás. Az Algol és Pascal standard részhalmazait, amelyek a programozási elmélet munkaanyagaként szolgáltak, a kísérletezéshez kényelmesebb alkalmazási nyelvek váltották fel, mint például az ML, a Miranda, a Scheme és más Lisp dialektusok. Most csatlakoznak hozzájuk a C és a Java részhalmazai.

A funkcionális programozás a mesterséges intelligencia kutatásának és fejlesztésének matematikai orientációja, valamint a számítástechnika új távlatainak kialakítása előtti tisztelgésként jött létre. Az információmegjelenítés absztrakt megközelítése, a függvények felépítésének lakonikus, univerzális stílusa, a végrehajtási környezet áttekinthetősége a különböző függvénykategóriákhoz, a rekurzív konstrukciók szabadsága, a matematikus és a kutató intuíciójába vetett bizalom, az idő előtti teher elkerülése a memóriaelosztás elvtelen problémáinak megoldása, a definíciók hatókörének ésszerűtlen korlátozásainak elutasítása - mindezt John McCarthy a Lisp nyelv gondolatához köti. Az első Lisp implementációk átgondoltsága és módszertani érvényessége lehetővé tette az új problémák megoldásában szerzett tapasztalatok gyors felhalmozását és az alkalmazott és elméleti programozásra való felkészítést. Jelenleg több száz funkcionális programozási nyelv létezik, amelyek különböző típusú feladatokra és technikai eszközökre összpontosítanak. [,,,,,,,]

Az alapvető programozási eszközök és módszerek a megoldandó problémák összetettségének növekedésével fejlődtek. A számítógépes információfeldolgozási folyamatok szervezésének technikai részleteinek kidolgozásának mélységétől és általánosságától függően a programozási paradigmák rétegződése következett be. Különböző programozási stílusok jelentek meg, amelyek közül a legkiforrottabb az alacsony szintű (géporientált), a rendszer-, a deklaratív-logikai, az optimalizáló-transzformációs és a nagy teljesítményű/párhuzamos programozás.

Az alacsony szintű programozást hardveres megközelítés jellemzi a számítógép működésének megszervezésében, amelynek célja bármilyen hardver képesség elérése. A hangsúly a hardverkonfiguráción, a memória állapotán, a parancsokon, a vezérlés átvitelén, az események sorrendjén, a kivételeken és meglepetéseken, az eszköz válaszidején és a válasz sikerén van. Az Assembly nyelvet egy ideje háttérbe szorítja a Pascal és a C által választott vizuális médium, még a mikroprogramozásban is, de a felhasználói felület fejlesztései visszanyerhetik pozícióját. [,,,]

A rendszerprogramozás hosszú ideje fejlődik a szerviz és az egyedi munka nyomása alatt. Az ilyen munkában rejlő gyártási megközelítés a reprodukálható folyamatok és az ismételt felhasználásra tervezett stabil programok preferálásán alapul. Az ilyen programok esetében indokolt a fordítási feldolgozási séma, a tulajdonságok statikus elemzése, az automatizált optimalizálás és vezérlés. Ezen a területen az imperatív-procedurális programozási stílus dominál, amely az alkalmazásprogramozás operátori stílusának közvetlen általánosítása. Lehetővé teszi némi szabványosítást és moduláris programozást, de meglehetősen bonyolult struktúrákat, specifikációkat, tesztelési módszereket, programintegrációs eszközöket stb. A hatékonyság és a megbízhatóság szigorú követelményeinek megfelelnek a professzionális eszközök fejlesztése, amelyek komplex asszociatív szemantikai heurisztikát, valamint szintaktikailag vezérelt tervezési és programgenerálási módszereket alkalmaznak. Az ilyen eszközökben rejlő vitathatatlan lehetőségeket a gyakorlatban korlátozza a fejlesztés összetettsége - képzettségi követelmény merül fel.

A nagy teljesítményű programozás célja a lehető legnagyobb teljesítmény elérése különösen fontos problémák megoldása során. A számítógépes teljesítmény természetes tartaléka a párhuzamos folyamatok. Szervezetük megköveteli az időviszonyok részletes mérlegelését és a cselekvések irányításának nem kötelező stílusát. A nagy teljesítményű számítástechnikát támogató szuperszámítógépek speciális rendszerprogramozási technikákat igényeltek. A párhuzamos architektúrák rendszereinek és folyamatainak ábrázolásának gráfhálózati megközelítését speciális párhuzamos programozási nyelvekben és szuperfordítókban fejezték ki, amelyek a feladatszintű folyamatok absztrakt hierarchiájának valós berendezések processzorainak sajátos térbeli struktúrájára való leképezésére szolgálnak [,,] .

A deklaratív (logikai) programozás a funkcionális programozás leegyszerűsítéseként jött létre a szimbolikus feldolgozási problémákat megoldó matematikusok és nyelvészek számára. Különösen vonzó a nondeterminizmus fogalmi alapként való felhasználásának lehetősége, amely megszabadít minket az idő előtti rendezéstől a képletek feldolgozásának programozása során. A hozamú folyamatok generálásának termelési stílusa kellően természetes ahhoz, hogy a formalizált tudás szakértői tisztázása nyelvi megközelítést alkalmazzon, és csökkenti az információs rendszerek bevezetésének kiinduló gátját.

A transzformációs programozás módszertanilag egyesítette a programoptimalizálás, a makrogenerálás és a részleges számítás technikáit. Ezen a területen központi fogalom az információs ekvivalencia. Megnyilvánul a programok, folyamatok transzformációinak meghatározásában, az átalakítások alkalmazhatóságának kritériumainak keresésében, felhasználásukra vonatkozó stratégia megválasztásában. Vegyes számítások, elhalasztott műveletek, lusta programozás, késleltetett folyamatok stb. módszerként használják az információfeldolgozás hatékonyságának növelésére bizonyos további meghatározott feltételek mellett. [,]

A programozási paradigmák továbbfejlődése az információs rendszerek használata iránt érdeklődők körének megváltozását tükrözi. Az átfogó programozási megközelítések kialakulása természetes válasz a berendezések és számítógépes hálózatok teljesítményjellemzőinek radikális javulására. A számítástechnikai eszközök átmenete zajlik a műszaki eszközök osztályából a háztartási gépek osztályába. Megjelent a talaj a programozási megközelítések korszerűsítésére, valamint a számítógépek alacsony technológiája és teljesítménye miatt gyengén kidolgozott régi ötletek rehabilitációjának lehetőségére. Érdekes a programozás kutatási, evolúciós, kognitív és adaptációs megközelítéseinek kidolgozása, amelyek kilátásba helyezik a valós információforrások és a számítógépes potenciál racionális fejlesztését. [,]

A professzionális, oktatási és amatőr programozás oktatási-játék stílusú kutatási megközelítése lendületet adhat a leleményességnek olyan programozási technológia fejlesztésében, amely a korábbi elembázison nem tudott megbirkózni a válságjelenségekkel. [,]

Az evolúciós megközelítés a programok finomításának mobil stílusával elég jól látható az objektum-orientált programozás koncepciójában, amely fokozatosan alanyi, sőt ego-orientált programozássá fejlődik. A definíciók újrafelhasználása és az objektumtulajdonságok öröklése meghosszabbíthatja a hibakereső információs környezetek életciklusát, növelheti működésük megbízhatóságát és egyszerűbb a használhatóságot. A kognitív megközelítés a nyílt rendszerek vizuális interfész fejlesztésének interoperábilis stílusával és új audio-video eszközök és nem szabványos eszközök használatával módot nyit az összetett információk észlelésének javítására és a megfelelő feldolgozás egyszerűsítésére. [,]

Az adaptációs megközelítés a személyre szabott információs rendszerek egyénre szabott tervezésének ergonomikus stílusával lehetőséget ad az informatikusoknak az emberi tényezőre és a rendszertranszferre érzékeny valós idejű technológiai folyamatok kompetens programozására, szervezésére és támogatására [,].

Egyetlen építészeti vonal, szabványos interfész, szabványos programozási technológia stb. dominanciája, amely mára stabilizálódik. tele van agilitás elvesztésével az információs technológiák frissítése során. Azok az emberek, akik hozzászoktak ahhoz, hogy mindent egyszer s mindenkorra szilárdan asszimiláljanak, különösen sebezhetőek ebben a tekintetben. A programozási nyelvek tanulása során az ilyen problémák elkerülhetők, ha különböző programozási nyelveket tanítanak egyszerre, vagy előre bemutatják az alapot, amely meghatározza a nyelvtani szerkezetet az olyan fogalmak általánosítására, amelyek változatossága az egyszerűsített oktatási példákban nehezen megfogható. A funkcionális programozás tanulmányozása éppen ezt az alapot nyújtja abban az értelemben, hogy a különböző tevékenységi területeken a programozás gyakorlatában kialakult paradigmák bemutatására és elemzésére irányul, különböző szintű szakképzettséggel, ami koncepcionálisan hasznos lehet. a számítástechnika új jelenségeinek tanulmányozásának alapja.

A programozási paradigma a szakmai magatartás alakításának eszköze. A számítástechnika a műszaki szakemberekből és tudósokból álló magasan képzett elit professzionális programozásából a civilizált társadalom aktív részének szabad időtöltésévé vált. Az információs rendszerek megértésen keresztüli elsajátítását a hozzáértő cselekvés és a technológia felelős használata céljából felváltották az információs környezet kaotikus befolyásolásának intuitív készségei, szerény szerencsével, tudásigény nélkül. A közös használatú központok karbantartása, az információs integritás professzionális támogatása és az adatok előkészítése szinte teljesen átadta a helyét a személyi számítógépek önkiszolgálásának, a hálózatok és a heterogén szerverek önálló működésének, a különféle kommunikációk interakciójával.

A fejlesztés alatt álló programok, a feldolgozott adatok és a feladatkezelés egymás mellé helyezése átadja a helyét az olyan interfészek gondolatának, amelyeket úgy terveztek, hogy részt vegyenek az információáramlásban, például a navigációban. A korábbi minőségi kritériumokat: a sebességet, a memóriamegtakarítást és az információfeldolgozás megbízhatóságát egyre inkább háttérbe szorítja a játék vonzereje és a világ információforrásaihoz való széles körű hozzáférés. Az ismert minőségi és megbízhatósági garanciákkal rendelkező zárt szoftverrendszereket kiszorítják a nyílt információs rendszerek, amelyek összetétele, tárolásának és feldolgozásának módjai előre nem láthatók.

Számos fontos fogalom a programozási gyakorlat számára, mint például események, kivételek és hibák, potenciál, konstrukciók hierarchiája és ortogonalitása, extrapoláció és programnövekedési pontok, minőségmérés stb. nem érte el az absztrakció és a formalizáltság kellő szintjét. Ez lehetővé teszi a programozási paradigmák fejlődésének előrejelzését, és oktatási anyagok kiválasztását a komponensprogramozás jövőjéhez (COM/DCOM, Corba, UML stb.). Ha az újrafelhasználható komponensek kiválasztásának hagyományos eszközei és módszerei a modularitás kritériuma alá tartoztak, amely a minimális tengelykapcsoló optimális választása, maximális funkcionalitással, akkor a modern elembázis lehetővé teszi az egyszerű műveleteket végrehajtó többérintkezős egységek működését. [,,,,,]

A programozási paradigma aktualizálásának ezek a tünetei határozzák meg az alapfogalomrendszerben, az információ- és számítástechnika fogalmában bekövetkező változások irányát. A Java-koncepcióban a C-vel összehasonlítva meghirdetett interpreterek (pontosabban hiányos fordítás) használatának trendje a fordítók helyett, és az objektum-orientált programozás csábítása az általánosan elfogadott imperatív-procedurális programozási stílus hátterében. a funkcionális stílus felé irányuló implicit mozgásnak tekinthető. A funkcionális képletek modellező ereje elegendő a különböző paradigmák teljes körű megjelenítéséhez, amely lehetővé teszi azok alapján a gyakorlati ismeretek elsajátítását az információs folyamatok jövőre való szervezésében.

A múlt (XX.) század közepén a „programozás” kifejezés nem jelentett kapcsolatot a számítógéppel. Látható volt a "Számítógépes programozás" című könyv címe. Alapértelmezés szerint ez a kifejezés a folyamatok számítógépeken és számítógépes hálózatokon történő szervezését jelenti.

A programozás, mint tudomány az eredmények értékelésében jelentősen eltér a matematikától és a fizikától. A fizikusok és matematikusok által elért eredmények szintjét általában hasonló vagy magasabb képzettségű szakemberek értékelik. A programozás eredményeinek értékelésében fontos szerepet játszik a felhasználó értékelése, aki nem állítja magát programozási tudással. Ezért a hagyományos tudományoktól eltérően a programozó szakemberek részben azt a funkciót látják el, hogy szakmai kifejezéseiket felhasználói fogalmakra fordítsák.

A programozásnak megvan a maga sajátos módszere az eredmények megbízhatóságának megállapítására - ez egy számítógépes kísérlet. Ha a matematikában a megbízhatóság csak a szakemberek számára érthető demonstratív konstrukciókon, a fizikában pedig egy reprodukálható laboratóriumi kísérleten múlik, amely speciális felszerelést igényel, akkor a számítógépes kísérlet elérhető lehet a nagyközönség számára.

A programozás másik jellemzője a gyorsan fejlődő elektronikus technológiától való függéséből fakad. Emiatt a programozási tudás a klasszikusok és a divat ötvözete. A divatos új termékek specifikus ismeretei elavulnak, ezért az ismeretek és készségek gyors frissítéséhez klasszikus alapokra van szükség, amelynek közvetlen célja nem teljesen nyilvánvaló a felhasználók és a kezdők számára. [,,]

A programozás elméleti alapként matematikai apparátust használ (halmazelmélet, számelmélet, algebra, logika, algoritmusok és rekurzív függvények elmélete, gráfelmélet stb.)

A programok minőségi kritériumai nagyon változatosak. Jelentőségük alapvetően a feladatok osztályától és a programok alkalmazási feltételeitől függ:

hatékonyság

megbízhatóság

fenntarthatóság

automatizálás

az erőforrások hatékony felhasználása (idő, memória, eszközök, információ, emberek)

könnyű fejlesztés és használat

a program szövegének láthatósága

a programfolyamat megfigyelhetősége

diagnosztika, hogy mi történik

A kritériumok sorrendje gyakran változik a program alkalmazási területének fejlődésével, a felhasználói képzettség növekedésével, a berendezések korszerűsítésével, az informatikai és szoftverfejlesztéssel. A probléma megoldásának helyének ebből adódó folyamatos fejlesztése további követelményeket támaszt az információs rendszerek programozási stílusával szemben:

rugalmasság

módosíthatóság

javíthatóság

A programozás mint tudomány, művészet és technológia feltárja és kreatívan fejleszti a programok létrehozásának és felhasználásának folyamatát, meghatározza a programok elkészítésének eszközeit és módszereit, amelyek sokféleségével további, számos alapelemzést feldolgozó előadáson ismerkedünk meg. programozási paradigmák.

Nyilvánvaló nehézségekbe ütközik a programozási nyelvek osztályozása és annak meghatározása, hogy egy adott programozási paradigmához tartoznak-e. Ebben a kurzusban a programozási paradigmát alapvető szemantikai rendszerek kölcsönhatása jellemzi, úgymint adatfeldolgozás, adattárolás, adatfeldolgozás vezérlése. Ezzel a megközelítéssel a paradigmák három kategóriája különböztethető meg:

alacsony szintű programozás;

programozás magas szintű nyelveken;

rendkívül magas szintű nyelveken alapuló programok elkészítése.

Az alacsony szintű programozás az architektúra és a hardver által diktált adatstruktúrákkal foglalkozik. Az adatok és programok tárolásakor globális memóriát és automatikus adatfeldolgozási vezérlési modellt használnak. [,,,,,,,,,]

A magas szintű nyelveken történő programozás a megoldandó problémák természetét tükröző adatstruktúrák meghatározásához igazodik. Az adatstruktúrák láthatósági területeinek és feldolgozására szolgáló eljárásoknak hierarchiáját használják, alárendelve egy strukturális-logikai vezérlési modellnek, amely lehetővé teszi a programhibakeresési folyamat konvergenciáját. [,,,,,,,]

A programozási paradigma olyan ötletek és koncepciók összessége, amelyek meghatározzák a programok írásának stílusát.

Az imperatív paradigma a számítási folyamatot olyan utasítások formájában írja le, amelyek megváltoztatják a program állapotát. Az imperatív program nagyon hasonlít a természetes nyelvek kötelező parancsaihoz, azaz parancsok sorozata, amelyet a számítógépnek végre kell hajtania. A Turing-Post véges automata modell alapján.

Az első kötelező nyelvek a gépi kódok voltak - a számítógép natív programozási nyelve. Ezeken a nyelveken az utasítások rendkívül egyszerűek voltak, ami csökkentette a számítógépek terhelését, de megnehezítette a nagy programok írását. 1954-ben megjelent az első „emberi” programozási nyelv - FORTRAN, majd ALGOL, COBOL, BASIC, Pascal, C.

Az imperatív programozás egyik jellemzője a „destruktív hozzárendelés” művelettel rendelkező változók jelenléte. Vagyis volt egy A változó, amelynek X értéke volt. Az algoritmus azt utasítja, hogy a következő lépésben hozzárendelje az Y értéket az A változóhoz. Az A-val rendelkező érték „örökre elfelejtődik”.

Az imperatív programozás a legalkalmasabb kis részfeladatok megvalósítására, ahol nagyon fontos a végrehajtás sebessége a modern számítógépeken. Ezenkívül a külső eszközökkel végzett munkát általában a műveletek szekvenciális végrehajtásával írják le ("nyisd ki a csapot, húzz vizet"), ami ideálissá teszi az ilyen feladatokat a kötelező végrehajtáshoz.

A programozás alapjainak tanítására vonatkozó imperatív paradigma keretének megválasztása kétségtelennek tűnik. Ennek több oka is van:

· az imperatív paradigma áll a legközelebb az emberi természethez és az intuitív algoritmus-koncepcióhoz a gondolkodásfejlődés korai szakaszában (az algoritmizálás elemeit tartalmazó fejlesztő nevelésnek már általános iskolában pozitív tapasztalatai vannak);

· az imperatív paradigma keretein belüli programozás a feladatok széles körére hatékony, amelyek közül sok az alapiskola felső tagozatos tanulóinak proximális fejlődési zónájába esik;

· az imperatív paradigma áll a legközelebb a számítógép természetéhez, működésének alapelveihez, hiszen a modern számítógép minden bonyolultsága ellenére hardver szinten mégis tekinthető valamiféle automatának (processzor + memória + ...) véges halmazállapot- (tartalom-) memória);

· csekély a kizárólag deklaratív programozási paradigma keretében létrehozott szoftvertermékek aránya; A problémák megoldása során általában paradigmák kombinációját használják, amelyek közül az egyik elengedhetetlen;

· programozási rendszerek széles választéka független szoftverek formájában és más rendszerekbe integrált alrendszerek formájában, lehetővé téve az imperatív paradigma alapján szoftvertermékek fejlesztését;


· a releváns programozási rendszerekkel kapcsolatos oktatási, referencia és egyéb kiadványok széles választéka papír és elektronikus formában különböző médián és a globális hálózaton.

Hátránya: tiszta formájában csak nagyon egyszerű problémák megoldását teszi lehetővé.

Az eseményvezérelt programozás olyan programozás, amelyben a program különféle eseményekre adott reakciói (felhasználói műveletek) vannak megadva. A PMS az imperatív paradigma „leszármazottjának” tekinthető. A SUP-nak 2 alosztálya van:

1. A párhuzamos programozás egy programot kommunikáló folyamatok halmazaként reprezentál, amelyek párhuzamosan végrehajthatók. Az ilyen programok egy processzoron (az egyes folyamatok lépéseinek végrehajtása váltakozva) vagy többen is végrehajthatók.

Egy párhuzamos folyamatrendszerben minden egyes folyamat feldolgozza az eseményeket. Az események lehetnek általánosak az egész rendszerre, vagy egyediek egy vagy több folyamatra vonatkozóan. Ilyen kifejezésekkel nagyon kényelmes leírni például egy grafikus felhasználói felület elemeit, vagy bármilyen valós folyamat modellezését (például forgalomirányítást) - hiszen az esemény fogalma az ilyen feladatoknál természetes.

2. Az objektum-orientált programozás olyan programozási technológia, amelyben a program objektumok halmazaként és kölcsönhatásaikként jelenik meg. Minden programobjektum egy osztály példánya; - az osztályok örökölhetik szülőosztályaik attribútumait és metódusait, miközben hozzáadják sajátjukat. Az osztályhierarchia lehetővé teszi a megoldandó probléma lényegének több részletezési szinten történő modellezését, majd egy adott részfeladat megoldásához szükséges részletességi szintnek megfelelő osztály használatát.

Fontos kiemelni az objektumok következő alapvető tulajdonságait:

1.) Mivel egy objektum kizárólag az utóbbinak küldött üzenettel képes befolyásolni a másikat, semmilyen módon nem tud közvetlenül együttműködni a „beszédpartner” saját adataival, így nem sértheti meg azok belső konzisztenciáját. Ezt a tulajdonságot (adatrejtőzést) általában beágyazásnak nevezik.

2.) Mivel az objektumok kizárólag üzenetváltáson keresztül lépnek kapcsolatba egymással, előfordulhat, hogy a beszélgetőpartnerek semmit sem tudnak a megfelelőjükben lévő üzenetkezelők megvalósításáról. Az interakció kizárólag üzenetek/események formájában valósul meg, amelyeket meglehetősen könnyű a tartományhoz kötni. Ezt a tulajdonságot (az interakció kizárólag a tartományra vonatkozó leírását) absztrakciónak nevezzük.

3.) Az objektumok kizárólag üzenetküldéssel lépnek kapcsolatba egymással. Ezért, ha az objektum-interakció bármely forgatókönyvében lecserél egy tetszőleges objektumot egy másikra, amely képes ugyanazokat az üzeneteket feldolgozni, a forgatókönyv szintén megvalósítható lesz. Ezt a tulajdonságot (az objektum lecserélésének képességét egy másik, hasonló osztályszerkezetű objektumra) polimorfizmusnak nevezzük.

Sok modern nyelv támogatja az OOP-t, bár eltérő mértékben: A tisztán objektum-orientált nyelvek, mint például a Smalltalk és a Ruby, úgy vannak kialakítva, hogy támogassák, sőt kikényszerítsék az objektumorientált fejlesztési stílust, és nem támogatnak más programozási stílusokat; - a túlnyomórészt objektum-orientált nyelvek, mint például a Java, C++ és Python, elsősorban az OOP támogatására készültek, de lehetővé teszik a procedurális programozás elemeinek használatát; - Történelmileg az eljárási nyelveket, például a Perl-t és a Fortran 2002-t finomították, és néhány OOP-elem támogatását is hozzáadták.

A deklaratív programozási paradigma a számítási folyamatot úgy határozza meg, hogy magát a számítás logikáját írja le, nem pedig a program vezérlési logikáját.

A deklaratív programozás az imperatív programozás ellentéte; az első leírja, hogy mit kell tenni, a második pedig pontosan leírja, hogyan kell csinálni.

A deklaratív programozás legfontosabb típusai a funkcionális és logikai (vagy relációs) programozás.

1. A funkcionális programozás az imperatív megközelítés egyik alternatívája. Church lambda-számításán alapul. Az imperatív programozásban az algoritmusok a szekvenciálisan végrehajtott műveletek leírásai. Létezik az "aktuális végrehajtási lépés" (vagyis az idő) fogalma, és egy "jelenlegi állapot", amely ez idő alatt változik.

A funkcionális programozásban nincs időfogalom. A programok kifejezések, a program végrehajtása ezeknek a kifejezéseknek a kiértékeléséből áll.

Mivel a részkifejezések kiértékelésének sorrendje nem számít, a funkcionális programozás természetesen megvalósítható olyan platformokon, amelyek támogatják a párhuzamosságot.

A funkcionális programozást a többi "nem kötelező" programozási modellhez hasonlóan általában a szekvenciális műveletekkel nehezen megfogalmazható problémák megoldására használják. Szinte minden mesterséges intelligenciával kapcsolatos feladat ebbe a kategóriába tartozik. Közülük érdemes kiemelni a képfelismerés, a felhasználóval való természetes nyelvű kommunikáció, a szakértői rendszerek megvalósítása, az automatizált tételbizonyítás, a szimbolikus számítások feladatait. Ezek a feladatok távol állnak a hagyományos alkalmazásprogramozástól, így nem kapnak nagy figyelmet a számítástechnika tantervekben.

Logikai programozás

A funkcionális programozásban a programok kifejezések, végrehajtásuk értékük kiszámításából áll. A logikai programozásban a program egy elmélet (meglehetősen korlátozott nyelven leírva) és egy állítás, amelyet bizonyítani kell. Ennek az állításnak a bizonyítása a program végrehajtásából áll.

A logikai programozás és a Prolog nyelv a természetes nyelv elemzése terén végzett kutatások során jelent meg. Ezt követően kiderült, hogy a logikai programozás más mesterséges intelligencia feladatok végrehajtásában is ugyanolyan hatékony.

A logikai programozás természetes párhuzamos megvalósítást tesz lehetővé.

És úgy tűnt, senki sem vitatta az OOP stílusban történő tervezés és programozás szükségességét. De idővel mégis félreértésekbe ütköztem. Ez egy tisztán történelmi elméleti cikk lesz. Természetesen anélkül, hogy megpróbálnánk lefedni a téma teljes szélességét. De ez úgymond üzenet egy fiatal fejlesztőnek, aki felülről olvas, és nem tudja megválasztani, hogy melyik elvhez és szabályhoz tartsa be, mi az elsődleges és mi a másodlagos.

Ennek a topiknak a címe most sokak számára nagyon ellentmondásosnak tűnhet (és inkább szándékosan provokatív, de a dolog kedvéért :)). De ennek ellenére megpróbáljuk ezt itt alátámasztani, és megérteni, milyen tulajdonságokkal kell rendelkeznie egy programozási paradigmának ahhoz, hogy paradigmának nevezzék.

Csak annyit kérek, hogy ha átlósan olvassa, kérem visszafogottan kommentelje.

Mit mond Floyd a paradigmákról?

A „programozási paradigma” kifejezést Robert Floyd vezette be („R. W. Floyd.” „Communications of the ACM”, 22(8):455-460, 1979. Az orosz fordítást lásd: Lectures of Turing Award Laureates for az első húsz év (1966-1985), M.: MIR, 1993.). 1979-ben tartott előadásában a következőket mondja:

A programozási paradigma ismert példája a strukturált programozás, amely a programozási módszertan domináns paradigmájának tűnik. Két fázisra oszlik. Az első, felülről lefelé irányuló tervezési fázisban a probléma néhány egyszerűbb részproblémára oszlik. Ez a fokozatos hierarchikus bontás mindaddig folytatódik, amíg nincsenek azonosított részproblémák, amelyek elég egyszerűen kezelhetők közvetlenül. A strukturált programozási paradigma második fázisa azt jelenti, hogy a konkrét objektumoktól és funkcióktól a felülről lefelé irányuló tervezéssel előállított modulokban használt absztraktabb objektumok és funkciók felé haladunk. De a strukturált programozási paradigma nem univerzális. Még a leglelkesebb védelmezői is beismernék, hogy ez önmagában nem elég ahhoz, hogy minden nehéz problémát megkönnyítsen. Más, speciálisabb típusú magas szintű paradigmák továbbra is fontosak. (Ez nem pontos fordítás, hanem egy szerző összeállítása R. Floyd előadása alapján, de az ő szavaihoz a lehető legnagyobb mértékben ragaszkodva. A megfogalmazást csak azért változtattuk és rendeztük, hogy kiemeljük R. Floyd és az ő fő gondolatát. világos bemutatás.)

A továbbiakban megemlíti a dinamikus programozást és a logikai programozást, paradigmának is nevezve ezeket. Különlegességük azonban az, hogy egy speciális tárgykörből fejlesztették ki őket, találtak néhány sikeres algoritmust, és megfelelő szoftverrendszereket építettek. A továbbiakban azt mondja, hogy a programozási nyelveknek támogatniuk kell a programozási paradigmákat. És egyúttal rámutat, hogy a strukturált programozási paradigma egy magasabb szintű paradigma:

A "strukturált programozási paradigmánál""" magasabb absztrakciós szinten lévő """egyenletes"" paradigma egy nyelvi hierarchia felépítése, ahol a legmagasabb szintű nyelvű programok kölcsönhatásba lépnek absztrakt objektumokkal, és lefordítani őket programokká a következő alsó szint nyelvén.

A magasabb szintű paradigmák jellemzői

Amint látjuk, R. Floyd is megkülönböztette a paradigmákat magasabb szintű és speciálisabb paradigmákra. A paradigmák mely jellemzői teszik lehetővé, hogy azt mondjuk, hogy magasabb szintűek? Természetesen ez a lehetőség a különböző tantárgyi problémákra való alkalmazásukra. De mi teszi a paradigmákat alkalmazhatóvá a különböző tartományi problémákra? Természetesen itt nem a tárgyi probléma sajátosságairól van szó, amelyek egyik vagy másik megközelítéssel megoldhatók. Minden olyan paradigma, amely valamilyen speciális módon algoritmus létrehozását javasolja, egyáltalán nem paradigma, csak egy speciális megközelítés egy magasabb szintű paradigma keretein belül.

És csak két magas szintű paradigma létezik: a strukturált programozás és a még magasabb szintű objektumorientált programozás. Ráadásul ez a két paradigma magas szinten ellentmond egymásnak, de alacsony szinten, az algoritmusok felépítésének szintjén, egybeesik egymással. A már létező megközelítések (alacsony szintű paradigmák), mint a logikai, dinamikus, funkcionális pedig jól használhatók a strukturált programozási paradigma keretein belül, illetve a kialakulóban lévő szakterületek egy része - szempont alapú, ágensorientált, eseményorientált - Az objektumorientált programozási paradigma keretein belül használatosak. Ez tehát nem azt jelenti, hogy a programozóknak csak egy-két magas szintű paradigmát kell ismerniük, de más megközelítések ismerete hasznos lesz egy speciálisabb, alacsony szintű probléma megoldásánál. Ugyanakkor, amikor szoftvereket kell tervezni, magasabb szintű paradigmákkal kell kezdeni, és ha szükséges, át kell térni az alacsonyabb szintű paradigmákra. De ha felmerül az előnyben részesítendő elvek kiválasztásának problémája, az alacsonyabb szintű paradigmák elvei soha nem uralhatják a magasabb szintű paradigmák elveit. Például a strukturált programozás alapelveit nem szabad az objektum-orientált programozás elveinek rovására betartani, és a funkcionális vagy logikai programozás elvei nem sérthetik a strukturált programozás alapelveit. Az egyetlen kivétel az algoritmusok teljesítménye, amely a fordítók kódoptimalizálásának problémája. De mivel nem mindig lehet tökéletes fordítókat építeni, és a magasabb szintű paradigmák értelmezése természetesen bonyolultabb, mint az alacsony szintűek, néha szembe kell menni a magas szintű paradigmák elveivel.

De térjünk vissza a kérdésünkhöz: mi teszi a paradigmákat alkalmazhatóvá a különböző témaköri problémákra? De a válaszadáshoz történelmi kirándulást kell tennünk.

A strukturált programozási paradigma alapjai

Tudjuk, hogy a strukturált programozással kapcsolatos ötletek E. Dijkstra 1965-ös jelentése után merültek fel, ahol a GOTO operátor elhagyását indokolta. Ez az operátor alakította a programokat strukturálatlanná (Spagetti kód), és Dijkstra bebizonyította, hogy lehet programokat írni ennek az operátornak a használata nélkül is, aminek következtében a programok strukturálttá válnak.

De egy dolog az elmélet, más a gyakorlat. Ebben az értelemben érdekes megvizsgálni, mi volt a helyzet 1975-re. Ez jól látható E. Yodan () könyvéből. Ezt azért fontos figyelembe venni, mert most, több mint 30 évvel később, az akkor már jól ismert alapelveket most újra felfedezik és új rangra emelik. De ugyanakkor elveszik a történelmi kontextus, és ezen elvek fontosságának hierarchiája, hogy mi az elsődleges és mi a másodlagos. Ez az amorf helyzet nagyon jól jellemzi a programozás jelenlegi állapotát.

De mi történt akkor? Ahogy Yodan leírja, minden a következő kérdés megválaszolásával kezdődik: „Mit jelent jó programot írni?” Ez az első kritérium arra vonatkozóan, hogy egy magas szintű programozási paradigmának milyen kérdésekre kell válaszolnia. Ha nem válaszol közvetlenül erre a kérdésre, hanem azt mondja meg, hogyan szerezheti meg a program néhány érdekes jellemzőjét, akkor alacsony szintű programozási paradigmával van dolgunk.

A programozás hajnalán volt egy ilyen megközelítés a programozók programírási sebesség alapján történő értékelésére. Ez azt jelenti, hogy jó programokat ír? Különös szívességet és tiszteletet élvez a vezetőség részéről? Ha az utolsó kérdésre igenlő a válasz, akkor a programozás fejlesztésének minden kérdése inkább tudományos érdeklődésre tart számot. De a vezetőség azt is észreveheti, hogy egyes szuperprogramozók nagyon gyorsan tudnak programokat készíteni vagy nagyon hatékony programokat írni, de ezek a programok néha strukturálatlanok maradnak, lehetetlen megérteni, karbantartani vagy módosítani. És ez utóbbi is sok időt vesz igénybe.

Figyelemre méltó egy meglehetősen jellemző vita a programozók között:
* A programozó: „Az én programom tízszer gyorsabb, mint a tiéd, és háromszor kevesebb memóriát foglal!”
* B programozó: "Igen, de a te programod nem működik, de az enyém igen!"

De a programok folyamatosan bonyolultabbá válnak, ezért nekünk nem elég, hogy a program csak működik. Bizonyos módszerek szükségesek a program és magának a programozónak a megfelelő működésének ellenőrzéséhez. Sőt, ez nem a program tesztelése, hanem valamilyen szisztematikus eljárás végrehajtása annak érdekében, hogy pontosan ellenőrizze a program helyességét a belső felépítése értelmében. Vagyis akkor is – mai szóhasználattal – kódfelülvizsgálatról beszéltek.

Ráadásul már akkor is szó esett a program rugalmasságáról - a változtatás, bővítés, módosítás könnyűségéről. Ehhez folyamatosan válaszolnia kell egy bizonyos típusú kérdésre. „Mi történik, ha ki akarjuk bővíteni ezt a táblát?”, „Mi történik, ha egy napon új változtatási programot akarunk definiálni?”, „Mi van, ha módosítanunk kell egy ilyen és ehhez hasonló kimenet formátumát?”, „Mi történik, ha valaki úgy dönt, hogy más módon visz be adatokat a programba?”

Beszéltek az interfész specifikációk fontosságáról is, pl. formalizált megközelítés a bemenetek, funkciók és kimenetek specifikációjához, amelyeket minden modulnak végre kell hajtania.

Ezen túlmenően a modul mérete és megváltoztathatatlansága volt a központi szempont. Sőt, ami a modul megváltoztathatatlanságát illeti, nem egészként, hanem az egyes tényezők azonosításával vettük figyelembe:
1. A program logikai felépítése, i.e. algoritmus. Ha az egész program valamilyen speciális megközelítéstől függ, hány modult kell módosítani az algoritmus megváltozásakor?
2. A modul argumentumai vagy paraméterei. Azok. változás az interfész specifikációjában.
3. Belső táblaváltozók és állandók. Sok modul függ a közös tábláktól, ha az ilyen táblák szerkezete megváltozik, akkor számíthatunk arra, hogy a modulok is megváltoznak.
4. Adatbázis szerkezete és formátuma. Ez a függőség nagyobb mértékben hasonlít a fent említett közös változóktól és táblázatoktól való függéshez, azzal a különbséggel, hogy gyakorlati szempontból kényelmesebb az adatbázist a programtól függetlennek tekinteni.
5. Moduláris programirányítási struktúra. Vannak, akik úgy írnak egy modult, hogy nem gondolják át, hogyan fogják használni. De ha a követelmények megváltoztak. Mennyit kell megváltoztatnunk a modul logikai felépítésén?

Ezek és sok más szempont (amit itt nem vettünk figyelembe) általában megfogalmazza a strukturált programozás gondolatát. Ezeknek a szempontoknak a figyelembe vétele teszi a strukturált programozást magas szintű paradigmává.

Az objektum-orientált programozási paradigma alapjai

Amint látjuk, a strukturált programozás során a jó programok szervezésének minden elvét figyelembe veszik. Megváltoztathatja-e a paradigmát, ha a jó programok írásakor még egy vagy egy csoport korábban ismeretlen alapelv jelenik meg? Nem. Ez éppen a strukturált programok írásának módjait és ideológiáját tágítaná, i.e. strukturált programozási paradigma.

De ha a magas szintű paradigmákat arra tervezték, hogy megválaszolják azt a kérdést, hogyan kell jó programot írni, és egy új technikai technika megjelenése, vagy új tényezők figyelembevétele nem teszi lehetővé, hogy túllépjünk a strukturált programozás határain (hiszen az strukturális marad, függetlenül a technikák és tényezők számától), akkor Mi akkor lehetővé teszi számunkra, hogy túllépjünk e paradigma határain. Valójában, amint azt a tudományból tudjuk, a paradigmák általában nem változnak olyan gyorsan. Ritkán történnek tudományos forradalmak, amikor az előző paradigma a gyakorlatban a meglévő elméleti nézetekből egyszerűen nem tudja megmagyarázni a fellépő jelenségeket. Hasonló a helyzet, amikor a paradigmát strukturálisról objektum-orientáltra változtatjuk.

Az már ismert, hogy az objektum-orientált paradigma megjelenésének oka az volt, hogy egyre összetettebb programokat kell írni, míg a strukturált programozási paradigmának van egy bizonyos határa, amely után már elviselhetetlenül nehézkessé válik a program fejlesztése. Itt van például, amit G. Schildt ír:

A programozás fejlesztésének minden szakaszában a módszerek és eszközök úgy tűntek, hogy „kihasználják” a programok növekvő összetettségét. És minden ilyen szakaszban az új megközelítés magába szívta az előzőek legjobbjait, jelezve a programozás előrehaladását. Ugyanez mondható el az OOP-ról is. Az OOP előtt sok projekt elérte (és néha meg is haladta) azt a határt, amelyen túl a programozás strukturált megközelítése már nem működött. Ezért a programok egyre bonyolultabbá válásával járó nehézségek leküzdése érdekében felmerült az OOP igénye. ()

Annak megértéséhez, hogy az objektum-orientált programozás miért tette lehetővé bonyolultabb programok írását, és gyakorlatilag kiküszöbölte a komplexitási korlát kialakulásának problémáját, forduljunk az OOP egyik alapítójához - Gradi Bucihoz (). Az OOP magyarázatát azzal kezdi, hogy mit jelent a komplexitás, és mely rendszerek tekinthetők összetettnek. Vagyis céltudatosan közelíti meg a komplex programok írásának kérdését. Ezután áttér a komplexitás és az emberi képességek közötti kapcsolat kérdésére a komplexitás megértéséhez:

Van egy másik fő probléma: az ember fizikai korlátai, amikor összetett rendszerekkel dolgozik. Amikor elkezdünk elemezni egy összetett szoftverrendszert, sok olyan komponenst tár fel, amelyek különféle módon kölcsönhatásba lépnek egymással, és sem maguk a rendszer részei, sem az egymásra hatásuk nem mutat hasonlóságot. Ez egy példa a rendezetlen komplexitásra. Amikor a tervezési folyamat során elkezdünk rendszerezni egy rendszert, egyszerre sok mindenre kell gondolni. Sajnos egy ember nem tudja mindezt egyszerre felügyelni. Pszichológusok, például Miller kísérletei azt mutatják, hogy az emberi agy egyidejűleg megfigyelhető információs szerkezeti egységeinek maximális száma körülbelül hét, plusz-mínusz kettő. Így komoly dilemma előtt állunk. """A szoftverrendszerek összetettsége növekszik, de agyunk képessége ezzel a bonyolultsággal megbirkózni korlátozott. Hogyan léphetünk ki ebből a szorult helyzetből?"""

Aztán a bomlásról beszél:

Dekompozíció: algoritmikus vagy objektumorientált? Egy összetett rendszer melyik felbontása a helyesebb - algoritmusok vagy objektumok alapján? Ennek a kérdésnek van egy fogása, és a helyes válasz az, hogy mindkét szempont fontos. Az algoritmikus felosztás az események sorrendjére összpontosítja a figyelmet, míg az objektumfelosztás az ágensekre helyezi a hangsúlyt, akik vagy a cselekvés tárgyai vagy alanyai. Egy összetett rendszert azonban nem tervezhetünk egyszerre kétféleképpen. El kell kezdenünk a rendszer particionálását algoritmusonként vagy objektumonként, majd a kapott struktúra felhasználásával meg kell próbálnunk más szemszögből nézni a problémát. A tapasztalat azt mutatja, hogy hasznosabb az objektumbontással kezdeni. Ez a kezdés segíteni fog nekünk abban, hogy jobb munkát végezzünk, hogy a szervezetet a szoftverrendszerek összetettségéhez igazítsuk.

Így ő is előnyben részesíti az objektumorientált elveket a szerkezeti elvekkel szemben, de mindkettő fontosságát hangsúlyozza. Más szavakkal, a szerkezeti elveknek engedelmeskedniük kell az objektum-orientált elveknek ahhoz, hogy az emberi agy megbirkózzon a felmerülő problémák összetettségével. Hangsúlyozza továbbá a modell fontosságát:

A modellépítés fontossága. A modellezés minden mérnöki tudományágban elterjedt, nagyrészt azért, mert megvalósítja a dekompozíció, az absztrakció és a hierarchia elvét. Mindegyik modell a vizsgált rendszer egy bizonyos részét írja le, mi pedig a régiek alapján új modelleket építünk, amelyekben többé-kevésbé magabiztosak vagyunk. A modellek lehetővé teszik, hogy ellenőrizzük kudarcainkat. Kiértékeljük az egyes modellek viselkedését normál és szokatlan helyzetekben, majd megfelelő módosításokat hajtunk végre, ha valamivel nem vagyunk elégedettek. A leghasznosabb olyan modelleket létrehozni, amelyek magában a tartományban található objektumokra összpontosítanak, és így az úgynevezett objektum-orientált dekompozíciót alkotják.

Most, ha jobban megnézzük, kiderül, hogy az objektum-orientált paradigma nem más, mint általában a modellezés, amelynek legfontosabb aspektusát S. Lem fejezte ki a legvilágosabban:

A modellezés a természet utánzása, figyelembe véve néhány tulajdonságát. Miért csak néhány? A tehetetlenségünk miatt? Nem. Először is azért, mert meg kell védenünk magunkat a túlzott információktól. Az ilyen többlet azonban a hozzáférhetetlenségét is jelentheti. A művész képeket fest, de bár beszélgethetnénk vele, nem fogjuk tudni, hogyan készíti a műveit. Ő maga sem tudja, mi történik az agyában, amikor képet fest. Az erről szóló információ a fejében jár, de nem áll rendelkezésünkre. A modellezésnél le kell egyszerűsítenünk: egy nagyon szerény képet festő gép többet árulna el a festészet anyagi, vagyis agyi alapjairól, mint a művész olyan tökéletes „modellje”, mint ikertestvére. A modellezés gyakorlata magában foglalja bizonyos változók figyelembevételét, mások elhagyását. A modell és az eredeti akkor lenne azonos, ha a bennük zajló folyamatok egybeesnének. Ez nem történik meg. A modellfejlesztés eredményei eltérnek a tényleges fejlesztéstől. Ezt a különbséget három tényező befolyásolhatja: a modell leegyszerűsítése az eredetihez képest, a modell eredetitől idegen tulajdonságai, és végül magának az eredetinek a bizonytalansága. (töredék a „Technológiák összege”, Stanislav Lem, 1967)

Így S. Lem az absztrakcióról, mint a modellezés alapjáról beszél. Ugyanakkor az absztrakció az objektum-orientált paradigma fő jellemzője. G. Butch így ír erről:

Az ésszerű osztályozás kétségtelenül minden tudomány része. Michalski és Stepp állítja: „A tudomány szerves feladata a megfigyelt objektumok vagy helyzetek értelmes osztályozásának megalkotása. Ez a besorolás nagyban megkönnyíti a fő probléma megértését és a tudományos elmélet továbbfejlesztését.” Miért olyan nehéz az osztályozás? Ezt a „tökéletes” besorolás hiányának tulajdonítjuk, bár természetesen egyes osztályozások jobbak, mint mások. Coombs, Raffia és Thrale amellett érvel, hogy „annyi módja van a világ objektumrendszerekre való felosztásának, ahány tudós vállalja a feladatot”. Bármilyen besorolás az alany nézőpontjától függ. Flood és Carson példát hoz: „Az Egyesült Királyságot... a közgazdászok gazdasági intézménynek, a szociológusok társadalomnak tekinthetik, a környezetvédők a természet kihaló szegletének, az amerikai turisták turisztikai attrakciónak, a szovjet vezetők katonai fenyegetésként, és végül a legromantikusabb közöttünk. A britek olyanok, mint hazájuk zöld rétjei.”
"""Kulcsabsztrakciók keresése és kiválasztása."""A kulcsabsztrakció egy osztály vagy objektum, amely a problématartomány szókészletében szerepel. ""A kulcsfontosságú absztrakciók legfontosabb értéke, hogy meghatározzák problémánk határait""": kiemelik azt, ami a rendszerünkben benne van, és ezért fontos számunkra, és kiiktatják azt, ami felesleges. Az ilyen absztrakciók azonosításának feladata a problématerületre jellemző. Ahogy Goldberg kijelenti: „Az objektumok helyes megválasztása az alkalmazás céljától és a feldolgozott információ részletességétől függ.”

Amint azt már megjegyeztük, a kulcsfontosságú absztrakciók azonosítása két folyamatot foglal magában: a felfedezést és a feltalálást. Az absztrakciókat a szakterületi szakértők meghallgatásával fedezzük fel: ha egy szakértő beszél róla, akkor ez az absztrakció általában nagyon fontos. A kitalálással új osztályokat és objektumokat hozunk létre, amelyek nem feltétlenül részei a tartománynak, de hasznosak egy rendszer tervezésében vagy megvalósításában. Például egy ATM-felhasználó azt mondja: „számla, kivehető, befizetés”; ezek a kifejezések a tartományi szókincs részét képezik. A rendszerfejlesztő használja őket, de hozzáadja a sajátját, például adatbázist, képernyőkezelőt, listát, sort, stb. Ezeket a kulcsfontosságú absztrakciókat már nem a tartomány hozza létre, hanem a tervezés.

A kulcsfontosságú absztrakciók elkülönítésének leghatékonyabb módja, ha a problémát a már ismert osztályokra és objektumokra redukáljuk.

Így az objektum-orientált paradigma magas szintű paradigmává válik, és uralja a strukturált programozási paradigma alapelveit, mivel a valóság modellezésével foglalkozik, e területek szakembereinek nyelvén tantárgyi modelleket épít. Ha ezt figyelmen kívül hagyjuk, és jó programot írunk, amely könnyen módosítható, bővíthető, világos felületekkel és független modulokkal rendelkezik, akkor visszatérünk a strukturált programozási paradigma szintjére. A programod mindenkinek jó lesz, de nem lesz érthető, mivel nem fog megfelelni a valóságnak, csak általad ismert kifejezésekkel magyarázzák el, és a szakterületet ismerő szakember nem fogja megérteni a programot a segítséged nélkül. Végül nagyon szűk tartományon belül csökken a nehézség, pedig jó programot szerveztél. De ez egy program, nem modell. A modell hiánya, vagy csak felületes ábrázolása belülről „felrobbantja” a jó programját, nem engedi továbbfejleszteni, fenntartani a jövőben. Ha olyan osztályokat vezet be, amelyekhez nem léteznek absztrakciók, amikor ezek az osztályok tisztán rendszerszintűek, és semmi közük a tárgykörhöz, amikor csak azért vezetik be őket, hogy egyszerűsítsék a többi osztály interakciójának folyamatát - a szoftvere „szakállas” lesz. , és ha ilyen területeken túl nem követik a refaktorálást, akkor egy ponton leáll és ellehetetlenül a szoftvered fejlesztése - eléred a strukturált programozás határát (és gondoltad, hogy az osztályok és objektumok használata nem fenyeget?).

upd. Arra gondoltam, ez egy kényes téma, nem kommentálom. A cikkben bemutattam a tényeket, de nem akarok a holivar szintjére csúszni. Ha ez nem segített gondolkodni, akkor ezúttal nem szerencsés. Valóban konstruktív lesz, ha külön cikkben írsz ellenérveket. Nem vállalom a tömeges sztereotípiák lerombolását.

Igen, és, hogy egyértelmű legyen, úgy döntöttem, hogy itt megbeszélések után közzéteszem.. Programozzuk a Rosenblatt perceptront? , ahol nyilvánvalóan világossá vált, hogy a funkcionális programozás az OOP-ban rossz modell felépítésekor sokkal rosszabbul működik. Az pedig, hogy szupersebességgel büszkélkedhetnek, kitaláció, valójában a megfelelő modell a fontos. Némelyiknél (aránylag nem sok ilyen feladatnál) a funkcionális programozás sikeres lehet, de nem szabad mindenhol használni, ahol semmi jót nem ad. Nos, vagy úgy - meg tudod írni az ott tárgyalt darabot CSAK funkcionális stílusban, és úgy, hogy az gyorsabban működjön, mint az OOP eseményeknél?

Címkék: Címkék hozzáadása

Hasonló cikkek

2023 rsrub.ru. A modern tetőfedési technológiákról. Építőipari portál.