Common Intermediate Language: Forskelle mellem versioner

Content deleted Content added
Addbot (diskussion | bidrag)
m Bot: Migrerer 18 interwikilinks, som nu leveres af Wikidatad:q263544
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 anvendes til oversættelse af programmeringssprogene [[C Sharp|C#]], [[Visual C++]], [[Visual Basic .NET|VB.NET]] og [[J#]] til et [[Maskinkode|maskinkodelignendemaskinkode]]lignende sprog, for anvendelse i et [[.NET (Microsoft)|NET Framework]].
NET Framework]].
 
== Generel information ==
Under kompileringen af .NET-programmeringssprog, bliver [[kildekode|kildekoden]]n oversat til '''CIL'''-kode i stedet for platforms- eller processeror-specifik [[objektkode]]. CIL er et CPU- og platforms-uafhængigt instruktionssæt der kan udføres i ethvert miljø der understøtter [[Common Language Infrastructure]], såsom [[Common Language Runtime|.NET runtime]] på [[Microsoft Windows|Windows]], eller det [[platformsuafhængig]]e [[Mono (software)|Mono]] runtime. I teorien overflødiggør det nødvendigheden af forskellige udgivelser af eksekverbare filer til forskellige platforme og CPU-typer. CIL verificeres for sikkerhedsfejl under kørslen, hvilket giver øget stabilitet og pålidelighed sammenlignet med eksekverbare filer oversat direkte til maskinkode.
 
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:
<sourcesyntaxhighlight lang="asm">
add eax, edx
</syntaxhighlight>
</source>
Den tilsvarende kode i IL kan gengives sådan:
<sourcesyntaxhighlight lang="cil">
ldloc.0
ldloc.1
add
stloc.0 // a = a + b eller a += b;
</syntaxhighlight>
</source>
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:
<sourcesyntaxhighlight lang="cil">
.class public Foo
{
Line 57 ⟶ 56:
}
}
</syntaxhighlight>
</source>
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#]]:
<sourcesyntaxhighlight lang="csharp">
int r = Foo.Add(2, 3); // 5
</syntaxhighlight>
</source>
I CIL bliver det:
<sourcesyntaxhighlight lang="cil">
ldc.i4.2
ldc.i4.3
call int32 Foo::Add(int32, int32)
stloc.0
</syntaxhighlight>
</source>
'''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.
<sourcesyntaxhighlight lang="cil">
.class public Car
{
Line 100 ⟶ 99:
}
}
</syntaxhighlight>
</source>
'''Oprettelse af objekter'''
Line 106 ⟶ 105:
I C# oprettes klasseinstanser således:
 
<sourcesyntaxhighlight lang="csharp">
Car myCar = new Car(1, 4);
Car yourCar = new Car(1, 3);
</syntaxhighlight>
</source>
 
Disse udtryk er groft sagt de samme som disse instruktioner:
<sourcesyntaxhighlight lang="cil">
ldc.i4.1
ldc.i4.4
Line 121 ⟶ 120:
newobj instance void Car::.ctor(int, int)
stloc.1 // yourCar = new Car(1, 3);
</syntaxhighlight>
</source>
 
'''Invokering af instansmetoder'''
 
Instansmetoder kaldes som i efterfølgende:
<sourcesyntaxhighlight lang="csharp">
myCar.Move(3);
</syntaxhighlight>
</source>
 
I CIL:
<sourcesyntaxhighlight lang="cil">
ldloc.0 // Indlæs objektet "myCar" på stakken
ldc.i4.3
call instance void Car::Move(int32)
</syntaxhighlight>
</source>
 
Følgende kode er mere kompleks i antal [[opkode]]r.
 
<sourcesyntaxhighlight lang="csharp">
static void Main(string[] args)
{
Line 153 ⟶ 152:
}
}
</syntaxhighlight>
</source>
 
I CIL ville det se nogenlunde således ud:
 
<sourcesyntaxhighlight lang="cil">
.method private hidebysig static void Main(string[] args) cil managed
{
Line 193 ⟶ 192:
ret
}
</syntaxhighlight>
</source>
 
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).