Уменьшить размер оператора switch в эмуляторе?
Я начал писать эмулятор DCPU-16, используя эту спецификацию v1.7. Я начал разрабатывать архитектуру, и мне не нравится тот факт, что я использую очень длинные операторы switch. Я впервые пишу эмулятор, и поэтому я не знаю, есть ли лучший способ сделать это. Хотя переключатели не такие большие, из-за небольшого количества кодов операций DCPU (и того факта, что я еще не реализовал инструкции), я могу себе представить, если бы я писал эмулятор для более крупной инструкции, задающей операторы switch будет огромным
В любом случае, вот мой код.
РЕДАКТИРОВАТЬ: Я забыл передать свой вопрос:
- Есть ли лучший способ создать эмулятор, чем использовать массивный коммутатор?
1 ответ
Этот подход кажется мне разумным. Это, конечно, то, как я бы это сделал (я написал несколько эмуляторов процессора и подобных типов кода).
Ближайшая альтернатива - это набор указателей на функции, но некоторые из ваших случаев, вероятно, будут довольно простыми (например, cpu_regs.flags &= ~CARRY
или же if (cpu_regs.flags & CARRY) do_rel_jump(next_byte());
, поэтому использование указателей на функции замедлит вас.
Вы можете объединить все "Операция не указана" в одном месте, что значительно сократит количество строк, но количество случаев, конечно, останется прежним [если вы не введете его в default:
].