我创建了简单的虚拟机,并且为了创建指令字节和开关,我使用 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 个整数和 2 个浮点数 - 以及 4 个函数,它的 10*10*4 行代码),但将来我想移动它是不支持宏的语言(我在考虑 c# 或 Java)。我想出的唯一想法是制作代码生成器,它将生成代码以粘贴到 vm 代码中,但是代码将不可读,并且很难更改和维护。也许你有一些很棒的想法要分享?:)