Перейти до вмісту

Common Intermediate Language

Матеріал з Вікіпедії — вільної енциклопедії.

Common Intermediate Language (скорочено CIL) — проміжна мова, розроблена корпорацією Microsoft для платформи .NET Framework. JIT-компілятор CIL є частиною CLR (англ. Common Language Runtime) — спільного середовища виконання мов для платформи .NET. Раніше ця мова мала назву Microsoft Intermediate Language, але була переіменована для створення стандарту ECMA-335.

В код на мові CIL повинні транслювати код на мовах високого рівня усі компілятори, які забезпечують підтримку платформи .NET. Код на CIL генерирують всі компілятори для платформи .NET самоЇ фірми Microsoft, які входять в середовище розробки Visual Studio (C#, Managed C++, Visual Basic .NET, Visual J# .NET).

Мова CIL по синтаксису і мнемоніці нагадує мову асемблера. Її можна розглядати як асемблер виртуальної машини .NET. В той самий час мова CIL містить деякі достатньо високорівневі конструкції, які підвищують її рівень в порівнянні з асемблером для будь-якої реально існуючої машини, і писати код безпосередньо на CIL лекше, ніж на асемблері для реальних машин. Тому її можна розглядати як своєрідний «високорівнений асемблер».

Мову CIL доволі часто називають просто IL (англ. Intermediate Language), тобто «проміжна мова».

Синтаксис і мнемоніка мови CIL описані стандартом ECMA-335. Спецификація CIL є складовою частиною більш спільної специфікації Common Language Infrastructure (CLI).

Приклад коду

Приклад програми Hello, World, написаної на CIL. Вона виводить стрічку «Hello, world!».

.assembly Hello {}
.method public static void Main() cil managed
{
     .entrypoint
     .maxstack 1
     ldstr "Hello, world!"
     call void [mscorlib]System.Console::WriteLine(string)
     ret
}

Це ще одна програма (на C#),

static void Main(string[] args)
{
    for (int i = 2; i < 1000; i++)
    {
         for (int j = 2; j < i; j++)
         {
              if (i % j == 0)
                   goto outer;
         }
         Console.WriteLine(i);
    }
outer:
}

яка на CIL виглядає так:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  .maxstack  2
  .locals init ([0] int32 i,
           [1] int32 j)
  IL_0000:  ldc.i4.2
            stloc.0
            br.s       IL_001f
  IL_0004:  ldc.i4.2
            stloc.1
            br.s       IL_0011
  IL_0008:  ldloc.0
            ldloc.1
            rem
            brfalse.s  IL_0000
            ldloc.1
            ldc.i4.1
            add
            stloc.1
  IL_0011:  ldloc.1
            ldloc.0
            blt.s      IL_0008
            ldloc.0
            call       void [mscorlib]System.Console::WriteLine(int32)
            ldloc.0
            ldc.i4.1
            add
            stloc.0
  IL_001f:  ldloc.0
            ldc.i4     0x3e8
            blt.s      IL_0004
            ret
}