Common Intermediate Language: Porovnání verzí

Smazaný obsah Přidaný obsah
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ě:
 
<sourcesyntaxhighlight lang=asm>
add eax, edx
mov ecx, eax
</syntaxhighlight>
</source>
 
Odpovídající kód v&nbsp;CIL by mohl vypadat takto:
 
<sourcesyntaxhighlight lang="cil">
ldloc.0
ldloc.1
add
stloc.0 // a = a + b or a += b;
</syntaxhighlight>
</source>
 
V&nbsp;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&nbsp;výsledek je na něj obratem uložen. Hodnota je pak vyzvednuta a&nbsp;uložena jako první lokální proměnná.
Řádek 51:
Příklad statické metody:
 
<sourcesyntaxhighlight lang="cil">
.class public Foo
{
Řádek 69:
}
}
</syntaxhighlight>
</source>
 
Použitá metoda nevyžaduje žádnou deklaraci instance třídy Foo, protože je statická. To znamená, že náleží do třídy a&nbsp;může být následně použita jako v&nbsp;tomto případě v&nbsp;C♯.
 
<sourcesyntaxhighlight lang="csharp">
int r = Foo.Add(2, 3); //5
</syntaxhighlight>
</source>
V CIL
<sourcesyntaxhighlight lang="cil">
ldc.i4.2
ldc.i4.3
call int32 Foo::Add(int32, int32)
stloc.0
</syntaxhighlight>
</source>
 
==== Instance tříd ====
Instance třídy obsahuje nejméně jeden [[konstruktor]] a&nbsp;nějaké další členy. Tato třída má sadu metod reprezentujících akce objektu Car.
 
<sourcesyntaxhighlight lang="cil">
.class public Car
{
Řádek 116:
}
}
</syntaxhighlight>
</source>
 
==== Vytváření objektů ====
Řádek 122:
Instance tříd jsou v&nbsp;[[C Sharp|C♯]] vytvářeny následujícím způsobem:
 
<sourcesyntaxhighlight lang="csharp">
Car myCar = new Car(1, 4);
Car yourCar = new Car(1, 3);
</syntaxhighlight>
</source>
 
Příkazy jsou přibližně stejné jako tyto instrukce:
 
<sourcesyntaxhighlight lang="cil">
ldc.i4.1
ldc.i4.4
Řádek 138:
newobj instance void Car::.ctor(int, int)
stloc.1 // yourCar = new Car(1, 3);
</syntaxhighlight>
</source>
 
==== Vyvolání metody instance ====
Například metody jsou volány následovně:
 
<sourcesyntaxhighlight lang="csharp">
myCar.Move(3);
</syntaxhighlight>
</source>
V CIL:
<sourcesyntaxhighlight lang="cil">
ldloc.0 // Load the object "myCar" on the stack
ldc.i4.3
call instance void Car::Move(int32)
</syntaxhighlight>
</source>
 
=== Metadata ===
Řádek 159:
Příklad je napsán v&nbsp;CIL a&nbsp;demonstruje kód „Hello, World“:
 
<sourcesyntaxhighlight lang="cil">
.assembly Hello {}
.assembly extern mscorlib {}
Řádek 170:
ret
}
</syntaxhighlight>
</source>
 
Tento kód může být porovnán s&nbsp;odpovídajícím kódem [[Java bytecode]]:
 
<sourcesyntaxhighlight lang="csharp">
static void Main(string[] args)
{
Řádek 188:
}
}
</syntaxhighlight>
</source>
 
V&nbsp;CIL-syntaxi by zápis vypadal následovně:
 
<sourcesyntaxhighlight lang="cil">
.method private hidebysig static void Main(string[] args) cil managed
{
Řádek 228:
ret
}
</syntaxhighlight>
</source>
 
Výše je správná reprezentace toho, jak vypadá CIL blízko VM úrovně. Když jsou zkompilované metody uloženy v&nbsp;tabulkách a&nbsp;instrukce zase v&nbsp;bytech uvnitř assembly, který je přenosně spustitelným souborem (Portable Executable-file).