programozási alapismeretek (c)dobos/teaching/progalap2018/slides/01.pdfa gépi kód és az assembly...

21
Programozási alapismeretek (C) Dobos László Komplex Rendszerek Fizikája Tanszék 2018. szeptember 10.

Upload: others

Post on 02-Feb-2020

4 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Programozási alapismeretek (C)

Dobos László

Komplex Rendszerek Fizikája Tanszék

2018. szeptember 10.

Page 2: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Az első programozók (ENIAC - 1945)

Page 3: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Neumann-architektúra

Korai számítógépekI az adat a regiszterekben,I a program külön tárolva,

pl. kábelezéssel

Neumann-architektúraI program és adat a

memóriábanI a memóriát cím alapján

érjük el

Központi Feldolgozóegység (CPU)

Vezérlőegység

Arithmetikai/Logikai Egység

Memória

Regiszterek

Bemenet

Kimenet

A mai számítógépek a jobb teljesítmény érdekében már eltérnek aNeumann-architektúrátólI több processzorfoglalat, nem egységes memóriaelérésI grafikus processzor (GPU) saját memóriával, stb.

Page 4: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

A gépi kód és az assembly

A processzor a memóriában tárolt gépi kódot képes futtatniI ez számokba kódolt elemi utasítások és memória/port címek sorozataI ember számára gyakorlatilag érthetetlenI minden processzortípus más és más elemi utasításokat használ

Elemi utasítások pl.:I szám beírása egy processzorregiszterbeI két regiszterben tárolt szám összeadása és beírása egy harmadikbaI regiszter tartalmának memóriába másolásaI mov eax, 1234h: 1234(16)-os szám beírása az ax regiszterbe

A kódok megjegyzése helyett ún. assembly nyelvet lehet használniI a kódoknak megfelelő utasításokhoz betűkből álló nevet rendelI támogat néhány alapvető memóriacím-számítási műveletetI ma már csak a programok kis töredéke (főleg hardvervezérlés) íródik így

Page 5: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Elrettentésül: Gépi kódból visszafejtett assembly program

Page 6: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

A programozási nyelv és a fordítóprogramA gépi kód és az assembly nyelv is nagyon nehézkesI nagyon sok apró elemi utasítás ad ki egy algoritmustI a processzor belső logikája gyakran nem intuitívI a program különböző architektúrák között nem hordozható

Helyette: magas szintű programozási nyelvI elrejti a processzor belső működésének logikájátI memóriacímek helyett nevesített változókat használunkI elemi adattípusok mellett összetett struktúrák is lehetnekI összetett arithmetikai és logikai kifejezések olvasható alakbanI a program keretét ugrások helyett ciklusok és elágazások adjákI a gyakran használt műveletsorok szubrutinként újrahasznosíthatókI az utasítások lehetnek elemi, de komplex műveletek is

I add össze két változó értékét, és tárold el egy harmadikbanI olvass be a lemezen tárolt fájlból egy teljes sort

Fordítóprogram:I a magas szintű utasításokból a processzornak megfelelő gépi kódot generálI legtöbbször optimalizál is

I olyan kódot generál, ami az adott CPU-n a lehető leggyorsabban fut

Page 7: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Az első programozási nyelvekFortran (1957)I Formula TranslationI először IBM 704 main frame számítógépekreI elsősorban mérnöki és fizikai számításokra terveztékI újabb változatai máig használatban

ALGOL (1958)I ALgorithmic LanguageI az első valóban átgondolt, modern programozási nyelvI gyakorlatilag minden modern nyelv ennek az ötleteire épül

LISP (1958)I ún. funkcionális nyelvI csak függvények, amik mind listákon végeznek műveletetI sok érdekes matematikai és gyakorlati alkalmazás, máig használt

COBOL (1959)I Common Business-oriented LanguageI A FORTRAN az üzleti programok számára túlságosan „matekos” volt

Page 8: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

IBM 704 main frame - 1957

Page 9: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Fortran program kártyára lyukasztva

Page 10: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

1 DVD-nyi adat lyukkártyán?

Page 11: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Az operációs rendszer

A fordítóprogram nem mindenhatóI egy konkrét processzorarchitektúrához készülI de a sok különböző bővítőhardvert nem célozza meg

Az alapvető aritmetikai és memóriaműveletek minden processzoron léteznekI a kezelhető adatok mérete, típusa lehet eltérőI a szubrutinok, függvényhívások megvalósítása már lehet eltérőI ezeket az eltéréseket egy fordítóprogram még képes áthidalni

A bemeneti, kimeneti eszközök, háttértárakstb. működése jelentősen eltérhetI a jelentős hardverbeli különbségek

áthidalása az operációs rendszerfeladata

I az operációs rendszerszoftverinterfészt biztosít, aminkeresztül a programok elérhetik azegyes funkciókat.

CPU MemóriaHardver-eszközök

Operációs Rendszer

Felhasználói alkalmazás

Page 12: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Az operációs rendszer feladatai

Shell funkciókI programok betöltése, elindításaI konzolablak beolvasás, kiírás

MultitaskingI programok párhuzamos futtatása

MemóriakezelésI fizikai memória biztosítása az egyes programoknakI virtuális memória (diszk használata túlcsordulás esetén)

Hardveres és IO funkciókI különböző hardvereszközökhöz tartozó meghajtóprogramokI háttértár elérése, fájlrendszerek, fájlok kezeléseI hálózati funkciók (TCP/IP)

Page 13: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

A memória és a fájlok különböző elérési módja

A hardver és az operációs rendszer megkülönbözteti a memória és a fájlokelérési módját.

