(Примечание: я предполагаю, что под «декодированием и диспетчеризацией» вы подразумеваете интерпретатор на основе коммутатора.)
Разница между интерпретатором на основе коммутатора и потоковым интерпретатором во время выполнения, в основном,количество выполненных переходов.
В интерпретаторе на основе коммутатора инструкции декодируются в некотором центральном местоположении, и на основе результата декодирования выполняется переход к фрагменту кода, который обрабатываетрасшифрованная инструкция.Как только этот фрагмент кода завершил интерпретацию инструкции, он возвращается к централизованному коду декодирования, который переходит к следующей инструкции.Это означает, что (по крайней мере) два прыжка выполняются за интерпретированную инструкцию.Следующий фрагмент кода C иллюстрирует, как может выглядеть такой интерпретатор:
typedef enum {
add, /* ... */
} instruction_t;
void interpret() {
static instruction_t program[] = { add /* ... */ };
instruction_t* pc = program;
int* sp = ...; /* stack pointer */
for (;;) {
switch (*pc++) {
case add:
sp[1] += sp[0];
sp++;
break;
/* ... other instructions */
}
}
}
В потоковом интерпретаторе код декодирования не централизован, а дублируется в конце каждого фрагмента кода, который обрабатываетинструкция.Это означает, что после интерпретации инструкции вместо возврата к некоторому централизованному декодирующему коду интерпретатор декодирует следующую инструкцию и сразу же переходит к ней.Эффективная реализация многопоточного кода в ANSI-C на самом деле невозможна, но расширение GCC «computed goto» работает очень хорошо для этого.Вот потоковая версия предыдущего интерпретатора:
void interpret() {
void* program[] = { &&l_add, /* ... */ };
int* sp = ...;
void** pc = program;
goto **pc; /* jump to first instruction */
l_add:
sp[1] += sp[0];
++sp;
goto **(++pc); /* jump to next instruction */
/* ... other instructions */
}
Помимо сохранения перехода, такие потоковые интерпретаторы также более эффективны, поскольку реплицированный косвенный переход (к следующей инструкции) может быть лучше предсказан современными процессорами,У Антона Эртля есть несколько интересных статей на его домашней странице , особенно под названием «Структура и производительность эффективных переводчиков», из которых были адаптированы вышеуказанные фрагменты кода.