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