Я думал об этом в последнее время, и мне кажется, что большинство преимуществ, предоставляемых компиляцией JIT , следует более или менее отнести к промежуточному формату, и что само по себе джитинг не так уж много о хорошем способе генерировать код.
Итак, вот основные pro-JIT аргументы компиляции, которые я обычно слышу:
- Компиляция точно в срок обеспечивает большую переносимость. Разве это не связано с промежуточным форматом? Я имею в виду, что ничто не мешает вам скомпилировать ваш виртуальный байт-код в собственный байт-код, как только вы получите его на своем компьютере. Переносимость является проблемой на этапе «распространения», а не на этапе «выполнения».
- Хорошо, тогда как насчет генерации кода во время выполнения? Ну, то же самое относится. Ничто не мешает вам интегрировать компилятор "точно в срок" для реальной необходимости "точно в срок" в вашу нативную программу.
- Но среда выполнения в любом случае компилирует его в собственный код и сохраняет полученный исполняемый файл в каком-то кеше на жестком диске. Да, конечно. Но она оптимизировала вашу программу в условиях ограниченного времени и с этого момента не делает ее лучше. Смотрите следующий абзац.
Это не похоже на опережающую компиляцию , также не имеет никаких преимуществ. Оперативная компиляция имеет временные ограничения: вы не можете заставить конечного пользователя ждать вечно, пока ваша программа запускается, поэтому у него есть компромисс, который нужно где-то сделать. Большую часть времени они просто оптимизируют меньше. У моего друга было профилирующее свидетельство о том, что встраивание функций и развертывание циклов "вручную" (запутывание исходного кода в процессе) положительно повлияло на производительность его C # программы обработки чисел; выполнение моей работы с моей стороны, когда моя C программа выполняла ту же задачу, не дало никаких положительных результатов, и я считаю, что это связано с обширными преобразованиями, которые мой компилятор позволял делать.
И все же мы окружены сопряженными программами. C # и Java есть везде, скрипты Python могут компилироваться в какой-то байт-код, и я уверен, что целый ряд других языков программирования делают то же самое. Должна быть веская причина, по которой я скучаю. Так что же делает компиляцию точно в срок настолько превосходящей опережающую компиляцию ?
РЕДАКТИРОВАТЬ Чтобы устранить некоторую путаницу, возможно, было бы важно заявить, что я все для промежуточного представления исполняемых файлов. Это имеет много преимуществ (и на самом деле большинство аргументов для Just-in-Time на самом деле являются аргументами для промежуточного представления). Мой вопрос о том, как они должны быть скомпилированы в нативный код.
Большинство сред выполнения (или, если на то пошло, компиляторов) предпочитают компилировать их точно в срок или раньше времени. Поскольку опережающая компиляция выглядит для меня лучшей альтернативой, потому что у компилятора больше времени для выполнения оптимизаций, мне интересно, почему Microsoft, Sun и все остальные идут наоборот. Я немного сомневаюсь в оптимизации, связанной с профилированием, поскольку мой опыт работы с программами, скомпилированными точно в срок , показал плохую базовую оптимизацию.
Я использовал пример с кодом C только потому, что мне был нужен пример опережающей компиляции против компиляции точно в срок. Тот факт, что код C не был передан в промежуточное представление, не имеет отношения к ситуации, поскольку мне просто нужно было показать, что компиляция с опережением времени может дать лучшие немедленные результаты.