HTML

C#, hogy megértsd!

C# az alapoktól, azért, hogy megértsd... Nem 24óra alatt:P

Friss topikok

Archívum

2010.02.07. 16:31 Beginpro

7. Generációk

Eljutottunk végre a hardvertől a tényleges programozásig, ezért nézzünk egy rövidke áttekintést a programnyelvek generációs fejlődéséből:

  • Első generáció: A gépi kód. Ezt az előzőekben tárgyaltuk.
  • Második generáció: Az Assembly. Ezt szintúgy tárgyaltuk, viszont megemlíteném, hogy ebben a generációban jelent meg néhány fontosabb előrelépés a programozás terén:
  1. Szekvencia: A program végrehajtása a memóriabeli sorrend alapján történik.
  2. Feltétlen vezérlésátadás: (ugró utasítás) A program végrehajtása egy memória pontra ugrik, majd szekvenciálisan folytatódik.
  3. Feltételes vezérlésátadás: (feltételes ugró utasítás) A program ugró utasítást hajt végre, ha a megadott feltétel teljesül.
  4. Visszatérés: Az ugrás után a program visszatér oda ahonnan ugrott.
  • Harmadik generáció: A harmadik generációs nyelveket procedurális nyelveknek is szokás nevezni. Lehetővé vált, hogy fügvényeket lehessen írni, valamint a változók nevet kaptak, és típust is, ami meghatározta a benne tárolt adat struktúrát. Például szöveg, egész szám, logikai érték. Ezeket a változókat deklarálni kell! Deklarálás szempontjából ezek a változók lehetnek Globálisak, vagy Lokálisak. Ha egy változó globális, akkor az a program indításától kezdve a memóriában foglalja a helyet. Amennyiben a változó lokális, csak a program egy részében jön létre, majd törlődik is a memóriából. A programozó akár saját változótípust is definiálhat. Bevezetésre került a Ciklus mint szerkezet, ami feladata egy programrész véges számú ismétlése. A megírt kód innentől kezdve harver független, mert a fordítóprogram képes az adott gép processzorának megfelelően lefordítani a kódot.
  • Három és Fél generáció: Ez az a generáció, amely számunkra fontos a későbbiekben. A generáció kulcsszava az objektum orientáció. Ezzel lehetőséget kap a programozó, hogy minden szempontból egyedi nyelvi elemeket hozzon létre az öröklődés, osztályokba rendezés segítségével. Ezekről a lehetőségekről a továbbiakban részletesebben is szó fog esni.
  • Negyedik generáció: A negyedik generációs nyelvek speciális feladatkörre készült nyelvek. Ezen nyelvek jellemzője, hogy nagyon kevés nyelvi elemmel dolgoznak, és nagyon egyszerű, szinte mondatszerűen olvasható utasítások fogalmazhatók meg. Erre jó példa az SQL nyelv, amely elsősorban adatbázis-kezelésre van felkészítve.

Szólj hozzá!


2010.02.07. 15:51 Beginpro

6. Mnemonic

Ahogy már beszéltünk róla a számítógép csak egyeseket és nullákat "ért" meg. Tehát a legalapvetőbb programozási nyelv, ha a gépnek úgynevezett gépi kódon adjuk az utasításokat. Mivel az emberi agy nem igazán érti meg, hogy 10011011000101011, valamint igen sokat kell gépelni már akkor is, ha csak be akarjuk írni, hogy 6, ezért szokássá vált a hexadecimális számrendszer használata. Amikor valaki gépi kódban akart programozni közvetlenül a processzort programozta. Ehhez szükség volt ismerni a processzor utasításkészletét, regisztereit, és felépítését. A programozáshoz szükséges utasításokat is számok jelölik, és ha szükséges hozzá egyéb paraméter az is számként tárolódik. Programozáskor két oszlopban kell dolgozni. Az második oszlopban az utasítást adjuk meg, a első oszlopban pedig a memóri címét. Egy idő után megunták a programozók, hogy fejben kell tartani azt a rengeteg kódot, és azt találták ki, hogy az utasítások helyett inkább egy-egy rövidebb angol szót használnak, melyeket lefordítva visszakapják a gépi kódú megfelelőt. A létrejött kis szavakat nevezzük mnemonikoknak. Az így létrejött programok, még mindig gépfüggők, viszont egyszerűbb a programozók munkája. Az így létrejött utasítások például ilyenek lettek:

