Interested Article - Common Intermediate Language

Common Intermediate Language (сокращённо CIL ) — «высокоуровневый ассемблер» виртуальной машины .NET . Промежуточный язык, разработанный компанией Microsoft для платформы .NET Framework . JIT -компилятор CIL является частью CLR ( англ. c ommon l anguage r untime ) — общей среды выполнения программ, написанных на языках .NET . Ранее язык назывался « Microsoft Intermediate Language (MSIL) », однако был переименован для создания стандарта «ECMA-335».

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

По синтаксису и мнемонике язык CIL напоминает язык ассемблера . Его можно рассматривать как ассемблер виртуальной машины .NET. В то же время язык CIL содержит некоторые достаточно высокоуровневые конструкции, повышающие его уровень по сравнению с ассемблером для любой реально существующей машины, и писать код непосредственно на CIL легче, чем на ассемблере для реальных машин. Поэтому CIL можно рассматривать как своеобразный «высокоуровневый ассемблер».

Язык CIL также нередко называют просто IL от англ. i ntermediate l anguage — буквально «промежуточный язык».

Синтаксис и мнемоника языка CIL описываются стандартом «ECMA-335». Спецификация CIL является составной частью более общей спецификации — спецификации CLI ( англ. c ommon l anguage i nfrastructure ).

Пример кода

Следующая программа написана на языке 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, в который компилируется код C# , записанный выше.

.assembly primes{}
.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack  2
    .locals init (int32 V_0,
                  int32 V_1)

              ldc.i4.2
              stloc.0    // v_0=2
              br.s       IL_001f
    IL_0004:  ldc.i4.2
              stloc.1    // v_1=2
              br.s       IL_0011
    IL_0008:  ldloc.0 // V_0  
              ldloc.1 // V_1
              rem     // V_0 % V_1
              brfalse.s  IL_001b
              ldloc.1  //v_1
              ldc.i4.1
              add
              stloc.1 // v_1+=1
    IL_0011:  ldloc.1 //if v_1<=v_0
              ldloc.0
              blt.s      IL_0008
              ldloc.0
              call       void [mscorlib]System.Console::WriteLine(int32)
    IL_001b:  ldloc.0 //v_0
              ldc.i4.1
              add
              stloc.0 //v_0+=1
    IL_001f:  ldloc.0
              ldc.i4     0x3e8
              blt.s      IL_0004 //if v_0<=1000
              ret
}

В комплекте с IDE « Microsoft Visual Studio » поставляется утилита ildasm , позволяющая просматривать код CIL. ildasm по умолчанию устанавливается в папку « C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools » (точный путь зависит от разрядности ОС и версии .NET Framework ).

Источник —

Same as Common Intermediate Language