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. 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.
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. 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.
CIL on pinoon perustuva käskykieli, jossa useimmat käskyt ottavat operandit arvopinosta ja tallettavat tulokset takaisin pinoon. CIL-käskyvalikoima sisältää muun muassa:
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.
CLR:ssä hallittu suoritusprosessi alkaa, kun CIL-tavukoodi ja siihen liittyvät metatiedot ladataan muistiin. 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). 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.
CIL:stä käytettiin aiemmissa Microsoftin dokumenteissa myös nimitystä Microsoft Intermediate Language (MSIL). 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ä.
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.
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ä.