Az IL programozási nyelv

Típusok, típuskonstrukciók

Deklaráció

A forráskódban a deklaráció a .NET környezetben megszokott módon történik, az adott namespace területén jön létre, viszont hivatkozni csak teljes elérési úttal lehet:

deklaráció: elérhetőség típusnév változónév

Típuskategóriák

Az IL három alapvető típuskategóriát különböztet meg: az érték (value), a referencia (reference) és a mutató (pointer) kategóriákat. Az első két kategória a menedzselt kódban használatos, míg a mutatók a kompatibilitás és interopabilitás miatt maradtak meg.

Érték típusok

bool, float, int32, int64, method, native int

Tárolni csak ezeket a típusokat tudja, de az utasításkészlet lehetőséget ad sokkal tágabb típuskezelésre, mint például előjeles 16 bites integer vagy előjel nélküli 8 bites. Ezeket a ldint.i* és ldint.u* utasításokkal lehet kezelni, csak tároláskor egy int32 helyet fognak foglalni, de deklarálni int8nak vagy int16 lehet. Float típusból is kezeli a 32 és 64 biteset, de a háttérben lehet, hogy ennél precízebb ábrázolást használ, amiből műveleteknél adódhatnak különbségek. bool érték tárolása 1 bájton történik és fizikailag a nulla és nem nulla ábrázolást követi.

Referencia

IL szinten nincs megkülönböztetve az objektum típusa. Semmilyen aritmetrikai utasítást nem lehet végrehajtani az object típuson. Létre lehet hozni (newobj vagy newarr), paraméterként átadni, értékként visszatérni vele, lokális változóban tárolni, vagy tömbben, illetve a metódusait meghívni. Erre többek között a GC miatt volt szükség és a kód biztonságossá tétele miatt.

Mutató

Két típusa van a mutatónak:

Típusok csomagolása

A típusok csomagolása (boxing and unboxing) teremti meg a kapcsolatot az érték és a referencia típuskategóriák között. A becsomagolás (boxing) segítségével egy érték típust implicit módon egy csomagoló osztályba másolhatunk. A másolat így - objektum révén - referencia típusú lesz.

Minden típus őse a System.Object. Többek között két speciális metódus mindig létezik a típushoz, ezek az egyenlőséget és a megegyezőséget vizsgáló függvények (System.Object::Equals és a System.Object::ReferenceEquals metódus). Első az érték szerinti hasonlítást jelenti a másik a memóriacím szerintit. Típuskonverziót végrehajtani (castolni) a castclass utasítással lehet, a verem tetején lévő objektumot castolja át a megadott osztályra. Ha ez sikertelen, akkor kivétel keletkezik. A castolás szabályai megegyeznek a CIL-ben definiált és a magasabb nyelvekben megszokott szabályokkal.

Az érték típusú adatokat be lehet csomagolni egy olyan burkolóosztályba, ami már referenciaként kezelhető. Ezt hívják boxing technológiának. Néha szükség lehet arra, hogy egy érték típusú adatot is referencián keresztül érjük el (típikus eset, amikor metódus paramétere az adat, de meg szeretnénk engedni, hogy null értéket is felvehessen), ekkor a boxing alkalmával egy value típust tartalmazó burkolóobjektumra mutató referencia képezhető. (Minden valuetype típusú adatstruktúrához elérhetőek a megfelelő burkoló osztályok a VES környezetben)

Az unboxing ennek a megfordítása, amikor egy referenciatípusból value típus lesz. Ez természetesen csak azokkal a referenciatípusokkal lehetséges, amelyikhez tartozik value típus is.

Nincs unió és halmazkezelés. A direktszorzat az osztályok segítségével valósítható meg.

Tömbök

A tömbkezelést közvetlenül támogatja az IL. Külön utasítás van helyfoglalásta (newarr) és kezelésére (ldelem, stelem, ldelema). A tömb fix hosszúságú (példányosuláskor) és típusú, így biztosítva az indexelési helyességet és helyes típustárolást.

Változók

A változók tárolási helyeket reprezentálnak. Minden változónak típusa van, ami meghatározza, hogy milyen értékeket lehet benne tárolni. IL-ben többnyire 4 bájtos méret a változó mérete (32 bites PC architektúrán), mint például a native int, vagy a pointerek. A IL-ben hétféle változótípust különböztethetünk meg: statikus változó, példányváltozó, tömbelem, értékparaméter, referenciaparaméter, kimeneti paraméter, lokális változó. Tömbváltozó csak nullától indulhat, de lehet több dimenziós is.