mov ax,bx
add bx,cx

 Ezzel a mondatszerű leírással gyorsabbá vált a programfejlesztés. Ezen eljárás alkotta meg az Assembly-t. A következő előrelépés az volt, amikor valaki kitalálta, hogy egy bizonyos memóriacímet elnevez valamilyen néven. Ezek a változók elődei. Ez a módosítás ismét nagyban segítette a programozó munkáját. A névadás nem biztosította a programozót arról, hogy a kijelölt memóriába nem írhatóak egyéb adatok, tehát ezen változóknak nem volt típusuk, valamint a fordítóprogram "Compiller", sem vett tudomást ezek hibájáról.

Szólj hozzá!


2010.02.07. 15:10 Beginpro

5. Boole algebra

A boole algebra az alapja a számítógép elektronikájának, és programozásának. A boole-változó logika "1"-et, és "0"-át vehet fel értéknek. A nullát általában hamisnak "false", az egyet pedig igaznak "true" definiáljuk. Az ezen értékek közötti kapcsolatokat írjuk le a következő műveletekkel:

ABF1F2F3F4F5F6F7F8F9F10F11F12F13F14F15F16
000101010101010101
010011001100110011
100000111100001111
110000000011111111


 

Az "A" és a "B" változókkal végzett műveletek eredményei az Fx függvények:

  • F1: False (A és B értéke mindegy, hogy mi az eredmény mindig hamis)
  • F2: Vagy negálva NOR
  • F3: Inhibíció (A negál és B)
  • F4: Negáció (A negál)
  • F5: Inhibíció (A és B negál)
  • F6: Negáció (B negál)
  • F7: Antivalencia (XOR kizáró vagy)
  • F8: NAND (A és B negálva)
  • F9: AND (A és B)
  • F10: Ekvivalencia (Igaz, ha A és B azonos)
  • F11: Ponáció (B ponálva = B)
  • F12: Implikáció (A negál vagy B)
  • F13: Ponáció (A ponálva = A)
  • F14: Implikáció (A vagy B negál)
  • F15: OR (A vagy B)
  • F16: True (A és B értéke mindegy, hogy mi az eredmény mindig igaz)

 

Szólj hozzá!


2010.02.07. 14:01 Beginpro

4. Számrendszerek

Miután már kissé megismertük a számítógép egyes részeit, fontos megismerkedni a számítógép nyelvével. A számítógép csak 0 és 1 segítségével dolgozik. Azért nem zavarodik össze, mert a CLK segítségével állandó ciklusokban dolgozik, (kivétel ha nem :P)és külön vezetéken (továbbiakban sin vagy busz) küldi az adatot, címet, vezérlőjelet... A számítógépben sínrendszerek működnek, melyeken egyesek és nullák áram formájában közlekednek. Egyes kivételes esetekben nem, de ez számunkra nem lényeges, ez hálózati technológia kérdése. Fontos, hogy tudjuk, hogy ezeket a számokat a számítógép, hogy tárolja, valamint miként végez velük műveletet.

Programozás szempontjából három számrendszert szükséges ismernünk:

  1. Bináris számrendszer (Jele: B)
  2. Decimális számrendszer (Jele: D)
  3. Hexadecimális számrendszer (Jele: H)

Feltételezem, hogy a decimális számrendszet (hétköznapi 0-9-ig terjedő számok) mindenki ismeri. Először decimálisból váltunk át binárisba. Vegyük mondjuk a 18-at. Ezt a számot többféleképpen át lehet váltani, általában nem úgy tanítják, ahogy most elmondom. Ahhoz, hogy felírjuk a 18-at binárisan fel kell írni a kettő hatványait:

2^0=12^1=22^2=42^3=82^4=162^5=32
010010
2   1 
      


Ahhoz, hogy a 18-at fel lehessen írni tudni kell a kettő hatványait (fenti táblázat első sora). Második lépés, hogy megvizsgáljuk a 18-at. Ez kisebb mint 32, tehát ezt ilyenkor nem figyeljük. Nézzük a következőt 16 kisebb mint 18, tehát ebbe a kockába írunk egy egyest (második sor). Mivel a tizenhatos mezőbe írtunk egy "1"-est kivonjuk a 18-ból a 16-ot. Ekkor marad 2, és ezt vizsgáljuk a továbbiakban. Nyolcnál a kettő kisebb, ezért nem vesszük figyelembe, négynél szintén kissebb 2. Elérkeztünk kettőig, ami megyeggyezik a kettőnkkel, ezért oda írunk egy "1"-est. Kivonjuk a 2-2=0, ekkor eltűnt a számunk. Az üres helyeket fel kell tölteni "0"-val, és kész a bináris számunk, csak visszafelé ki kell olvasnunk. Tehát a 18D=010010B=10010B. A legelső 0-a elhagyható, mert nem értelmezhető mint az se ha azt írjuk decimálisan, hogy 018, mert ez egynelő 18-al.

