Ik ben bezig met een interpreter van een bytecode taal in Visual C en loop hierbij tegen het volgende probleem aan.
Ik heb alle bytecodes in een array staan, aan de hand van een 2e array met per bytecode een funtie die de acties behorende bij die bytecode uitvoert.
Nu is het callen van een functie per bytecode natuurlijk nogal duur (er moet natuurlijk wel performance inzitten
).
Ik dacht het zo op te kunnen lossen, door de array met functie-adressen te vervangen door een array met adressen van labels, en daar dan met een goto naartoe te springen, en dan na de bytecode-emulatie de volgende bytecode uit de array te vissen, en daar naartoe te springen.
dus (code geleend uit een thesis over de Java VM (sableVm)
het probleem:
Dit werkt natuurlijk netjes in GCC die daarvoor een uitbreiding heeft, maar voor Visual C++ heb ik nog een oplossing kunnen bedenken c.q. vinden.
Iemand een idee hoe het zou kunnen?
Ik heb alle bytecodes in een array staan, aan de hand van een 2e array met per bytecode een funtie die de acties behorende bij die bytecode uitvoert.
Nu is het callen van een functie per bytecode natuurlijk nogal duur (er moet natuurlijk wel performance inzitten
Ik dacht het zo op te kunnen lossen, door de array met functie-adressen te vervangen door een array met adressen van labels, en daar dan met een goto naartoe te springen, en dan na de bytecode-emulatie de volgende bytecode uit de array te vissen, en daar naartoe te springen.
dus (code geleend uit een thesis over de Java VM (sableVm)
C:
1
2
3
4
5
6
7
8
9
10
11
| void *code[] = { &&ICONST_2, &&ICONST_2, &&ICONST_1, &&IADD, ... } void **pc = code; /* dispatch first instruction */ goto **(pc++); /* implementations */ ICONST_1: *sp++ = 1; goto **(pc++); ICONST_2: *sp++ = 2; goto **(pc++); IADD: --sp; sp[-1] += *sp; goto **(pc++); |
het probleem:
Dit werkt natuurlijk netjes in GCC die daarvoor een uitbreiding heeft, maar voor Visual C++ heb ik nog een oplossing kunnen bedenken c.q. vinden.
Iemand een idee hoe het zou kunnen?