В моем проекте есть виртуальная машина, которая выполняет байт-код, скомпилированный из предметно-ориентированного языка. Я ищу способы улучшить время выполнения байт-кода. В качестве первого шага я хотел бы увидеть, есть ли способ просто улучшить интерпретатор байт-кода, прежде чем я решусь на компиляцию машинного кода.
Основной цикл интерпретатора выглядит следующим образом:
while(true)
{
uint8_t cmd = *code++;
switch( cmd )
{
case op_1: ...; break;
...
}
}
ВОПРОС: Есть ли более быстрый способ реализовать этот цикл без использования ассемблера?
Я вижу один вариант, специфичный для GCC, для использования динамического перехода с адресами меток. Вместо перерыва
в конце каждого кейса я мог сразу перейти к следующей инструкции. Я надеялся, что оптимизатор сделает это за меня, но, глядя на разборку, очевидно, что нет: в конце большинства op_codes есть повторяющийся постоянный переход.
Если уместно, виртуальная машина представляет собой простую машину на основе регистров с плавающей точкой. точечные и целочисленные регистры (по 8 штук). Нет стека, только глобальная куча (этот язык не такой уж сложный).