A hexadecimális számrendszer (16-os számrendszer) 0-tól 15-ig tartalmaz számokat. Ezek a következőek: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Ebbe a számrendszerbe átváltani a számokat binárisból a legkönyebb. A bináris számsort a végéről indúlva fel kell bontani négyesével, és a négyes csoportot átváltva decimálisba csak le kell írni a számot. Ha 9 feletti szám jön ki, akkor a betűket kell használni tehát: A=10, B=11 ... F=15. Néhány példa az átvátásra: 0110B=6H=6D, 1111B=FH=15D, 1101101B([0110][1101]négyes csoportra bontva)=6DH=109D. Tehát a táblázatban beli 18D=12H (a táblázatot ilyenkor visszafelé kell olvasni!).

Bináris számok összeadásához nem sok gondolkozás szükséges. Adott mondjuk 6D=110B és a 2D=10B, ezt ha össze szeretnénk adni egymás alá fel kell írni helyiérték szerint, és a hiányzó helyeket 0-ával kell kitölteni. Tehát:

   110
  +010
  1000

Decimális írásban összeadáshoz hasonlóan az utolsó helyiértéket kell nézni. Nulla meg Nulla egyenlő Nulla, ezt leírjuk. A következő Egy meg Egy az mennyi? Kettő a kettő binárisan 10, tehát leírjuk az utolső helyiértékét ami a Nulla és fenmarad az Egy. A következő helyiértéke 1+1+0, mert hoztuk az átvitelt. Ennek az eredménye 10, leírjuk a 0-át, majd a következő helyiértékre az ismét átvitt 1-et. Tehát az eredmény 1000B=8D.

Mindenki tudja, hogy a processzor csak összeadni tud, ez az általános nézet. Ez lényegében igaz, viszont tud komplemnst képezni is. Tehát ez már két művelet. Az igazság az, hogy a processzor konkrétan se összeadni, se komplemenst képezni nem tud, csak logikai kapcsolatokat felállítani a benne rejlő elektronikus kapukkal. Ezek rejtelmeibe nem kívánok belemenni, mert programozás szempontjából nem fontos. Maradjunk annyiban, hogy a processzor összead, és komplemenst képez.

A kivonás egy olyan folyamat, amit a számítógép úgy végez, hogy a kivonandó számnak leképzi a komplemensét, és ezt hozzáadja a másik számhoz. Többféle komplemensképzési technika létezik mi most csak az egyiket nézzük meg.

Kettes Komplemens:

Kettes komplemens képzése a legegyszerűbb. Hivatalosan a negatív számot úgy képezzük, hogy a pozitív érték egyes komplemenséhez hozzáadunk eggyet. Mivel az egyes komplemenst nem tárgyaljuk, inkább mutatom a trükköt:

Adott a 100111101101000, ennek a számna a kettes komplemense 011000010011000. Az átváltás nagyon egyszerű! Elkezdünk a szám végéről visszafelé haladni, ha 0-van akkor leírjuk addig, amíg eggyest nem találunk. Ha 1-est találunk azt még leírjuk, az összes többit megfordítjuk, (negáljuk) tehát az 1-ből 0, 0-ból 1 lesz. Ha ezt a számot egyszerű hozzáadással hozzáadjuk a másik számhoz, kivonás történik.

A számítógép a szorzást, úgy végzi, hogy annyiszor adja össze a számot, ahányszor szorozzuk. Az osztás szintén így történik, csak a kivonás művelet segítségével.

A negatív számokat az előjelbit jelzi. Ha az előjelbit 1 akkor negatív a szám egyébként pozitív.

A számokat a számítógép bitcsoportokban tárolja. A tört számokat lehet fix, és lebegőpontosan ábrázolni. Ha a bitcsoportba nem fér el a megadott szám, akkor túlcsordulás történik, és az eredmény hibás lesz. Ilyenkor a Carry flag "1"-be vált. Ez egy jelzőbit a processzorban. Fixpontos ábrázolásnál a bitcsoport úgy néz ki, hogy első bit az előjel "Signum", x mennyiségű bit az egészrész, míg y mennyiségű a törtrészt tárolja. Lebegőpontos ábrázolásnál első mit a signum, következő rész a mantissza, ami a konkrét szám normál alakja. A második rész a karakterisztika, ami az eltolást tartalmazza.
 

Szólj hozzá!


2010.02.07. 09:08 Beginpro

3. A memória

A memória nagyon fontos a számítógépekben.

A memóriáknak sok fajtája látezik, ilyenek a regiszterek, melyek általában billenő áramkörök, vannak ROM, RAM memóriák, és persze Flash memóriák. Ezek után érdemes részletesen utánanézni. logout.hu/bejegyzes/elp/memoria_tipusok_mukodesuk/hsz_1-50.html