Memória (RAM)I random access memoryI bájtokra osztvaI a bájtok közvetlenül elérhetők egy memóriacím alapjánI a memóriacím egy 0-tól kezdődő egész számI pl. tárolj egy számot egy vektor 123. elemében

A fájl (stream, socket, port, pipe stb.)I a fájl egy szoftver szintű absztrakció, alapvetően soros adatelérés céljáraI a hardver nem feltétlen így működik (bár a szalag még hasonló volt)I pl. olvasd be a következő 100 karaktert, írd ki ezt a szöveget, tekerd vissza

az elejére

Page 14: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

A C programozási nyelv

Unix operációs rendszer PDP-11 számítógépre (1972)I Dennis Ritchie kidolgozta a C nyelvetI Ken Thompson újraírta a Unixot C-ben

A C nyelv fő tulajdonságaiI nagyon kevés, könnyen megtanulható utasításI sokfajta változótípus, struktúrákI minden kimenet és bemenet fájlI közvetlen memóriacímzést is lehetővé teszI ez utóbbi teszi alkalmassá operációs rendszerek írására

Egy rövid példaprogram:1 #include <stdio.h>2 #include <stdlib.h>34 int main()5 {6 printf("Hello world!\n");7 return 0;8 }

Page 15: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Ken Thompson, Dennis Ritchie és a PDP-11

Page 16: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Miért pont C?

A C egy régi nyelv, mégis nagyon széles körben használtI a legtöbb későbbi nyelv a C szintaxisából nőtt kiI könnyen fordítható gépi kódra; jól optimalizálhatóI szinte minden architektúrára és operációs rendszerre elérhetőI beágyazott rendszerek, mikrokontrollerek, szuperszámítógépek és grafikus

kártyák programozásaI hardverek illesztésére a legalkalmasabb

Közvetlen memóriakezelést biztosítI meg lehet rajta érteni mindent, amit a magasabb szintű nyelvek a szőnyeg

alá söpörnek

Page 17: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Miből áll egy program

AdatmodellI a memória csak címezhető bájtokat tárolI a memóriaterületet a konkrét feladat céljára alakíthatjuk kiI a tárterület logikai kiosztása az adatmodellI a logikai adatmodellt a programnyelvvel segítségével írjuk leI az adatmodellt a memóriában a fordítóprogram valósítja meg

AlgoritmusI egy műveleti folyamatsort ír le, amit az adatokon el kell végezniI lehetnek benne ciklusok és feltételes elágazásokI az algoritmus a programnyelv utasításaivalI az algoritmus a processzor kódjára a fordítóprogram alakítja át

Kimenet és bemenetI az adatmodellt fel kell tölteni adattal (pl. fájlból)I az algoritmus eredményét ki kell írni

Page 18: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Példa adatmodellre és algoritmusra 1.

Másodfokú egyenlet megoldóképlete

x1,2 =−b ±

√b2 − 4ac2a

AdatmodellI három valós szám a memóriában az együtthatóknakI egy valós szám a diszkriminánsnakI két valós szám a gyököknek

Algoritmus:I olvasd be a három számotI számítsd ki a diszkriminánsI ha a diszkrimináns negatív, írj ki egy hibát, és állj megI ha a diszkrimináns nulla, írd ki a gyököt és állj megI ha a diszkrimináns pozitív, írd ki a két gyököt és állj meg

Page 19: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Példa adatmodellre és algoritmusra 2.

Mátrix elemeinek kiírása

AdatmodellI két egész szám M,N a mátrix méretének tárolásáraI M × N valós szám a mátrix elemeinek tárolásáraI a mátrix elemeit tároljuk soronként, a memóriában folytonosan!I két egész szám, amivel a mátrixelemeket indexelni tudjuk

Algoritmus:I olvasd be a mátrixotI egy ciklussal futtasd meg az i indexet 0 és M közöttI egy belső ciklussal futtasd meg a j indexet 0 és N közöttI számítsd ki az i és j indexekből a mátrixelem memóriacímétI írd ki a mátrixelemetI ha a belső ciklus a végére ért, tegyél be egy sortörést

Page 20: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

Az adatmodell és az algoritmus kapcsolata

Az adatmodell és az algoritmus erősen összefüggI pl. nem mindegy, hogy a mátrixot a memóriában soronként vagy

oszloponként tesszük elI ezért a kettőt egyszerre kell kitalálni

Az adatmodell megszabhatja az algoritmus futási idejétI pl. ha valamit meg kell keresni egy listában, nem mindegy, hogy a listát

milyen módon tároljukI érdemes sorba rendezve? fában?

Számos univerzális adatmodell létezik, amikből a legtöbb algoritmus építkezikI ezek az adatmodellek magukból az adatstruktúrákból és az azokat kezelő

elemi algoritmusokból állnakI pl. lista megvalósítása, új elem hozzáfűzése, elem kivételeI léteznek előre megírt programkönyvtárak

Page 21: Programozási alapismeretek (C)dobos/teaching/progalap2018/slides/01.pdfA gépi kód és az assembly A processzor a memóriában tárolt gépi kódot képes futtatni I ez számokba

A tantárgy célja

Megtanuljuk, hogyI hogyan kell egy adatmodellt megvalósítaniI hogyan működik a valóságban a memória kezeléseI hogyan kell egy algoritmust megvalósítaniI hogyan kell adatokat beolvasni, és az eredményeket kiírniI milyen alapvető adatmodellek és algoritmusok léteznek

Mindezt azért C nyelven, mertI a C nyelv koncepcionálisan egyszerűI a memóriát közvetlenül is címezni tudjuk, így megérthető, hogy hogyan

kell helyesen használniI nagyon gyors programok írására is jó (pl. szimulációk)I célhardver programozására is alkalmas (pl. adatgyűjtő rendszer)