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