Hernyák Zoltán
A Microsoft.NET-et (továbbiakban dotNet) sokféleképpen lehet definiálni. A Microsoft honlapján például az alábbi meghatározás szerepel: „ez egy software technológiák halmaza, amely információkat, embereket, rendszereket és eszközöket kapcsol össze. Ez az új generációs technológia a Web szolgáltatásokon alapul – kis alkalmazásokon, amelyek képesek kapcsolatba lépni egymással csakúgy, mint nagyobb méretű alkalmazásokkal az Internet-en keresztül.”[2]
Másik lehetséges meghatározás szerint a dotNet egy programfejlesztési környezet, mely számtalan hasznos szolgáltatással segíti a programozók mindennapi munkáját.
Amikor egy programozó egy alkalmazás fejlesztésébe kezd, sok más dolog mellett ismernie kell, és figyelembe kell vennie azt a környezetet, amelyben az alkalmazása futni fog. A környezet egyik legfontosabb jellemzője az operációs rendszer. A dotNet egyféle szemszögből nézve az operációs rendszert helyettesíti elrejtvén, eltakarván a tényleges operációs rendszert a fejlesztő elől.
Az operációs rendszert egy programozó teljesen más szempontból nézi, mint egy felhasználó. A felhasználó számára az operációs rendszer az, amibe be kell jelentkezni, alkönyvtárakat és file-okat kezel, parancsokat lehet rajta keresztül kiadni akár karakteres felületen, akár egér segítségével. Ezzel szemben a programozó az operációs rendszert elsősorban az API szempontjából nézi: melyek azok a funkciók, feladatok, amelyeket az operációs rendszer elvégez a program feladatai közül, és melyek azok, amelyeket nem.
Az API – Application Programming Interface – írja le egy adott operációs rendszer esetén, hogy melyek azok a szolgáltatások, amelyeket az operációs rendszer eleve tartalmaz, és amelyeket a programozó a fejlesztői munka során felhasználhat. Ezen szolgáltatásokat pl. a Windows a rendszer-könyvtáraiban megtalálható DLL (Dynamic Link Library) file-okban tárolja. Minden DLL több függvényt és eljárást tartalmaz, melyekre hivatkozhatunk a programjainkban is. E függvények és eljárások összességét nevezzük API-nak.
Egy operációs rendszer API leírásában szerepelnek a következő információk:
- a függvény melyik DLL-ben van benne,
- mi a függvény neve,
- mik a paraméterei,
- a függvénynek mi a feladata (mit csinál),
- mik a lehetséges visszatérési értékek,
- milyen módon jelzi a függvény a hibákat,
stb…
A Microsoft-os világban az első ilyen API-t az első, általuk előállított operációs rendszer tartalmazta. Ez volt a DOS. Ez nem tartalmazott túl sok elérhető szolgáltatást – lévén a DOS egy egyfelhasználós, egyfeladatos operációs rendszer.
DOS-API Win16-API Win32-API dotNet-API
A Win16-API sokkal több szolgáltatást tartalmazott, lévén hogy az már grafikus operációs rendszerrel, a Windows 3.1-el került be a köztudatba. Ez már nem csak a grafikus felület miatt tartalmazott több felhasználható szolgáltatást, hanem mivel ez egy többfeladatos operációs rendszer – teljesen új területeket is megcélzott.
A Win32-API a fejlettebb Windows operációs rendszerekben jelent meg, mint pl. a Windows ’95. Ebben javítottak a többszálú programok kezelésén, és bevezettek bizonyos jogosultsági módszerek kezelését is (és még számtalan mást is).
A dotNet ezen szempontból egy új API-nak tekinthető. Ez olyannyira igaz, hogy egy dotNet környezetben a programozónak semmilyen más API-t (elvileg) nem kell ismernie. A dotNet (elvileg) ma már több különböző operációs rendszeren is képes működni – de a programozónak ezt nem kell feltétlenül tudnia – hiszen ő már nem használja az adott operációs rendszer API-ját, csak a dotNet-et által definiált függvényeket és eljárásokat.
Tekintsük át a Microsoft.NET felépítését:
Legalsó szinten az operációs rendszer található. Mivel egy jól megírt, biztonságos operációs rendszer nem engedi meg, hogy a felügyelete alatt futó programok önállóan kezeljék a számítógép hardware elemeit, ezért a programok csakis az operációs rendszeren keresztül kommunikálhatnak egymással, használhatják fel az erőforrásokat (hálózat, file-rendszer, memória, …) – vagyis az operációs rendszer API-n keresztül. Ez a réteg egy jól megírt operációs rendszer esetén nem kerülhető meg.
A következő szinten van a Common Language Runtime – a közös nyelvi futtató rendszer. Ez az egyik legérdekesebb réteg. A CLR lényegében egy processzor-emulátor, ugyanis a dotNet-es programok egy virtuális mikroprocesszor virtuális gépi kódú utasításkészletére van fordítva. Ennek futtatását végzi a CLR. A futtatás maga interpreter módban történik, ugyanakkor a dotNet fejlett futtató rendszere a virtuális gépi kódú utasításokat futás közben az aktuális számítógép aktuális mikroprocesszorának utasításkészletére fordítja le, és hajtja végre.
Az első ilyen előny, hogy a szóban forgó virtuális gépi kódú nyelv típusos, ezért a programkód futtatása közben a memória-hozzáféréseket ellenőrizni lehet – így meggátolható a helytelen, hibás viselkedés. Másrészt az utasítások végrehajtása előtt ellenőrizni lehet a jogosultságot is – vagyis hogy az adott felhasználó és adott program esetén szabad-e végrehajtani az adott utasítást – pl. hálózati kapcsolatot létesíteni, vagy file-ba írni. Ugyanakkor meg kell jegyezni, hogy egy JIT Compiler (JIT=Just In Time) gondoskodik arról, hogy a végrehajtás megfelelő hatékonysággal történjen. Ezért egy dotNet-es program hatékonysága, futási sebessége elhanyagolhatóan kisebb, mint a natív kódú programoké.
A második réteg tartalmazza a dotNet API nagyobb részét. A Base Class Library tartalmazza azokat a szolgáltatásokat, amelyeket egy dotNet-es programozó felhasználhat a fejlesztés közben. Lényeges különbség a megelőző API-kal szemben, hogy ez már nem csak eljárások és függvények halmaza, hanem struktúrált, névterekbe és osztályokba szervezett a sok ezer hívható szolgáltatás. Ez nem csak áttekinthetőbb, de hatékonyabb felhasználhatóságot jelent egy, az objektum orientált programozásban jártas programozó számára.
A következő réteg, az ADO.NET és XML a 21. századi adatelérési technológiákat tartalmazza. Ezen technikák ma már egyre hangsúlyosabbak, mivel a mai alkalmazások egyre gyakrabban használják fel e professzionális és szabványos technikákat adatok tárolására, elérésére, módosítására. A rétegek segítségével a programok a háttértárolókon képesek adatokat tárolni, onnan induláskor azokat visszaolvasni.
A következő réteg kétfelé válik – aszerint hogy az alkalmazás felhasználói felületét web-es, vagy hagyományos interaktív grafikus felületen valósítjuk meg. A Windows Forms tartalmazza azon API készletet, melyek segítségével grafikus felületű ablakos, interaktív alkalmazásokat készíthetünk. A másik lehetséges választás a WEB-es felületű, valamilyen browser-ban futó nem kifejezetten interaktív program írása. Ezek futtatásához szükséges valamilyen web szerver, a kliens oldalon pedig valamilyen internetes tallózó program, pl. Internet Explorer vagy Mozilla.
A következő réteg – a Common Language Specification – definiálja azokat a jellemzőket, melyeket a különböző programozási nyelvek a fejlődésük során történelmi okokból különböző módon értelmeztek. Ez a réteg írja le az alaptípusok méretét, tárolási módját - beleértve a string-eket - a tömböket. Fontos eltérés például, hogy a C alapú nyelvekben a vektorok indexelése mindig 0-val kezdődik, míg más nyelvekben ez nem ennyire kötött. A réteg nem kevés vita után elsimította ezeket, a különbségeket.
A CLS réteg fölött helyezkednek el a különböző programozási nyelvek és a fordítóprogramjaik. A dotNet igazából nem kötött egyetlen programozási nyelvhez sem. A dotNet nem épül egyetlen nyelvre sem rá, így nyelvfüggetlen. Elvileg bármilyen programozási nyelven lehet dotNet-es programokat fejleszteni, amelyekhez létezik olyan fordítóprogram, amely ismeri a CLS követelményeit, és képes a CLR virtuális gépi kódjára fordítani a forráskódot.
A fenti két követelmény betartásának van egy nagyon érdekes következménye: elvileg lehetőség van arra, hogy egy nagyobb projekt esetén a projekt egyik felét egyik programozási nyelven írjuk meg, a másik felét pedig egy másikon. Mivel mindkét nyelv fordítóprogramja a közös rendszerre fordítja le a saját forráskódját – így a fordítás során az eredeti forráskód nyelvi különbségei eltűnnek, és a különböző nyelven megírt részek zökkenőmentesen tudnak egymással kommunikálni.
A Microsoft a C++, illetve a Basic nyelvekhez készítette el a dotNet-es fordítóprogramot, valamint tervezett egy új nyelvet is, melyet C#-nak (ejtsd szí-sharp) nevezett el. Az új nyelv sok más nyelv jó tulajdonságait ötvözi, és nem hordozza magával a kompatibilitás megőrzésének terhét. Tiszta szintaktikájával nagyon jól használható eszköz azok számára, akik most ismerkedek a dotNet világával.
Ugyanakkor nem csak a Microsoft készít fordítóprogramokat erre a környezetre. Egyik legismertebb, nemrégiben csatlakozott nyelv a Delphi.
A fentieken túl van még egy olyan szolgáltatása a dotNet rendszernek, melynek jelentőségét nem lehet eléggé hangsúlyozni: automatikus szemétgyűjtés. Ez a szolgáltatás a memória-kezeléssel kapcsolatos, és a program által lefoglalt, de már nem használt memória felszabadítását végzi. Ezt egy Garbage Collector nevű programrész végzi, amely folyamatosan felügyeli a futó programokat. Ennek tudatában a programozónak csak arra kell ügyelni, hogy memóriát igényeljen, ha arra szüksége van. A memória felszabadításáról nem kell intézkednie, az automatikusan bekövetkezik.
Ha megpróbálnánk összegezni, hogy miért jó dotNet-ben programozni, az alábbi főbb szempontokat hozhatjuk fel:
az alkalmazás operációs rendszertől független lesz
független lesz az adott számítógép hardware-től is, gondolván itt elsősorban a mikroprocesszorra
nem kell új programozási nyelvet megtanulnunk ha már ismerünk valamilyen nyelvet (valószínűleg olyan nyelven is lehet .NET-ben programozni)
kihasználhatjuk az automatikus memória-menedzselés szolgáltatásait (Garbage Collector)
felhasználhatjuk a programfejlesztéshez az eleve adott Base Class Library rendkívül széles szolgáltatás-rendszerét, ami radikálisan csökkenti a fejlesztési időt
A dotNet keretrendszer (Microsoft.NET Framework) jelenleg ingyenesen letölthető a Microsoft honlapjáról. A keretrendszer részét képezi a BCL, és a CLR réteg, valamint egy parancssori C# fordító. Ennek megfelelően a dotNet programozási környezet ingyenesen hozzáférhető minden programozást tanulni vágyó számára. Ami nem ingyenes, az a programozási felület (IDE = Integrated Development Environment – Integrált Fejlesztői Környezet). A dotNet-ben a Microsoft által fejlesztett ilyen környezetet Microsoft Visual Studio.NET-nek nevezik. Ez nem csak egy színes szövegszerkesztő. Részét képezi egy 3 CD-t megtöltő súgó, mely tartalmazza a BCL leírását, példákkal illusztrálva. Az IDE nem csak a forráskód gyors áttekintésében segít a színekkel történő kiemeléssel (syntax highlight), hanem a program írás közben már folyamatosan elemzi a forráskódot, és azonnal megjelöli a hibás sorokat benne. Környezetérzékeny módon reagál a billentyűk leütésére, és kiegészíti ill. javítja az éppen begépelés alatt álló kulcsszót. Ezen túl a felületből kilépés nélkül lehet a forráskódot lefordítani, és a generált programot elindítani. A Studio kényelmes módon kezeli a több file-ból álló programokat (project), illetve a több project-ből álló programokat is (solution).
Programozás tankönyv
III. Fejezet