Pisałem emulator gameboy w javascript i symulować makr dla emulacji procesora w ten sposób:
makro kodu (funkcja zwraca ciąg znaków z kodu makra):
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+';';
}
Używanie „makro”, więc kod generowany jest „w locie” i nie musimy, aby funkcja zwraca do niego lub napisać dużo kodu powtórzyć dla każdego istruction ...
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
teraz w e może wykonać kod emulowane tak:
OP[MEM[PC]](); // MEM is an array of bytes and PC the program counter
Nadzieja to pomaga ...
Wrong! James, przeczytaj na ten temat: http: //stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea#87260 i zatwierdź swoje opinie, zanim zaczniesz wprowadzać w błąd. Ciąg przekazywany do eval musi być analizowany/interpretowany za każdym razem, gdy wywoływany jest eval! – Ash
Tak, ciąg przekazywany do eval musi być analizowany za każdym razem, gdy wywoływana jest funkcja eval - ale tak samo musi być każda inna linia javascript. tak działają tłumacze. Jeśli chodzi o odpowiedź, z którą się łączysz, nigdy nie wspomina o szybkości, po prostu "dużo łatwiejsza do odczytania, a także mniej potencjalnie błędna" –
Zapewniam, że prawdopodobnie tak było w przypadku JavaScript w przeglądarkach powiedzmy około 2000, ale dzisiaj tam są poważne optymalizacje stosowane do zwykłego kodu Javascript (tj. nie-eval'd), a to będzie kontynuowane. Kod w ciągu znaków w dowolnym języku nie może być zoptymalizowany również w pobliżu. – Ash