Что такое Just-In-Time (JIT) Compiler в .NET

Опубликовано: 6 Марта, 2022

Компилятор Just-In-Time (JIT) - это часть Common Language Runtime (CLR) в .NET, которая отвечает за управление выполнением программ .NET независимо от любого языка программирования .NET. Компилятор, зависящий от языка, преобразует исходный код в промежуточный язык. Затем этот промежуточный язык преобразуется в машинный код компилятором Just-In-Time (JIT). Этот машинный код специфичен для компьютерной среды, в которой работает JIT-компилятор.

Работа JIT-компилятора: JIT-компилятор необходим для ускорения выполнения кода и обеспечения поддержки нескольких платформ. Его работа выглядит следующим образом:

Компилятор JIT преобразует промежуточный язык Microsoft (MSIL) или общий промежуточный язык (CIL) в машинный код. Это делается до того, как можно будет выполнить MSIL или CIL. MSIL преобразуется в машинный код на основе требований, то есть JIT-компилятор компилирует MSIL или CIL по мере необходимости, а не целиком. Скомпилированный MSIL или CIL сохраняется, чтобы при необходимости он был доступен для последующих вызовов.

Типы JIT-компиляторов: существует 3 типа JIT-компиляторов:

  • Компилятор Pre-JIT: весь исходный код компилируется в машинный код одновременно в одном цикле компиляции с использованием компилятора Pre-JIT. Этот процесс компиляции выполняется во время развертывания приложения. И этот компилятор всегда реализован в Ngen.exe (Native Image Generator) .

  • Обычный JIT-компилятор: методы исходного кода, которые требуются во время выполнения, компилируются в машинный код при первом вызове обычным JIT-компилятором. После этого они сохраняются в кеше и используются при повторном вызове.

  • Компилятор Econo JIT: методы исходного кода, необходимые во время выполнения, компилируются в машинный код компилятором Econo JIT. После того, как эти методы больше не требуются, они удаляются. Этот JIT-компилятор устарел, начиная с dotnet 2.0.

Преимущества JIT-компилятора:

  • Компилятор JIT требует меньшего использования памяти, поскольку только те методы, которые требуются во время выполнения, компилируются в машинный код компилятором JIT.
  • Ошибки страниц уменьшаются за счет использования JIT-компилятора, поскольку требуемые вместе методы, скорее всего, находятся на одной странице памяти.
  • Оптимизация кода на основе статистического анализа может выполняться JIT-компилятором во время выполнения кода.

Недостатки JIT-компилятора:

  • Компилятору JIT требуется больше времени для запуска, пока приложение выполняется изначально.
  • Кэш-память активно используется JIT-компилятором для хранения методов исходного кода, которые требуются во время выполнения.

Примечание. Многие недостатки JIT-компилятора можно устранить с помощью предварительной компиляции (AOT). Это включает в себя компиляцию MSIL в машинный код, так что компиляция во время выполнения не требуется, и файл машинного кода может выполняться в исходном виде.

C#