Common Intermediate Language: Forskelle mellem versioner
Content deleted Content added
Addbot (diskussion | bidrag) |
Xqbot (diskussion | bidrag) m Bot: Replace deprecated <source> tag and "enclose" parameter; kosmetiske ændringer |
||
Linje 1:
'''Common Intermediate Language''' (CIL), tidligere ''Microsoft Intermediate Language'' (MSIL) er det laveste niveau af menneskelig-læsbar programkode defineret i specifikationen af [[Common Language Infrastructure]] (CLI) og anvendes af .NET Framework og [[Mono (software)|Mono]]. Programmeringssprog der er målrettet et [[Common Language Specification|CLS]]-kompatibelt [[kørselsmiljø]] kompileres til CIL, der samles til objektkode i et bytekode-lignende format. CIL er et [[objektorienteret]] [[assemblersprog]] og er fuldstændig [[Stak (datastruktur)|stakbaseret]]. Dets bytekode fortolkes til [[maskinkode]] eller afvikles af en [[virtuel maskine]].
CIL
== Generel information ==
Under kompileringen af .NET-programmeringssprog, bliver [[kildekode
Afviklingsprocessen ser således ud:
Line 11 ⟶ 10:
# CIL bliver dernæst samlet til en form for [[bytekode]] og en .NET-assembly oprettes.
# Under kørslen af en .NET-assembly bliver dens kode sendt gennem .NET-runtimes JIT-kompiler hvor den oversættes til maskinkode. Det er også muligt at prekompilere koden, hvilket overflødiggør dette trin på bekostning af portabiliteten af den eksekverbare fil.
# Maskinkoden bliver afviklet af computerens processor.
== Instruktioner ==
Line 29 ⟶ 28:
I [[x86]] kunne det se således ud:
<
add eax, edx
</syntaxhighlight>
Den tilsvarende kode i IL kan gengives sådan:
<
ldloc.0
ldloc.1
add
stloc.0 // a = a + b eller a += b;
</syntaxhighlight>
Her er der to lokale værdier der lægges i stakken (push). Når ''add''-instruktionen bliver trukket ud af stakken hentes (poppes) de to operander og resultatet skubbes (pushes). Den tilbageværende værdi bliver trukket af stakken og lagret i den første lokale variabel.
== Objektorienterede koncepter ==
Line 45 ⟶ 44:
CIL er designet til at være objektorienteret og alle metoder skal (med enkelte undtagelser) tilhøre en klasse. Således tilhører denne statiske metode, Add, en klasse, Foo:
<
.class public Foo
{
Line 57 ⟶ 56:
}
}
</syntaxhighlight>
Denne metode behøver ikke nogen instans (et objekt) af Foo fordi den er statisk. Det betyder, at den tilhører klassen og kan bruges således i [[C sharp|C#]]:
<
int r = Foo.Add(2, 3); // 5
</syntaxhighlight>
I CIL bliver det:
<
ldc.i4.2
ldc.i4.3
call int32 Foo::Add(int32, int32)
stloc.0
</syntaxhighlight>
'''Instantierede klasser'''
En instantieret klasse indeholder som minimum en konstruktør (eng: ''constructor'') og nogen instansmedlemmer. Denne klasse har et sæt metoder der repræsenterer handlinger for et Car-objekt.
<
.class public Car
{
Line 100 ⟶ 99:
}
}
</syntaxhighlight>
'''Oprettelse af objekter'''
Line 106 ⟶ 105:
I C# oprettes klasseinstanser således:
<
Car myCar = new Car(1, 4);
Car yourCar = new Car(1, 3);
</syntaxhighlight>
Disse udtryk er groft sagt de samme som disse instruktioner:
<
ldc.i4.1
ldc.i4.4
Line 121 ⟶ 120:
newobj instance void Car::.ctor(int, int)
stloc.1 // yourCar = new Car(1, 3);
</syntaxhighlight>
'''Invokering af instansmetoder'''
Instansmetoder kaldes som i efterfølgende:
<
myCar.Move(3);
</syntaxhighlight>
I CIL:
<
ldloc.0 // Indlæs objektet "myCar" på stakken
ldc.i4.3
call instance void Car::Move(int32)
</syntaxhighlight>
Følgende kode er mere kompleks i antal [[opkode]]r.
<
static void Main(string[] args)
{
Line 153 ⟶ 152:
}
}
</syntaxhighlight>
I CIL ville det se nogenlunde således ud:
<
.method private hidebysig static void Main(string[] args) cil managed
{
Line 193 ⟶ 192:
ret
}
</syntaxhighlight>
Dette er blot en repræsentation af hvordan CIL ser ud nær VM-niveau. Efter kompileringen af koden gemmes metoderne i tabeller og instruktionerne er gemt som bytes indeni assemblien, der fungerer som Portabel Eksekverbar-fil (PE).
|