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つのintと2つのfloat)と4つの関数の10 * 10 * 4行のコード)が、将来的には移動したいと思いますマクロをサポートしていない言語にそれを(私はc#またはJavaを考えています)。私が思いついた唯一のアイデアは、vmコードに貼り付けるコードを生成するコードジェネレーターを作成することでしたが、コードが読み取れなくなり、sthを変更して維持するのが困難になります。多分あなたは共有するいくつかの素晴らしいアイデアを持っていますか?:)

4

1 に答える 1

1

1つのオプションは、外部マクロプロセッサ(M4など)に移動し、それをビルドプロセスの一部にして、コンパイルする前にマクロ拡張バージョンを生成することです。基本的には、Cプリプロセッサから外部プリプロセッサ(M4など)に移動するだけです。

もう1つの方法は、コードを手動で再構築することです:)

于 2011-04-20T16:50:19.513 に答える