Что такое Just-In-Time (JIT) Compiler в .NET
Компилятор 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 в машинный код, так что компиляция во время выполнения не требуется, и файл машинного кода может выполняться в исходном виде.