Common Intermediate Language: Porovnání verzí
Smazaný obsah Přidaný obsah
m →Kompilace just-in-time: link fix |
m Robot: -zastaralá značka HTML; kosmetické úpravy |
||
Řádek 21:
* Operand managementu zásobníku (push / pop)
* Kontrola převodu (větvení – Branching)
* Volání metod
* Vyvolání výjimky
* Synchronizace
Řádek 30:
V assembleru [[x86]] [[IA-32|architektury IA-32]] by to mohlo vypadat následovně:
<
add eax, edx
mov ecx, eax
</syntaxhighlight>
Odpovídající kód v CIL by mohl vypadat takto:
<
ldloc.0
ldloc.1
add
stloc.0 // a = a + b or a += b;
</syntaxhighlight>
V programu jsou použity dvě lokálně proměnné, které jsou přesunuty do fronty. Když je přidaná instrukce zavolána, operand je ze zásobníku vyzvednut a výsledek je na něj obratem uložen. Hodnota je pak vyzvednuta a uložena jako první lokální proměnná.
Řádek 51:
Příklad statické metody:
<
.class public Foo
{
Řádek 69:
}
}
</syntaxhighlight>
Použitá metoda nevyžaduje žádnou deklaraci instance třídy Foo, protože je statická. To znamená, že náleží do třídy a může být následně použita jako v tomto případě v C♯.
<
int r = Foo.Add(2, 3); //5
</syntaxhighlight>
V CIL
<
ldc.i4.2
ldc.i4.3
call int32 Foo::Add(int32, int32)
stloc.0
</syntaxhighlight>
==== Instance tříd ====
Instance třídy obsahuje nejméně jeden [[konstruktor]] a nějaké další členy. Tato třída má sadu metod reprezentujících akce objektu Car.
<
.class public Car
{
Řádek 116:
}
}
</syntaxhighlight>
==== Vytváření objektů ====
Řádek 122:
Instance tříd jsou v [[C Sharp|C♯]] vytvářeny následujícím způsobem:
<
Car myCar = new Car(1, 4);
Car yourCar = new Car(1, 3);
</syntaxhighlight>
Příkazy jsou přibližně stejné jako tyto instrukce:
<
ldc.i4.1
ldc.i4.4
Řádek 138:
newobj instance void Car::.ctor(int, int)
stloc.1 // yourCar = new Car(1, 3);
</syntaxhighlight>
==== Vyvolání metody instance ====
Například metody jsou volány následovně:
<
myCar.Move(3);
</syntaxhighlight>
V CIL:
<
ldloc.0 // Load the object "myCar" on the stack
ldc.i4.3
call instance void Car::Move(int32)
</syntaxhighlight>
=== Metadata ===
Řádek 159:
Příklad je napsán v CIL a demonstruje kód „Hello, World“:
<
.assembly Hello {}
.assembly extern mscorlib {}
Řádek 170:
ret
}
</syntaxhighlight>
Tento kód může být porovnán s odpovídajícím kódem [[Java bytecode]]:
<
static void Main(string[] args)
{
Řádek 188:
}
}
</syntaxhighlight>
V CIL-syntaxi by zápis vypadal následovně:
<
.method private hidebysig static void Main(string[] args) cil managed
{
Řádek 228:
ret
}
</syntaxhighlight>
Výše je správná reprezentace toho, jak vypadá CIL blízko VM úrovně. Když jsou zkompilované metody uloženy v tabulkách a instrukce zase v bytech uvnitř assembly, který je přenosně spustitelným souborem (Portable Executable-file).
|