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

Post on 02-Feb-2020

4 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Programozási alapismeretek (C)

Dobos László

Komplex Rendszerek Fizikája Tanszék

2018. szeptember 10.

Az első programozók (ENIAC - 1945)

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.

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

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

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

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

IBM 704 main frame - 1957

Fortran program kártyára lyukasztva

1 DVD-nyi adat lyukkártyán?

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

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)

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

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 }

Ken Thompson, Dennis Ritchie és a PDP-11

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

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

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

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

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

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)

top related