Programozás elmélete
Programozás és program • Programozás: folyamat, melynek során a feladat megoldását a számítógép számára érthető formában írjuk le. • Program: a programozás eredménye, futtatható változatban (a szöveges változat: forráskód) – interpretált program: „soronként értelmezett”, az értelmező (interpreter) beolvas egy utasítás-egységet a forráskódból, azt végrehajtja, majd újra olvas (általában lassú a futásuk, pl. Python alkalmazások) – fordított (compiled) programok: egy speciális program – a fordító (compiler) – a forráskódból egy közvetlenül futtatható állományt készít (általában egy köztes állapoton keresztül, ún. linkeléssel, pl. C, C++, Pascal stb. nyelven írt alkalmazások) – fordított és interpretált: ötvözi a kettő előnyeit, viszonylag gyors futás, ám a fordítási idővel nem kell törődni (pl. Java, Perl alkalmazások) 2016. 07. 08.
2
Amatőr és professzionális nyelvek Amatőr nyelvek – interaktívak – sok nyelvi elemmel rendelkeznek – jellemző: gyors nyelvi fejlődés – a programok szerkezete egyszerű – speciális gépi tulajdonságokra épülnek 2016. 07. 08.
Professzionális nyelvek – – – – – –
jellemző: modularitás magas fokú stabilitás kevés nyelvi elem igen hatékonyak sok lehetőséggel bírnak gépfüggetlen kódot generálnak – a kód átvihető más architektúrájú gépekre is 3
Emberközeliség Gépi nyelvek – minden hardverlehetőség kihasználható – a memóriacímeket önerőből kell – a memóriakiosztást megvalósítani – a programkódot A megírt programok • gépközeliek • közvetlenül a processzor utasításkészletére épülnek
2016. 07. 08.
4
Emberközeliség Alacsony szintű nyelvek – géporientált nyelvek – megjelennek • • • • • •
a szimbolikus utasítások az azonosítók a címkenevek a feltételes vezérlésátadás fogalma az eljárások a visszatérések
– az adatokat deklarálni, definiálni lehet • a tárhely ennek függvényében foglalódik le 2016. 07. 08.
5
Emberközeliség Alacsony szintű nyelvek – megjelennek a makrók és a direktívák – a közvetlen kódok helyett rövid, könnyen megjegyezhető szavakat alkalmazunk (mnemonikok) – jobban áttekinthetők a címzési módok – a programokba megjegyzéseket szúrhatunk be – külön fordítható egységekkel dolgozhatunk
2016. 07. 08.
6
Emberközeliség Magas szintű nyelvek – feladatorientáltak – megjelenik a típus és a változó fogalma – kifejezések kiértékelésével komoly számításokat lehet elvégezni egyszerűen – megjelennek a ciklusok, elágazások – eljárásokat, függvényeket tudnak használni – komoly paraméterátadó mechanizmusokkal rendelkeznek
2016. 07. 08.
7
Típusok használata Nem típusos nyelvek – ha létezik is a változó fogalma, ez nincs kötve semmiféle típushoz
Típusos nyelvek – megjelenik a típus fogalma, amely meghatározza, hogy a változó • milyen értékeket vehet fel • mekkora memóriatartományra van szüksége • milyen műveletek végezhetők el vele stb.
Szigorúan típusos nyelvek – szigorú szabályok írják elő a típusok közötti átalakításokat, konverziókat
2016. 07. 08.
8
Csoportosítás alapelvek szerint Imperatív nyelvek – eljárásorientált nyelv: • a forráskód szövege részekre tagolható, melyeket eljárásoknak nevezünk; általában fordító programosak, csak ritkán interpreteresek. Pl. C, C++, Pascal, Fortran
– objektum-orientált nyelv: • kielégíti az OOP alapelveket Pl. C++, Java, Perl
– objektum-alapú nyelv: • az öröklés és a sokalakúság elvén kívül minden OOP alapelvet kielégít. Pl. JavaScript
2016. 07. 08.
9
Alapelvek szerint Imperatív nyelvek – a Neumann architektúrához szorosan kötődő algoritmikus nyelvek – a fő programozási egység az utasítás, és ezek egymásutánisága vezérli a processzort – a tár bizonyos területén lévő értékeket módosíthatjuk változók – a programozó mondja meg, hogy mit és hogyan kell csinálni
2016. 07. 08.
10
Az 5 Neumann-elv 1. A számítógép legyen soros működésű: – a gép az egyes utasításokat egymás után, egyenként hajtja végre
2. A számítógép a kettes számrendszert használja, és legyen teljesen elektronikus: – a kettes számrendszert és a rajta értelmezett aritmetikai ill. logikai műveleteket könnyű megvalósítani kétállapotú áramkörökkel
3. A számítógépnek legyen belső memóriája: – a belső memóriában tárolhatók az adatok és az egyes számítások részeredményei, így a gép bizonyos műveletsorokat automatikusan el tud végezni 2016. 07. 08.
11
Az 5 Neumann-elv 4. A tárolt program elve: – a programot alkotó utasítások adatként kezelhetők, a belső memóriában tárolhatók – ezáltal a számítógép önállóan képes működni, hiszen az adatokat és az utasításokat is a memóriából veszi elő
5. A számítógép legyen univerzális: – a számítógép különféle feladatainak elvégzéséhez nem kell speciális berendezéseket készíteni – Alan Turing: „az olyan gép, amely el tud végezni néhány alapvető műveletet, elvileg bármilyen számítás elvégzésére is alkalmas”
2016. 07. 08.
12
Alapelvek szerint Háttérnyelvek és makrónyelvek – nagyobb alkalmazások hátterében feladatokat valósítanak meg – segítségükkel testre szabhatóak, könnyebben, gyorsabban vezérelhetők lesznek az alkalmazások
Procedurális, strukturált nyelvek – egy adott probléma megoldásának algoritmusát írják le
2016. 07. 08.
13
Alapelvek szerint Deklaratív nyelvek – a matematikai logikára vagy függvényhasz-nálatra épülő nem algoritmikus nyelvek – a programozó csak a megoldandó feladatot írja le, a megoldást magát, a rendszer végzi el – nem létezik utasításfogalom – a tárhely értékeit nem lehet módosítani – nem léteznek adatok, vagy ezeknek teljesen más a szerepük – általában értelmezőt használnak és párbeszédes jellegűek • logikai nyelv: a matematikai logikára épül (pl. PROLOG, LISP) – predikátumokra és relációkra épülnek – tényekből szabályok segítségével következtetéseket tudnak levonni 2016. 07. 08.
14
Alapelvek szerint Applikatív nyelvek – függvények változókra történő alkalmazásaival operálnak
Funkcionális nyelvek – magas szintű függvények használatára és operátordefiníciókra épülnek – az operátorok függvényeket manipulálnak, mintha azok egyszerű adatok lennének – nincsenek változók, nincs értékadás – a függvények a bemeneti paraméterek egy halmaza alapján kiszámítanak egy outputot – a megoldandó problémát funkcionális egységekre kell bontanunk (pl. LISP) 2016. 07. 08.
15
Alapelvek szerint Definíciós nyelvek – a megfeleltetéseket (értékadásokat) definíciókként értelmezzük.
Egyszeres megfeleltetésű nyelvek – egy változó a láthatósági területén csak egyszer fordulhat elő a bal oldalon
Adatfolyam (dataflow) nyelvek – az adatfolyam architektúrák programozási nyelvei
Megkötésorientált nyelvek – a megoldandó feladatot megkötések sorozataként fogalmazzák meg és oldják meg 2016. 07. 08.
16
Alapelvek szerint Konkurens nyelvek – a párhuzamos, konkurens, osztott, többszálas programokat tudjuk megfogalmazni
Folyamatszálas vagy veremalapú nyelvek – alacsony szintű, konkrét feladatok megoldására szakosodott programozási nyelvek – hatékonyan programozható a verem
Matematikai vagy szimulációs nyelvek – konkrét feladatosztályok megoldására szakosodtak – többnyire matematikai számítások, szimulációs folyamatok végezhetők el velük 2016. 07. 08.
17
Alapelvek szerint Szimbólum-feldolgozó nyelvek – nagy mennyiségű szöveges információk, hosszú listaadatok értékelésére, elemzésére kidolgozott célnyelvek
Formulakezelő nyelvek – nagy pontosságot igénylő, bonyolult matematikai, műszaki számítások
Objektumorientált nyelvek – magas absztrakciós szinten lévő osztályok és ezekből példányosított objektumok segítségével fogalmazhatjuk meg és oldhatjuk meg a feladatot – az osztályok zárt egységnek tekintik az adatokat és az őket kezelő eljárásokat 2016. – 07.az 08. objektumok egymással kommunikálnak
18
Alapelvek szerint Vizuális nyelvek – grafikus eszközök vehetők igénybe az algoritmus leírására
Negyedik generációs nyelvek – nagyon magas szintű nyelvek, – a megoldandó feladat természetes nyelven vagy diagramok használatával fogalmazható meg – a fordítóprogram választja ki a megfelelő adatszerkezeteket vagy algoritmusokat
Lekérdező nyelvek – az adatbázis-programozás fő kommunikációs eszközei, interfészei 2016. 07. 08.
19
Alapelvek szerint Adatbázis és szövegfeldolgozó nyelvek – adatokat, információkat strukturálhatunk, dolgozhatunk fel, módosíthatjuk, karbantarthatjuk az adatbázisban tárolt adatokat
Specifikáló (leíró) nyelvek – a szoftver vagy hardver tervezésének formális leírását szolgálják
Assembly nyelvek – a gépi kód szimbolikus jelölésére szolgálnak egy adott számítógép-architektúrán 2016. 07. 08.
20
Alapelvek szerint Rendszer- és fordítóprogramok írására specializálódott nyelvek – hatékonyan támogatják az alacsony szintű programozást és az operatív tár közvetlen kezelését – lehetővé teszik a bitenkénti műveletek végzését, – rendelkeznek a magas szintű nyelvek előnyeivel
Köztes nyelvek – a fordítóprogramok használják mint ábrázolásrendszert – lehetnek szöveges vagy bináris formátumúak
2016. 07. 08.
21
Alapelvek szerint Parancssor vagy szkriptnyelvek – operációs rendszer közeli feladatok írhatók le.
Kiterjeszthető nyelvek – a programozási feladat megoldásához a nyelv csak egy minimális alapot definiál – a hiányzó eszközöket a programozó maga állíthatja elő a már létező elemek felhasználásával, kombinálásával
Metanyelvek – más nyelvek deklarálására szolgálnak (Pl. BNF)
2016. 07. 08.
22
Alapelvek szerint Leíró (markup) nyelvek – ún. „markup” szimbolikát használnak, vagyis
adat formában adhatóak meg az utasítások (pl. HTML, XML, SQL, TEX)
Szkriptnyelvek – ún. szkripteket használnak, melyek futásidőben kerülnek értelmezésre • előzetes gépi kódra fordítás nélkül beolvassa őket az értelmező környezet, majd a lefuttatás idején utasításról utasításra végrehajtatja azt az operációs rendszerrel (pl. awk, lua, JavaScript, PHP, Python) 2016. 07. 08.
23
Generációk szerint • Az elektronikus számítógépek nagy generációi meghatározták a programozási nyelvek generációit is: – – – – –
első második harmadik negyedik ötödik
generációs programozási nyelvek
2016. 07. 08.
24
Első generációs nyelvek (1946–1955) • teljes mértékű processzorfüggőség • utasítások = bitsorozatok – kapcsolókkal lehetett megadni
• a gépi kód utasításait a számítógép képes volt közvetlenül, minden átalakítás nélkül végrehajtani • erősen gépfüggő (minden gépen más és más utasításokat használ) • a gépi kód előnyei: – gyorsaság – egységesség 2016. 07. 08.
25
Első generációs nyelvek (1946–1955) • komoly előrelépés: az Assembly nyelvek megjelenése • a gépi kódú utasításokhoz egy-egy mnemonikus kódot rendeltek hozzá • a tárcímeket a memória kezdetéhez viszonyított relatív címekkel számították • az egyes memóriacímeket egy-egy szimbolikus névvel lehetett helyettesíteni
2016. 07. 08.
26
Második generációs nyelvek (1955–1963) • a számítógépek alkalmazási területe kibővülésének eredménye • a 60-as évek eleje: első magas szintű programozási nyelvek (nem a számítógép sajátosságaihoz, hanem a problémához igazodtak) • egyetlen magas szintű programnyelvi utasítás több gépi kódú utasítást jelent – fordítóprogramok (compiler) – szerkesztők (linker)
• az első magas szintű programozási nyelv a FORTRAN
2016. 07. 08.
27
Harmadik generációs nyelvek (1963–1973) • • • •
magas szintű programozási nyelvek nem egy konkrét feladatosztály megoldására specializálódtak általánosak, univerzálisak új korszak: a procedurális programozási szemlélet és az adatok struktúrájának hangsúlyozása • megjelennek az objektumorientált nyelvek
2016. 07. 08.
28
Harmadik generációs nyelvek (1963–1973) • alkalmasak: – – – –
az adatfeldolgozási és a számítási problémák megoldására rendszerprogramozásra a program szerkezete egyszerű és követhető formai előírásai nem túl szigorúak
• a program tartalmaz egy főprogram részt, amely: – külön blokkokban több alprogramot foglalhat magába – az alprogramok egymásba ágyazhatók – Strukturált programozás
2016. 07. 08.
29
Negyedik generációs nyelvek (1973–) • • • • • •
napjaink programozási eszközei bonyolult lekérdező nyelvek programkód generátorok interaktív fejlesztői környezetek gyors alkalmazásfejlesztés vizuális paradigmára támaszkodó objektum- és komponensorientált kódgenerátorok • magas hardverfüggetlenséget támogatnak
2016. 07. 08.
30
Ötödik generációs nyelvek (1981–)
• Két fogalmat takarnak: – egy gép-közelebbi, de magas szintű nyelvet, amely tulajdonképpen a számítógép operációs rendszerét jelenti – egy természetes nyelvet, amely során az ember és gép közötti kommunikáció („programírás”) megvalósul
2016. 07. 08.
31
Számítási modellek szerint Modellek, amelyeknek alapján az algoritmusokat végre kell hajtani, a feladatot meg kell oldani: • Az imperatív paradigma: – – – –
egyszerű operációs paradigma a Neumann-féle paradigma az automata feldolgozás paradigmája az adatbázis-kezelés paradigmája
• A deklaratív paradigma – a funkcionális paradigma – a logikai paradigma
• • • • •
A párhuzamos és osztott paradigma Az objektumorientált paradigma A vizuális paradigma Az ötödik generációs paradigma Alternatív paradigmák
2016. 07. 08.
32
A programozási nyelvek elemzési szempontjai Elemzési szempontok.doc
2016. 07. 08.
33
Szintaxis, szemantika • Utasítás: – a program legkisebb funkcionális egysége • Szintaxis: – a programozási nyelvek nyelvtana, szabályai (általában egy metanyelvben írják le, pl. BNF forma) • Szintaktikai hiba: – a program írásakor fellépő hiba, a program csak „szöveg”, hiszen működésképtelen • Szemantikai hiba: – a program futásakor a várttól eltérő működés 2016. 07. 08.
34
BASIC (Beginners All-purpose Symbolic Instruction Code) • • • • • • •
magas szintű programozási nyelv egyik legegyszerűbb didaktikai környezetben alkalmas komolyabb feladatok megoldására ritkán használják sok különböző változata található meg erősen gépfüggő a mai BASIC-ek már strukturáltak: CBM 64 BASIC, ZX SPECTRUM, CBM PLUS 4, GW BASIC, TURBO BASIC, QUIC K BASIC, VISUAL BASIC
2016. 07. 08.
35
Fortran (FORmula TRANslation) 1954 • IBM, John Backus: a Fortran az algebrai nyelv fordítási lehetőségeinek eredménye • a legrégebben használatos magas szintű programozási nyelv • sok változata létezik • elsősorban matematikai számítások, fizikai kutatóintézetekben szükséges számítások elvégzésére készült • állománykezelése nem igazán fejlett • karakterek kezelésére nem használják • nem ismeri a rekurziót
2016. 07. 08.
36
Fortran verziók • A különféle Fortran verziókat a megjelenési évük feltüntetésével különböztetik meg, a Fortran szó mögötti két számjegy erre utal. • A jelenleg is használatban lévő verziók: – Fortran 66 – Fortran 77 – Fortran 90 (95) – speciális verziók: HPF (High Perforamance Fortran = Magas Szintű Fortran) • a Fortran programok szabadon mozgathatók a különféle gépek és platformok között 2016. 07. 08.
37
Algol 60, Algol 68 ALGOrithmic Language • a legkorábban kifejlesztett programozási nyelvek egyike • elsősorban algoritmikus problémák megoldására fejlesztették ki • még ma is van sok ún. "ALGOL"-szerűnek nevezett nyelv
2016. 07. 08.
38
Cobol (COmmon Bussines Oriented Language) • a 60-as években az USA Hadügyminisztériumának megbízásából • 60-as, 70-es évek: a magas szintű nyelven írt programok többségét COBOL-ban írták • elsősorban adatfeldolgozásra készült • ezen a területen még ma is használják • hasonlít a normál beszédhez • utasításai állítások
2016. 07. 08.
39
PL/1 • • • • •
IBM: 60-as évek a korábbi programozási nyelvek előnyeit egyesíti eléggé univerzális használatához nagyon nagy gépre volt szükség - IBM, ESZR legfontosabb erénye az adatállományok igen jó, rugalmas, magas logikai szintű definiálása és kezelése ill. hibakezelése • ma már kevésbé használatos nyelv
2016. 07. 08.
40
Pascal • az első legteljesebb körű megvalósítása a struktúrált programozás elveinek • Niklaus Wirth, a zürichi Műszaki Főiskola oktatója dolgozta ki a 70-es években • Wirth az ALGOL programozási nyelv alapján definiálta a PASCAL szabályait • általános célú programozási nyelv • elsősorban – az oktatásban – a műszaki-tudományos számítások területén – a komplex programrendszerek fejlesztése során
alkalmazzák elterjedten 2016. 07. 08.
41
Pascal • szabad formátumú nyelv • viszonylag kevés utasítást tartalmaz • a programok szerkezete kötött, szigorú előírások vonatkoznak rá • a Pascal programok blokkokból épülnek fel, a blokkok a begin foglalt szóval kezdődnek és az end foglalt szóval érnek véget • két utasítást „;” választ szét • támogatja a moduláris programozást • függvények és eljárások definiálhatók a function és a procedure foglalt szavak segítségével • a függvények, eljárások egymásba ágyazhatók 2016. 07. 08.
42
Pascal • a nyelv támogatja a rekurziót is • erősen típusos nyelv – a programban használni kívánt változókat a felhasználásuk előtt, a deklarációs részben fel kell tüntetnünk és meg kell adnunk a típusukat
• a Pascal fordítók compiler típusú fordítók • a programok szabályos, szigorú, egyértelmű felépítése miatt a nyelv az oktatás kedvelt programozási nyelve • jó alapot biztosít más programozási nyelvek tanulásához, a struktúrált programozás alapelveinek megértéséhez
2016. 07. 08.
43
Java • a Sun által kifejlesztett programozási nyelv • a web számára tervezték • lényege: HTML dokumentumban hivatkozhatunk Java programokra • platform-függetlenek – bárhol futtathatók
• a Java programot a fordító egy köztes gépi kódra, úgynevezett virtuális gépi kódra fordítja le, amelyet majd a Webböngésző fordít le futtatható formátumra • vannak olyan operációs rendszerek, amelyekbe már be van építve a Java támogatás 2016. 07. 08.
44
C • Ken Thompson (1970): B nyelv – ezen készült el az első UNIX operációs rendszer
• Dennis Ritchie (1971) C nyelv • 1983: első szabványos C nyelv • C nyelven írták a UNIX operációs rendszert, és ehhez hozzátartozik általában a C fordító is • nagyon hatékony programozási nyelv • a C forrásprogramok elég jól hordozhatók különböző platformok között
2016. 07. 08.
45
C++ • • • •
a C++ a C nyelv objektum-orientált kiterjesztése a C támogatja bitstruktúrák kezelését is a C nyelv nem tartalmaz I/O utasításokat ezeknek a műveleteknek az elvégzésére függvénykönyvtárakban található alprogramokat alkalmazunk • a C nyelv nem tartalmaz műveleteket sztringek, halmazok, listák és tömbök kezelésére sem – a függvénykönyvtárak több hasznos eszközt kínálnak, mint más programozási nyelvekben
2016. 07. 08.
46
Az objektum-orientált programozás alapelvei Egységbezárás (encapsulation): – adatstruktúrákat és az adott struktúrájú adatokat kezelő függvényeket kombináljuk – ezeket az egységeket kezeljük – elzárjuk őket a külvilág elől – az így kapott egységeket objektumoknak nevezzük • Az objektumoknak megfelelő tárolási egységek típusa az osztály, amiben adattagok (data members) és tagfüggvények (metódusok) (methods) szerepelnek.
2016. 07. 08.
47
Az objektum-orientált programozás alapelvei Információrejtés (information hiding) – a lokális adattagok tartalma rejve van a külvilág elől, s csak a tagfüggvények férhetnek hozzájuk
Üzenet (message) – az objektummal való kapcsolattartás módja
Öröklődés (inheritance) – adott, meglévő osztályokból származtatott újabb (utód) osztályok öröklik a definiálásukhoz használt alaposztályok (ős) már létező adatstruktúráit és függvényeit – újabb tulajdonságokat is definiálhatnak, vagy régieket újraértelmezhetnek – így osztályhierarchiához jutunk 2016. 07. 08.
48
Az objektum-orientált programozás alapelvei Sokalakúság/Többrétűség (polymorphism) – egy adott tevékenység (metódus) azonosítója ugyanaz lehet egy adott osztályhierarchián belül – a hierarchia minden egyes osztályában a tevékenységet végrehajtó függvény megvalósítása az adott osztályra nézve specifikus
2016. 07. 08.
49
Három implementációs formája C++-ban: Függvényoverloading – korai kötéssel azonos hatáskörben, azonos néven, de különböző paraméterszignatúrával definiálhatunk függvényeket
Virtuális függvény – késői kötéssel származtatás során a hierarchiában lejjebb álló függvények azonos néven azonos paraméterszignatúrával és visszatérési értékkel szerepelhetnek, mint a feljebb deklarált és virtual kulcsszóval ellátott tagfüggvények
Operátoroverloading – a C nyelv szabványos operátorainak átdefiniálása 2016. 07. 08.
50