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
[email protected]
2009 szeptember 17.
Programozási nyelvek
Történeti áttekintés
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
Programozási nyelvek
Történeti áttekintés
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
Programozási nyelvek
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
Programozási nyelvek
Számítógépek programozása
Szoftverek minősége 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
Programozási nyelvek
Számítógépek programozása
Szoftverek minősége 2.
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
Programozási nyelvek
Programfejlesztés elmélete
A programfejlesztés lépései
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
Programozási nyelvek
Programfejlesztés elmélete
A programozás módszertana, Tervezési módszerek 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
Fodor Attila
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. Információs technológia (Pannon Egyetem) 2009 szeptember 17.
8 / 39
Programozási nyelvek
Programfejlesztés elmélete
Programozási paradigmák 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 nyelvek
Programfejlesztés elmélete
Programozási paradigmák 2.
Ü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
Programozási nyelvek
Programfejlesztés elmélete
Program, Algoritmus
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
Programozási nyelvek
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
Programozási nyelvek
Gépikód, Assembly
Gépikódú utasítások csoportosítása
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
Programozási nyelvek
Gépikód, Assembly
Gépikód
Fodor Attila (Pannon Egyetem)
Információs technológia
2009 szeptember 17.
14 / 39
Programozási nyelvek
Gépikód, Assembly
Assembly példaprogram
Fodor Attila (Pannon Egyetem)
Információs technológia
2009 szeptember 17.
15 / 39
Programozási nyelvek
Gépikód, Assembly
Assembly példaprogram assume ds:potyi,cs:potyi,es:potyi org 100h Start: mov mov jmp
ax,0b800h es,ax potyog
mov
si,4079
mov dec cmp jnz mov mov mov
byte ptr es:[si],24 si si,3999 ini di,3998 si,4079 cx,25
potyog: ini:
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
Programozási nyelvek
Gépikód, Assembly
Assembly példaprogram (folytatás) add shr add pop push mov mov pop space: sub dec pushf push mov var: mov var2: dec jnz dec jnz pop popf cmp jnz mov dec jnz xor int masol2: mov int potyi ends End
ax,si si,1 si,4000 bx di di,ax word ptr es:[di],bx di di,2 si ax al,255 ah,255 ah var2 al var ax si,3999 vissza si,4079 cx vissza ah,ah 16h ax,4c00h 21h Start
Fodor Attila (Pannon Egyetem)
Információs technológia
2009 szeptember 17.
17 / 39
Programozási nyelvek
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
Programozási nyelvek
Operációs rendszer
Operációs rendszer feladatai
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
C programozási nyelv
C programozási nyelv 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
Programozási nyelvek
C programozási nyelv
C nyelv jellemzői 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
Programozási nyelvek
C programozási nyelv
C fordító
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
A C nyelv alapelemei
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
Programozási nyelvek
C programozási nyelv
A C nyelv jelkészlete
Fodor Attila (Pannon Egyetem)
Információs technológia
2009 szeptember 17.
25 / 39
Programozási nyelvek
C programozási nyelv
Azonosítók
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
Programozási nyelvek
C programozási nyelv
Kulcsszavak 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
Programozási nyelvek
C programozási nyelv
Konstansok
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
Operátorok 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
Programozási nyelvek
C programozási nyelv
Írásjelek a C nyelvben 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
Programozási nyelvek
C programozási nyelv
A nyelv kifejezési 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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
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
Programozási nyelvek
C programozási nyelv
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