Common Intermediate Language

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Сунприат (обсуждение | вклад) в 10:33, 7 ноября 2015 (дополнение). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Common Intermediate Language (сокращённо CIL) — «высокоуровневый ассемблер» виртуальной машины .NET. Промежуточный язык, разработанный фирмой «Microsoft» для платформы .NET Framework. JIT-компилятор CIL является частью CLR (англ. common language runtime) — общей среды выполнения программ, написанных на языках .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 от англ. intermediate language — буквально «промежуточный язык».

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

Пример кода

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

.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
}

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