При использовании промежуточного формата, такого как .NET или Java, можно получить две вещи:
- Вы можете запустить программу на любой платформе именно потому, что код представлен в промежуточном формате.родного кода.Вам просто нужно написать интерпретатор для промежуточного формата.
- Он допускает некоторые оптимизации во время выполнения, которые (легко) невозможны во время компиляции: например, вы можете воспользоваться специальными функциями в новомПроцессоры, даже если эти процессоры не существовали, когда вы писали свою программу - об этом должен знать только JIT-компилятор.
Теперь о том, почему вы можете не захотеть выполнять компиляцию насначала запустите, а затем просто зашифруйте это - для этого также может быть несколько причин.
Если вы компилируете перед запуском, то пользователь должен ждать намного дольше для этого первого запуска - в этот моментвремя, вы не можете знать, что на самом деле пользователь будет использовать.Компилируя только то, что вам нужно, когда вам это нужно, вы можете начать намного быстрее, просто потому, что у вас меньше работы, и вы не храните много кода, который пользователь никогда не будет использовать (что для большой программы можетмного кода).
Если вы начинаете кэшировать JIT-кодированный код между сеансами, вам нужно отслеживать, что уже скомпилировано, и затем сохранять его на диске.Для большой программы у вас может быть много встроенного кода для загрузки с диска.Дисковый ввод-вывод довольно дорогой, поэтому ожидание диска может занять больше времени, чем повторная его JIT.Кроме того, вам нужно следить за тем, как долго этот кэш может использоваться.Если аппаратное обеспечение меняется, вы можете повторно выполнить JIT, чтобы применить некоторые новые оптимизации.Если программа изменится, вы не сможете использовать ваш старый скомпилированный код.Если во время выполнения компилятор изменится, возможно, исправлена ошибка безопасности, и вам нужно перекомпилировать, чтобы убедиться, что ошибка не сохраняется в вашем собственном коде.
По сути, JIT-компилятор неожиданно имеетгораздо больше работы (включая дисковый ввод / вывод для работы с кешем), и она становится намного более сложной и медленной, уменьшая суть JIT'ing.
Теперь это не означает, что он может 'Иногда бывает полезно предварительно скомпилировать определенные сборки, и, как указывает Мэтью Феррейра, это то, что может сделать инструмент ngen, но в общем случае это просто не стоит делать, потому что JIT-компиляция часто бывает более чем достаточно быстрой.