Ich möchte eine virtuelle Maschine als plattformunabhängige Methode zum Ausführen von Spielcode (im Wesentlichen Skripting) erstellen.
Die virtuellen Maschinen, die mir in Spielen bekannt sind, sind ziemlich alt: Infocoms Z-Machine , LucasArts SCUMM und Quake 3 von id Software . Als .NET-Entwickler bin ich mit der CLR vertraut und habe in den CIL-Anweisungen nachgeschlagen , um einen Überblick darüber zu erhalten, was Sie tatsächlich auf einer VM-Ebene implementieren (im Vergleich zur Sprachebene). Ich habe mich im letzten Jahr auch ein wenig mit 6502 Assembler beschäftigt .
Die Sache ist, jetzt, wo ich eine implementieren möchte, muss ich ein bisschen tiefer graben. Ich weiß, dass es stapelbasierte und registrierungsbasierte VMs gibt, aber ich weiß nicht wirklich, welche besser in was ist und ob es mehr oder hybride Ansätze gibt. Ich muss mich mit der Speicherverwaltung befassen, entscheiden, welche Low-Level-Typen Teil der VM sind, und verstehen, warum Dinge wie ldstr so funktionieren.
Mein einziges Nachschlagewerk (abgesehen vom Z-Machine-Material) ist der CLI Annotated Standard , aber ich frage mich, ob es eine bessere, allgemeinere / grundlegendere Vorlesung für VMs gibt. Grundsätzlich so etwas wie das Dragon Book , aber für VMs? Ich bin mir der Kunst der Computerprogrammierung von Donald Knuth bewusst, die eine registergestützte VM verwendet, aber ich bin mir nicht sicher, wie zutreffend diese Serie noch ist, zumal sie noch unvollendet ist.
Erläuterung: Ziel ist es, eine spezialisierte VM zu erstellen. Infocoms Z-Machine enthält beispielsweise OpCodes zum Einstellen der Hintergrundfarbe oder zum Abspielen eines Sounds. Ich muss also herausfinden, wie viel OpCodes in die VM fließt, im Gegensatz zu dem Compiler, der ein Skript (Sprache TBD) verwendet und daraus den Bytecode generiert, aber dafür muss ich verstehen, was ich wirklich tue.
¹ Ich weiß, die moderne Technologie würde es mir ermöglichen, eine hochwertige Skriptsprache im laufenden Betrieb zu interpretieren. Aber wo ist der Spaß dabei? :) Es ist auch ein bisschen schwer zu googeln, da Virtual Machines heutzutage häufig mit VMWare-artiger Betriebssystemvirtualisierung in Verbindung gebracht werden ...
do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);
dann vielleicht ein compiler ... und dann geht der
Quake 3
eine virtuelle Maschine?