CIL (tietotekniikka)
CIL (Common Intermediate Language) on Common Language Infrastructure (CLI) - ympäristön määrittelemä tavukoodin (bytecode) muotoinen välikieli, johon CLI-yhteensopivilla ohjelmointikielillä kirjoitetut ohjelmat käännetään ennen suorittamista.[1] CIL muodostaa .NET-ympäristön tavukoodin: se on matalan tason, pinoon perustuva käskykieli, jota Common Language Runtime (CLR) tai muu Common Language Infrastructure (CLI) - yhteensopiva ajonaikainen ympäristö suorittaa kääntämällä sen edelleen natiiviksi konekieleksi.[2]
Yleiskuvaus
[muokkaa | muokkaa wikitekstiä]CIL on suunniteltu kieliriippumattomaksi välikieleksi: eri ohjelmointikielet, kuten C# ja Visual Basic .NET, voidaan kääntää samaan CIL-koodiin, kunhan ne noudattavat CLI:n määrittelemää Common Type System -tietomallia.[3] CIL-ohjelmat sisältävät itse käskyjen lisäksi metatiedot tyypeistä, jäsenistä ja viittauksista, mikä mahdollistaa muun muassa heijastuksen (reflection) ja dynaamisen koodin lataamisen.[1]
CIL on pinoon perustuva käskykieli, jossa useimmat käskyt ottavat operandit arvopinosta ja tallettavat tulokset takaisin pinoon.[1] CIL-käskyvalikoima sisältää muun muassa:
- aritmeettiset ja loogiset perusoperaatiot
- haarautumis- ja silmukkakäskyt
- metodikutsut ja paluut
- poikkeusten käsittelyn käskyt
- muistinkäsittelyyn liittyvät lataus- ja talletusoperaatiot.
CIL tavukoodi koostuu binäärisistä käskyistä ja metatiedoista. Tavukoodi suoritetaan Common Language Infrastructure (CLI) -ympäristön virtuaalikoneessa. Microsoftin .NET-ympäristössä tämä virtuaalikone on CLR, joka kääntää CIL-tavukoodin natiiviksi konekieleksi.
CIL-koodi tallennetaan tavallisesti PE/COFF-muotoisiin suoritettaviin tiedostoihin (EXE) ja kirjastoihin (DLL), joissa tavukoodi ja metatiedot ovat erillään natiivikoodista.[1]
Suhde hallittuun suoritukseen
[muokkaa | muokkaa wikitekstiä]CLR:ssä hallittu suoritusprosessi alkaa, kun CIL-tavukoodi ja siihen liittyvät metatiedot ladataan muistiin.[2] CLR tarkistaa koodin tyyppiturvallisuuden ja käyttöoikeudet, minkä jälkeen se kääntää CIL-koodin just-in-time-kääntäjän (JIT) avulla natiiviksi konekieleksi tai hyödyntää etukäteen käännettyä natiivikoodia (Native AOT).[4] CIL:n ja metatietojen yhdistelmä mahdollistaa sen, että ajonaikainen ympäristö voi tarkastella ohjelman rakennetta, valvoa sen turvallisuutta ja tarjota korkeantason palveluja kuten roskienkeruun ja dynaamisen koodin lataamisen.[2]
Terminologia
[muokkaa | muokkaa wikitekstiä]CIL:stä käytettiin aiemmissa Microsoftin dokumenteissa myös nimitystä Microsoft Intermediate Language (MSIL).[1] ECMA-335-standardissa välikielestä käytetään nimeä Common Intermediate Language (CIL), ja tätä termiä käytetään .NET-ympäristön välikielen virallisena nimenä.
Esimerkki
[muokkaa | muokkaa wikitekstiä]C# -metodi, joka laskee kahden luvun summan, käännetään CIL-välikielelle Roslyn-kääntäjäalustan toimesta esimerkiksi dotnet build -komennon yhteydessä. Roslyn analysoi C#-lähdekoodin syntaktisesti ja semanttisesti ja generoi siitä ECMA-335-standardin mukaista CIL-tavukoodia.[1]
C#-lähdekoodi:
public static int Add(int a, int b)
{
return a + b;
}
Roslynin generoima CIL-tavukoodi:
.method public static int32 Add(int32 a, int32 b) cil managed
{
.maxstack 2
ldarg.0 // lataa a pinolle
ldarg.1 // lataa b pinolle
add // laske a + b
ret // palauta tulos
}Tämä esimerkki kuvaa CIL:n pinoon perustuvaa toimintaa: operandit ladataan pinoon (ldarg), operaatio suoritetaan (add) ja tulos palautetaan (ret). Esimerkin rakenne vastaa ECMA-335-standardin Partition III:ssa esiteltyjä aritmeettisia käskyjä.[1]
Katso myös
[muokkaa | muokkaa wikitekstiä]Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ a b c d e f g Standard ECMA-335: Common Language Infrastructure (CLI), Partition I: Architecture Ecma International. Viitattu 8.12.2025.
- ↑ a b c Managed execution process Microsoft Learn. Viitattu 8.12.2025.
- ↑ Language independence and language-independent components Microsoft Learn. Viitattu 8.12.2025.
- ↑ Native AOT deployment overview Microsoft Learn. Viitattu 8.12.2025.