ich ein Gameboy-Emulator in JavaScript geschrieben habe und ich Makros für CPU-Emulation simulieren auf diese Weise:
Makrocode (die Funktion einen String mit dem Makrocode zurückgibt):
function CPU_CP_A(R,C) { // this function simulates the CP instruction,
return ''+ // sets CPU flags and stores in CCC the number
'FZ=(RA=='+R+');'+ // of cpu cycles needed
'FN=1;'+
'FC=RA<'+R+';'+
'FH=(RA&0x0F)<('+R+'&0x0F);'+
'ICC='+C+';';
}
die Verwendung von „Makro“, so wird der Code generiert „on the fly“ und wir brauchen nicht zu Funktionsaufrufe zu machen oder für jede istruction viele wiederholten Code schreiben ...
OP[0xB8]=new Function(CPU_CP_A('RB',4)); // CP B
OP[0xB9]=new Function(CPU_CP_A('RC',4)); // CP C
OP[0xBA]=new Function(CPU_CP_A('RD',4)); // CP D
OP[0xBB]=new Function(CPU_CP_A('RE',4)); // CP E
OP[0xBC]=new Function('T1=HL>>8;'+CPU_CP_A('T1',4)); // CP H
OP[0xBD]=new Function('T1=HL&0xFF;'+CPU_CP_A('T1',4)); // CP L
OP[0xBE]=new Function('T1=MEM[HL];'+CPU_CP_A('T1',8)); // CP (HL)
OP[0xBF]=new Function(CPU_CP_A('RA',4)); // CP A
Jetzt w e kann emulierten Code wie folgt aus:
OP[MEM[PC]](); // MEM is an array of bytes and PC the program counter
Hoffe, es hilft ...
Falsch! James, bitte lesen Sie diese Frage: http: //stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea#87260 und validieren Sie Ihre Meinungen, bevor Sie irreführende Aussagen machen. Die an ein eval übergebene Zeichenfolge muss bei jedem Aufruf des evals geparst/interpretiert werden! – Ash
Ja, die an eval übergebene Zeichenkette muss jedes Mal geparst werden, wenn eval aufgerufen wird - aber auch jede andere Zeile von javascript. so arbeiten Dolmetscher. Wie für die Antwort auf Sie verlinkt, hat er nie Geschwindigkeit erwähnt, nur –
„viel einfacher als auch weniger potenziell Buggy zu lesen:“ Ich werde zugeben, dass dies möglicherweise mit Javascript der Fall gewesen sein mag in Browsern sagen um 2000, aber heute gibt Es werden ernsthafte Optimierungen auf den JavaScript-Code angewendet (dh nicht evaluiert) und dies wird nur fortgesetzt. Code in einer Zeichenfolge in einer beliebigen Sprache kann auch nicht annähernd optimiert werden. – Ash