Приветствую всех дизайнеров компиляторов здесь, на Stack Overflow.
В настоящее время я работаю над проектом, который сосредоточен на разработке нового языка сценариев для использования с высокопроизводительными вычислениями. Исходный код сначала компилируется в представление байтового кода. Затем байт-код загружается средой выполнения, которая выполняет агрессивные (и, возможно, трудоемкие) оптимизации для него (которые идут гораздо дальше, чем то, что делают даже большинство «опережающих» компиляторов, ведь в этом весь смысл проект). Имейте в виду, что результатом этого процесса по-прежнему остается байт-код.
Затем байт-код запускается на виртуальной машине. В настоящее время эта виртуальная машина реализована с использованием прямой таблицы переходов и насоса сообщений. Виртуальная машина перебирает байт-код с указателем, загружает инструкцию под указателем, ищет обработчик инструкций в таблице переходов и переходит в нее. Обработчик команд выполняет соответствующие действия и, наконец, возвращает управление циклу сообщений. Указатель инструкций виртуальной машины увеличивается, и весь процесс начинается заново. Производительность, которую я могу достичь с помощью этого подхода, на самом деле довольно удивительна. Конечно, код реальных обработчиков команд снова настраивается вручную.
В настоящее время большинство "профессиональных" сред выполнения (таких как Java, .NET и т. Д.) Используют компиляцию Just-in-Time для преобразования байтового кода в собственный код перед выполнением. Виртуальная машина, использующая JIT, обычно имеет гораздо лучшую производительность, чем интерпретатор байтового кода. Теперь вопрос заключается в том, что, поскольку все, что в основном делает интерпретатор, - это загружает инструкцию и ищет цель перехода в таблице переходов (помните, что сам обработчик инструкций статически компилируется в интерпретатор, так что это уже нативный код), будет ли использование Компиляция Just-in-Time приводит к увеличению производительности или на самом деле ухудшает производительность? Я не могу себе представить, что таблица переходов интерпретатора может ухудшить производительность , что на значительно, чтобы компенсировать время, потраченное на компиляцию этого кода с использованием JITer. Я понимаю, что JITer может выполнять дополнительную оптимизацию кода, но в моем случае очень агрессивная оптимизация уже выполняется на уровне байтового кода перед выполнением. Как вы думаете, я мог бы получить больше скорости, заменив интерпретатор JIT-компилятором? Если так, то почему?
Я понимаю, что реализация обоих подходов и сравнительный анализ обеспечат наиболее точный ответ на этот вопрос, но это может не стоить времени, если есть четкий ответ.
Спасибо.