1

我创建了简单的虚拟机,并且为了创建指令字节和开关,我使用 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 代码中,但是代码将不可读,并且很难更改和维护。也许你有一些很棒的想法要分享?:)

4

1 回答 1

1

一种选择是转移到外部宏处理器(例如 M4),然后将其作为构建过程的一部分,在编译之前生成宏扩展版本。基本上,您只需从 C 预处理器转移到外部预处理器(例如 M4)。

另一种选择是手动重构代码:)

于 2011-04-20T16:50:19.513 回答