Programujem si scriptovaci jazyk ktory sa kompiluje do byte kodu. Samotny kod sa sklada z nasledujuceho vektora zlozeneho z tejto struktury:
struct VM_Command{ //velkosti a rozlozenie premennych je ilustracne
u_int8_t instrukcia;
u_int64_t ine_data;
};
premenna instrukcia obsahuje identyfikator (index) instrukcie. Napadli ma 2 moznosti:
1. Kazda instrukci bude reprezentovana funkciou, dalej bude vytvorene pole pointrov na funkcie ku ktorim sa bude pristupovat pomocou indexu (u_int8_t instrukcia). Tieto funkcie budu cyklicky volane z jednej hlavnej funkcie. Toto riesenie ma nevyhodu vo velkej rezii pri volani funkcii:
bool (*Instrukcia)(Threat *threat);
bool A(Threat *t){/*instukcia A*/}
bool B(Threat *t){/*instukcia B*/}
bool C(Threat *t){/*instukcia C*/}
void main(){
Threat t;
vector<VM_Command> prikazy;
Instrukcia instukcie[25];
instukcie[0] = A;
instukcie[1] = B;
instukcie[2] = C;
/*
...
*/
for(auto &i : prikazy)
instrukcie[i.instukcia](&t);
}
2. Kazda funkcia bude mat identyfikator (napr cez enum) a vykonavat sa bude priamo v hlavnej funkcii kde sa spravna cast bude vyberat cez switch:
enum Inst{ A, B, C /*...*/};
int main(){
Threat t;
vector<VM_Command> prikazy;
for(auto &i : prikazy)
switch(i.instrukcia){
case Inst::A:
//instukcia A
break;
case Inst::B:
//instukcia B
break;
/*
...
*/
}
}
V 2. casti zas neviem povedat prekladacu nech implementuje switch pomocou jump-tables.
Ktora moznost je rychlejsia, pripadne su aj ine moznosti ako to implementovat?