Az általunk fontos memória a RAM típusú memória a számítógépben. Ezekről azt kell tudni, hogy címük van, és a processzor cím szerint tudja írni és olvasni. Ha írni akarja kirakja a cím vezetékre a memória címet, és egy jelet, hogy írni, vagy olvasni akarja-e. A memóriák címvezetéke lehet például 32, 64bites, ez lényegében a vezetékek száma, de ez ebben a formában nem teljesen igaz. Egyenlőre az a fontos, hogy a memóriákat címekre osztjuk, és minden címhez tartozik egy kis terület. A memóriák címének meghatározására sokféle címzést kitaláltak, ezeket nem részletezném, csak úgy felületesen a fontosabbakat.

  • Direkt címzés: Ilyenkor az utasítások a közvetlen memóriacímet tartalmazzák.
  • Indirekt címzés: Ebben az esetben az utasítás azt a mamóriacímet tartalmazza amely a tényleges memóriacímre mutat.
  • Regiszteres címzés: Ez egy összetettebb eset. A memória címét az egyik regiszter és az utasítás együttesen határozza meg. Ilyen címzések például a bázis relatív címzés, utasítás relatív címzés.

Szólj hozzá!


2010.02.07. 08:53 Beginpro

2. A processzor

Néhány alapfogalom a processzor működésének elsajátításához:

A processzor "CPU, Vezérlőegység": Feladata a tárolóegységben lévő program utasításainak lemásolása értelmezése és végrehajtása az állapotjelek figyelembevételével, és a vezérlőjelek előállítása.

Regiszter: A regiszter egy olyan nagysebességű memória, amely a CPU-ban található, és nagyon nagy sebességgel írható, és olvasható. A későbbiekben ez egy általános fogalom lesz. Akár érdemes lehet részletesebben utánanézni!

PC: A PC mindenki tudja, hogy Personal Computer (személyi számítógép), na ebben az esetben nem erről van szó! A PC "Program Counter" a processzorben található program számláló. Feladata a számlálás, ezálltal megmutatja a következő utasítás címét a memóriában.

CLK: Órajel! Ügyebár, ha valaki processzort akar vásárolni mit néz először? Az órajelet! Ez teljes mértékben helytelen. Az órajel csak egy oszcillátor "általában rezgő kristály" által generált áram impulzus sorozat. A tényleges processzorsebességet a következőképpen mérik:

  • MIPS - Millió utasítás per másodperc
  • MOPS - Millió művelet per másodperc
  • FLOPS - Lebegőpontos művelet per másodperc

Utasítás (Instruction): Az utasítás a számítógép számára érthető a programozó által tovább nem bontható lépés.

Az alapfogalmak áttekintése után megpróbálom kicsit meseszerűen érthetően bemutatni a processzor működését. Ez a mese nem fedi teljesen az igazságot, de ha mindent le akarnék írni, ahhoz lehet egy plusz blog is kevés lenne... Szóval amikor áramot kap a processzor kiolvassa a kezdőcímen található első utasítást. Pörög a PC, és csinálja a feladatot, közben ha megszakítás érkezi menti az aktuális álapotvektort, betölti a kiszolgáló rutint, majd visszatölti az előző program álapotát. Ha egy általunk megírt programot indítunk, a PC elkezdi pörgetni a programunk utasítás sorozatát, és végrehajtja az utasításokat, majd visszatér. Az utasítások a Neumann elvek szerint kettes számrendszerűek.

Szólj hozzá!


2010.02.07. 08:21 Beginpro

1. A "vas"!

Azért indítottam a blogot, hogy mindenki láthassa, hogy a C# nem is olyan nehéz, ha értjük, és nem csak magoljuk... Fontosnak tartom, míg sokan nem, hogy a programozás elkezdése előtt ismerni kell a hardvert "vasat". Ha nem ismeri az ember, hogy mi miért történik a gépen belül a programozás értelmetlennek tűnhet.

Első lépésünk:

Neumann-elvek:

  1. Soros utasításvégrehajtás (az utasítások végrehajtása időben egymás után történik. Ellentéte a párhuzamos utasításvégrehajtás, amikor több utasítás egyidejűleg is végrehajtható)
  2. Kettes (bináris) számrendszer használata
  3. Belső memória (operatív tár) használata a program és az adatok tárolására
  4. Teljesen elektronikus működés
  5. Széles körű felhasználhatóság
  6. Központi vezérlőegység alkalmazása

Ezen lépések irányába halad az informatika, viszont némelyik pont nem teljesen igaz, ezekről majd később.

A számítógépek fejlődéstörténetét inkább mellőzném, ugorjunk...

Szólj hozzá!


süti beállítások módosítása