Я создал простую виртуальную машину, и для создания байтов инструкций и переключения я использую макросы c ++, это выглядит так (это упрощенный пример):
typedef t_sint_b32 int;
typedef t_sint_b16 short;
(...)
typedef t_sfloat_b32 float;
enum InstructionOpSize{b8,b16,b32,b64};
enum InstructionOpSign{s, u};
enum InstructionOpType{int_, float_};
enum InstructionFunc{MOV, ADD, SUB, ...};
#define CreateInstruction(size1, sign1, type1, size2, ...) ((size1) | (sign1 << 3) | (type1 << 4) | ...)
#define CASE_INSTRUCTION(size1, sign1, type1, size2, ..., operation) case CreateInstruction(size1, sign1, type1, size2, ...): ((t_##sign1##type1##size1) ARG1) operation ((t_##sign2##type2##size2) ARG2); break;
#define MULTI_CASE(size1, sign1, type1, ...)\
CASE_INSTRUCTION(size1, sign1, type1, b8, u, int_,...);\
(...)
CASE_INSTRUCTION(size1, sign1, type1, b64, s, float_,...);
#define MULTI_MULTI_CASE(...)\
MULTI_CASE(b8, u, int_,..);\
(...)
MULTI_CASE(b64, s, float_,..);
И тут есть огромный переключатель:
switch(opcode){
MULTI_MULTI_CASE(ADD, +=);
MULTI_MULTI_CASE(SUB, -=);
MULTI_MULTI_CASE(MUL, *=);
(...)
}
Как вы можете видеть, есть много кода, сгенерированного без особых усилий (всего 10 типов переменных - 8 int и 2 float - и 4 функции - это 10 * 10 * 4 строки кода), но в будущем я бы хотел бы переместить его на язык, не поддерживающий макросы (я думаю о c # или Java). Единственная идея, которую я придумал, - создать генератор кода, который будет генерировать код для вставки в код vm, но тогда код не будет читабельным, и будет сложно изменить и сохранить. Может быть, у вас есть отличные идеи, чтобы поделиться? :)