Оптимальный цикл интерпретатора виртуальной машины / байтового кода

В моем проекте есть виртуальная машина, которая выполняет байт-код, скомпилированный из предметно-ориентированного языка. Я ищу способы улучшить время выполнения байт-кода. В качестве первого шага я хотел бы увидеть, есть ли способ просто улучшить интерпретатор байт-кода, прежде чем я решусь на компиляцию машинного кода.

Основной цикл интерпретатора выглядит следующим образом:

while(true)
{
  uint8_t cmd = *code++;
  switch( cmd )
  {
    case op_1: ...; break;
    ...
  }
}

ВОПРОС: Есть ли более быстрый способ реализовать этот цикл без использования ассемблера?

Я вижу один вариант, специфичный для GCC, для использования динамического перехода с адресами меток. Вместо перерыва в конце каждого кейса я мог сразу перейти к следующей инструкции. Я надеялся, что оптимизатор сделает это за меня, но, глядя на разборку, очевидно, что нет: в конце большинства op_codes есть повторяющийся постоянный переход.

Если уместно, виртуальная машина представляет собой простую машину на основе регистров с плавающей точкой. точечные и целочисленные регистры (по 8 штук). Нет стека, только глобальная куча (этот язык не такой уж сложный).

5
задан edA-qa mort-ora-y 11 April 2011 в 13:27
поделиться