Sto cercando di costruire una macchina virtuale come un modo indipendente dalla piattaforma per eseguire alcuni codici di gioco (essenzialmente scripting).
Le macchine virtuali di cui sono a conoscenza nei giochi sono piuttosto vecchie: Z-Machine di Infocom , SCUMM di LucasArts , Quake 3 di id Software . Come sviluppatore .net, ho familiarità con il CLR e ho consultato le istruzioni CIL per ottenere una panoramica di ciò che effettivamente implementate a livello di VM (rispetto al livello di lingua). Ho anche dilettato un po 'nel 6502 Assembler durante l'ultimo anno.
Il fatto è che ora che voglio¹ implementarne uno, ho bisogno di scavare un po 'più a fondo. So che ci sono macchine virtuali basate su stack e registrate, ma non so davvero quale sia la migliore in cosa e se ci sono approcci più o ibridi. Devo occuparmi della gestione della memoria, decidere quali tipi di basso livello fanno parte della VM e devo capire perché cose come ldstr funzionano così.
Il mio unico libro di consultazione (a parte le cose di Z-Machine) è lo standard annotato CLI , ma mi chiedo se esiste una lezione migliore, più generale / fondamentale per le macchine virtuali? Fondamentalmente qualcosa come il Dragon Book , ma per le VM? Sono a conoscenza dell'arte della programmazione informatica di Donald Knuth che utilizza una macchina virtuale basata su registro, ma non sono sicuro di quanto sia applicabile quella serie, soprattutto perché è ancora incompiuta?
Chiarimento: l'obiettivo è costruire una macchina virtuale specializzata. Ad esempio, Z-Machine di Infocom contiene OpCodes per impostare il colore di sfondo o riprodurre un suono. Quindi ho bisogno di capire quanto va nella VM come OpCodes rispetto al compilatore che prende uno script (linguaggio TBD) e genera il bytecode da esso, ma per questo ho bisogno di capire cosa sto davvero facendo.
¹ Lo so, la tecnologia moderna mi permetterebbe di interpretare al volo un linguaggio di scripting di alto livello. Ma dov'è il divertimento? :) È anche un po 'difficile google perché le macchine virtuali al giorno d'oggi sono spesso associate alla virtualizzazione del sistema operativo di tipo VMWare ...
do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);
quindi forse un compilatore ... e poi inizia il divertimento - ottimizzazione per farlo funzionare davvero
Quake 3
una macchina virtuale?