arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

Intermediate Language

A .Net-es forráskódok fordításkor nem futtatható gépi kódra, hanem egy speciális köztes kódra fordulnak.

A .NET fejlesztésekor elsősorban az akkor már meglévő rendszerek és nyelvek előnyeit, illetve hátrányait vették figyelembe. Ez alapján dolgoztak ki új koncepciókat a komponensfejlesztéssel és a fordítással kapcsolatban is. Általában egy magasabbszintű programozási nyelvről fordítás – esetleg egy előfordítási procedúra után – eredményez egy adott platformon futó gépi kódot. Más esetekben nem készül közvetlenül natív, futtatható kód (ilyen például a Java bájtkód vagy régebben a Visual Basic interpretere által értelmezett p-code), ekkor egy virtuális gép vagy az adott kódot értelmező könyvtár futtatja a kódot. Ez – például a Java esetében – platformfüggetlenséggel jár, azonban negatív hatása lehet a teljesítményre. A .NET rendszer a két megoldást ötvözi, bevezetve egy köztes nyelvet, a Common Intermediate Language-t (CIL vagy IL, régebben MSIL).

Egy .NET alatt készített program fordítása során tehát nem gépi kód, hanem egy speciális, futási időben történő fordításra tervezett bájtkód készül el. Ez a kód a program futása közben fordul, jellemzően metódusonként, az első hívás során. Az ezt követő hívások alkalmával már a natív kód fog futni. Ezt a folyamatot a JIT (Just in time ) fordító végzi el. Ennek a módszernek az előnye az, hogy az épp aktuális rendszer specifikus tulajdonságait kihasználva tud megfelelő hatékonyságú kódot létrehozni, miközben a program platformfüggetlen marad. Tehát egy adott program két különböző architektúrán különböző gépi kóddal, de a processzor egyedi utasításkészleteit, memóriakörnyezetet, stb. figyelembevéve futhat.

Maga az IL egy első látásra assembly-hez hasonló nyelv, ami azonban magasabb szintű feladatokat is ellát, így például kivételkezelést és típusdefiniálást is. Az IL kódkészlete döntően aritmetikai, ugró, veremmanipulációs, vektorkezelő, paraméterkezelő, konverziós, osztályok és értéktípusok kezelésére alkalmas utasításokból áll. Az optimalizáció is a JIT fordítás alatt zajlik, például nincs inkrementáló utasítás, helyette a számhoz egyet adunk, azonban ha a processzor utasításkészlete támogatja, akkor a JIT fordító az ismert inc művelettel helyettesíti.

Saját programunk IL kódjának tanulmányozásához a .NET SDK-jában található ildasm.exe nyújt segítséget. A köztes bájtkód egyik hátránya a könnyű visszafejthetőség, megfelelő program (pl. Lutz Roeder’s .NET Reflector) segítségével visszakaphatjuk a forráskódot. Ugyanígy a keretrendszer komponenseit is tanulmányozhatjuk, mélyebb betekintést nyerve a .NET működésébe.

IL

.method private hidebysig instance void example() cil managed
{
  .maxstack 2
  .locals init (
    [0] int32 a)
  L_0000: nop
  L_0001: ldc.i4.s 9
  L_0003: stloc.0
  L_0004: ldloc.0
  L_0005: ldc.i4.1
  L_0006: add
  L_0007: stloc.0
  L_0008: ret
} 

C#

private void example()
{
    int a = 9;
    ++a;
}