Információs Technológia Programozási nyelvek kialakulása, a C nyelv Fodor Attila Pannon Egyetem Műszaki Informatika Kar Villamosmérnöki és Információs Rendszerek Tanszék foa@almos.vein.hu 2009 szeptember 17.
Történeti áttekintés Programozási nyelvek Történeti áttekintés Blaise Pascal (1623-1662) mechanikus 6 digites összeadó/kivonó gép Charles Babbage (1792-1871) Analitical Engine a mai digitális számítógépek előfutára, A tervek jók voltak (A kor technológiai színvonalán elkészítésükre nem volt esély.) Ada Byron (1815-1852) Az első példaprogramok az Analitical Engine-re Hermann Hollerith (1860-1929) Elektromos, lyukkártya alapú gép népszámlálási adatok feldolgozására 1896-ban megalapítja a Tabulating Machine Company-t (1924-től IBM) Howard Aiken (IBM 1943) MARK I. telefonreléken alapuló gép 18m hosszú, 2.5m magas gép, kb 300 ms egész összeadási sebesség Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 2 / 39
Történeti áttekintés Programozási nyelvek Történeti áttekintés Neumann János (1946) "Elozetes gondolatok egy számító berendezés logikai tervéről" című tanulmány EDVAC (1951) ezen alapuló gyakorlati megvalósítás 1951 Mikroprogramozás elve 1971 Intel 4004 1985 Intel iapx386 Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 3 / 39
Számítógépek programozása Szoftverekkel szemben támasztott követelmények feladat specifikáció szerinti végrehajtása lehető legrövidebb futási idő lehető legkisebb helyfoglalás (memória, HDD) program feltétlen megbízhatósága gyors és olcsó kivitelezés határidők pontos betartása hibátlan programozás könnyű kezelhetőség könnyű karbantarthatóság (maintability) egyszerű továbbfejleszthetőség (extensibility) programnak a programozó személyiségétől való függetlensége (egoless programming) Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 4 / 39
Szoftverek minősége Programozási nyelvek Számítógépek programozása Olvashatóság: a programnak világosan és érthetően kell kódolva lennie, tiszta logikával Modularitás: mennyire van részekre bontva a program, és az egyes részek mennyire látnak el külön feladatokat Strukturáltság Helyesség (correctness): a programnak pontosan a specifikációja szerint kell működni Robosztusság (robustness): szelsőséges (nem specifikált) feltetelek közötti működési mód, a szoftver a legváratlanabb esetekben sem okozhat jelentős kárt Módosíthatóság (extendibility): a szoftver más környezetben kis kiigazításokkal is működik Újrahasználhatóság (reuseability): szoftver, vagy egyes részeinek felhasználása más problémák megoldására Kompatibilítás (compatibility): más szoftverekkel való együttműködés, Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 5 / 39
Szoftverek minősége 2. Programozási nyelvek Számítógépek programozása Könnyű használhatósag: a szoftver használatának gyors és könnyű elsajátítása, emberközeli és logikus szoftverkezelés Hatékonyság Hordozhatóság Tesztelhetőség Integritás Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 6 / 39
A programfejlesztés lépései Programfejlesztés elmélete Specifikáció Tervezés Algoritmus választás Adatszerkezet választás Nyelv választása Kódolás Teszt specifikáció Tesztelés Dokumentálás Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 7 / 39
Monolitikus programozás (-1970) Egy programozó egy program programoknak nincs szerkezete A moduláris programozás előnyei a részprogramok könnyen áttekinthetők könnyebben megírható és tesztelhető több modul írható egy időben (párhuzamos problémamegoldás) könnyebben javítható a modulok szabványosíthatók modulkönyvtárakban tárolható modulok újrafelhasználhatók Tervezési módszerek Top-Down a feladatot részfeladatokra bontjuk, majd azokat további részfeladatokra, míg kezelhető méretű részproblémákhoz nem jutunk Button-Up a részfeladatokból kell összeépíteni a programot nincs módszer a modulok összefűzésére, nincs módszer annak bebizonyítására, hogy a modulok együtt jól fognak dolgozni. Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 8 / 39 Programozási nyelvek Programfejlesztés elmélete A programozás módszertana, Tervezési módszerek
Programozási paradigmák Programfejlesztés elmélete Az imperatív programozási paradigma Az imperatív (más néven procedurális) programozási paradigma a legelterjedtebb, a legrégibb; erősen kötődik a Neumann-féle számítógép-architektúrához. Két fő jellemzője a parancs és az állapot. A program állapotát a leggyakoribb paranccsal, az értékadással - azaz a változók frissítésével - változtathatjuk meg. Például: ALGOL, C, C++, Clipper, Matlab, PHP, Pascal A deklaratív programozási paradigma A deklaratív stílusban programozónak csak azt kell megmondania, hogy mit akarunk, az algoritmust az értelmező- vagy fordítóprogram állítja elő. A deklaratív programozás két válfaját szokás megkülönböztetni: a logikai és a funkcionális programozást. Például: Haskell, Lisp, SML, Scheme Objektum-orientált Aspektus-orientált Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 9 / 39
Programozási paradigmák 2. Programfejlesztés elmélete Üzenet-orientált Függvény-orientált Adatfolyam-orientált Esemény-orientált Szimbolikus Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 10 / 39
Program, Algoritmus Programozási nyelvek Programfejlesztés elmélete Program = Algoritmus + Adatstruktúra Algoritmus Tevékenységek és döntések egy sorozata Algoritmus megadása Szóban Folyamatábrával Struktogrammal Mondatszerű leírással (pszeudokód) Programszerkezetek soros (szekvencia) elágazás (szelekció) ciklikus (iteráció) szerkezetet (Rekurzió) Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 11 / 39
Számítógépek programozása Számítógépek programozása Gépi kódban mindent a minden egyes CPU utasításnak szerepelnie kell Könyvtárak a közös feladatokra Kötegelt feldolgozás Kezdeti operációs rendszerek Input/Output File kezelés Mai operációs rendszerek Több felhasználó Több task Védelem Hálózat Grafikus felület Valós idejű operációs rendszerek Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 12 / 39
Gépikódú utasítások csoportosítása Gépikód, Assembly RISC/CISC Egyszerű gyorsan végrehajtható műveletek Adatok mozgatása (mov, ld, st, in, out) Aritmetikai műveletek (add, sub, mul, div) Logikai műveletek (and, or) Vezérlésátadó műveletek (jmp, jz, jnz, call, ret) Veremkezelő műveletek (push, pop) Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 13 / 39
Gépikód Programozási nyelvek Gépikód, Assembly Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 14 / 39
Assembly példaprogram Gépikód, Assembly Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 15 / 39
Assembly példaprogram Gépikód, Assembly assume ds:potyi,cs:potyi,es:potyi org 100h Start: mov ax,0b800h mov es,ax jmp potyog potyog: mov si,4079 ini: mov byte ptr es:[si],24 dec si cmp si,3999 jnz ini mov di,3998 mov si,4079 mov cx,25 vissza: mov bx,word ptr es:[di] mov word ptr es:[di],0720h cmp bl,32 je space xor ax,ax mov al,byte ptr es:[si] dec byte ptr es:[si] push bx mov bx,ax shl bx,7 shl ax,5 add ax,bx sub si,4000 shl si,1 Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 16 / 39
Assembly példaprogram (folytatás) Gépikód, Assembly add ax,si shr si,1 add si,4000 pop bx push di mov di,ax mov word ptr es:[di],bx pop di space: sub di,2 dec si pushf push ax mov al,255 var: mov ah,255 var2: dec ah jnz var2 dec al jnz var pop ax popf cmp si,3999 jnz vissza mov si,4079 dec cx jnz vissza xor ah,ah int 16h masol2: mov ax,4c00h int 21h potyi ends End Start Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 17 / 39
Operációs rendszer A hardver, az operációs rendszer és a programok kapcsolata Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 18 / 39
Operációs rendszer feladatai Operációs rendszer File kezelés Tárgazdálkodás Felhasználói felület Perifériák kezelés Hálózatkezelés Ütemezés Védelem Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 19 / 39
Programozási nyelvek B, BCPL (1970) - típus nélküli nyelvek FORTRAN, ALGOL UNIX (1969) A kezdeti fejlesztések az AT&T-ben 1969 és 1973 között Dennis Ritchie és Brian Kerninghan. (A legkreatívabb időszak, Ritchie-nek köszönhetően 1972-ben volt. Azért lett "C" a nyelv neve, mert egy korábbi, "B" nevű programozási nyelv sok tulajdonságát "örökölte".) 1973-ban újraírják C nyelven (Ez volt az egyik első operációs rendszer mag, mely nem assembly nyelven íródott. Kb. 8000 C sor + kb.700 sor assembly nyelven) A C nyelvet a legkülönbözőbb gépeken implementálták 1989-ben az ANSI C szabvány (Az Amerikai Nemzeti Szabványügyi Hivatal (American National Standards Institute) megalakította az X3J11 bizottságot 1983-ban és ez után született meg a szabvány.) Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 20 / 39
C nyelv jellemzői Programozási nyelvek Magas szintű nyelvekre jellemző adatszerkezetek és vezérlési struktúrák Hatékony gépközeli megfogalmazás Rendszerprogramozási nyelv Függvényorientált, egyszintű Rekurzív függvény hívási lehetőség Kevésbé szigorú típusellenőrzés Standard függvénykészlet, ami nem része a nyelvnek de elengedhetetlen Nyelvi szinten közvetlenül nem támogatja a dinamikus adatszerkezeteket Nyelvi szinten nem támogatja a konkurens programozást és az ahhoz tartozó szinkronizációs mechanizmusokat Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 21 / 39
C fordító Programozási nyelvek A fordítás több lépcsőben történik Előfordítás (PP) Közbülső kód generálása (C0) Assembly-re fordítás (C1) Gépi kódra fordítás (Ass) Gépi kód összeszerkesztése (Linker) Közbülső kód minden olyan információt hordoz, ami a kódgeneráláshoz szükséges. C1 átírása egy új architektúrához rövid idő alatt kivitelezhető Implementálni kell a könyvtári függvényeket, melyek többnyire C nyelven vannak megírva. Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 22 / 39
Változó, azonosító, A C nyelv típusai Változókban tároljuk az adatokat A változókat azonosítóval nevezzük el A változó típusa meghatározza: az értékkészletet a konstansokat a művelethalmazt Egyszerű típusok karakter egész valós felsorolás Összetett vagy származtatott típusok tömb struktúra unió függvény mutató bitmező Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 23 / 39
A C nyelv alapelemei Programozási nyelvek azonosítók kulcsszavak konstansok string literálok operátorok írásjelek Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 24 / 39
A C nyelv jelkészlete Programozási nyelvek Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 25 / 39
Azonosítók Programozási nyelvek Azonosítók Bizonyos összetevőkre névvel hivatkozunk Első karakter: _ (alsóvonás) vagy betű Kis és nagy betű között különbséget tesz (Case sensitive) Például: azonosito _alap azonosito123 Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 26 / 39
Kulcsszavak Programozási nyelvek Nem módosíthatóak Más célra nem használhatóak Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 27 / 39
Konstansok Programozási nyelvek Egész konstans Decimális: Pl.: 187, -123, 0 Oktális (első jegy 0) Pl.: 012, -032, 0 Hexadecimális (előtag 0x vagy 0X) Pl.: 0x123, 0X23, 0 Karakter konstansok Egyszeres idézőjelek ( ) közé zárt egy vagy több karaktert Pl.: 1, d Lebegőpontos konstansok Olyan decimális szám, amely (előjeles) valós számot reprezentál Pl.: 15.675, 1.23e12 Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 28 / 39
String konstansok (string literálok) Kettős idézőjelek közé zárt karaktersorozat Például: "string constans" "string constans \n" Tárolás a memóriában: a konstans végén \0 (záró karakter = 0) Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 29 / 39
Operátorok Programozási nyelvek Az operandusok feldolgozását előíró szimbólumok Egy vagy több karakterből áll Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 30 / 39
Írásjelek a C nyelvben Programozási nyelvek Olyan szimbólumokat jelölnek amelyeknek csak szintaktikai szerepe van azonosítók elkülönítése kód egyes részeinek kijelölése semmilyen műveletet sem definiálnak Néhány írásjel egyben operátor is lehet!!! [] tömb kijelölése, méretének megadása () paraméter- és az argumentum lista kijelölése {} blokkok vagy függvény behatárolása * mutató típus jelölése a deklarációban, függvény argumentumok elválasztása : címke elválasztása ; utasítás végének jelölése # előfordító direktíva jelölése Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 31 / 39
A nyelv kifejezési Programozási nyelvek operátorokkal összekapcsolt operandusokból állnak (+ értékadás és a függvényhívás) Kifejezés: Pl. a+b a=b v1=v2=z-5 szam=1 fuggveny(a, b) Kifejezés-utasítás: kifejezés ; utasítás(;) Pl. a+b; a=b; v1=v2=z-5; szam=1; fuggveny(a, b); Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 32 / 39
Programvezérlő szerkezetek Utasítás csoportok kialakítása (Blokk): { } definíciók és deklarációk utasítások Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 33 / 39
Programvezérlő szerkezetek 2. Kétirányú elágazás if (feltétel) utasítás; if (feltétel) utasítás1; else utasítás2; if (feltétel) { utasítás1 utasítás2 } else { utasítások... } Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 34 / 39
Programvezérlő szerkezetek 3. switch (Több irányú elágazás) switch ( egész kifejezés ) { case konstans1 : utasítás1_1; utasítás1_2... break; case konstans2 : utasítás2_1;... break; default: utasítás_d_1; break; } Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 35 / 39
Programvezérlő szerkezetek 4. while ciklus while ( feltétel ) utasítás; while ( feltétel ) { utasítás1; utasítás2; } Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 36 / 39
Programvezérlő szerkezetek 5. for ciklus for ( inicializáló kifejezés ; feltétel ; léptető kif. ); for ( inicializáló kifejezés ; feltétel ; léptető kif. ) utasítás; for ( inicializáló kifejezés ; feltétel ; léptető kif. ) { utasítás1; utasítás2; } Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 37 / 39
Programvezérlő szerkezetek 6. do-while ciklus do utasítás while ( feltétel ); do { utasítás1; utasítás2; } while ( feltétel ) Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 38 / 39
Programvezérlő szerkezetek 7. Ciklus működésének szabályozása break kilép az őt közvetlenül tartalmazó ciklusból (while, do, for) ill. switch utasításból continue az őt közvetlenül tartalmazó ciklus magjának további részét átlépi, azaz a feltételvizsgálattal (while, do) illetve a léptetéssel (for) folytatja Fodor Attila (Pannon Egyetem) Információs technológia 2009 szeptember 17. 39 / 39