Ja, das wird alles zerlegt, weil sich solche kleinen elementaren Operationen einfach sehr fix erledigen lassen. Wenn Du den Term nämlich live erst noch auseinanderpfrimeln mußt, dauert das natürlich sehr viel länger. Daher wird der Bytecode so aufgebaut, daß Dein Interpreter im Grunde nichts "denken" muß, er muß einfach nur "machen": Einen Opcode einlesen, und danach sofort wissen, wie viele von den nachfolgenden Bytes er lesen muß und was er mit denen dann anfangen soll.
(Die Fragen sind auch nicht lächerlich, wenn Du bisher noch nie mit Assembler oder so zu tun hattest, dann ist das völlig verständlich, daß das eine "neue Welt" für Dich ist)
Dein kleines Beispiel ist jetzt supoptimal, da es hier eh nur Konstanten gibt. Sowas würde beim Kompilieren natürlich sofort in eine einzige Konstante verwandelt
Nehmen wir mal sowas hier:
Das könnte dann z.B. erstmal so aussehen:
Code: Alles auswählen
SET ?VAR1 20
SET ?VAR2 37
SET REG1 ?VAR1
MUL REG1 5
ADD ?VAR2 REG1
REG1 entspräche jetzt z.B. einer Art Register.
Die Variablennamen stehen, wie Du siehst, auch noch drin, aber diese würdest Du dann später durch absolute Adressen ersetzen.
Hier ist jetzt übrigens auch ein gutes Beispiel für verschiedene Opcodes dabei: Sagen wir mal, Dein virtueller Prozessor hat nur 4 Register, REG1-4 also, dann könntest Du für "MUL mit einem Register" 4 Opcodes einführen, z.B. 40 für MUL mit REG1, 41 für MUL mit REG2, usw., somit würdest Du wieder einen Parameter sparen und müßtest beim Ausführen das Register nicht erst auslesen. Du brauchst natürlich dann noch mindestens einen 5. Opcode für "MUL mit Adresse", dort werden dann natürlich 2 Parameter hinter den Opcode gesetzt.
Am sinnvollsten ist es wohl, das Skript erstmal in solch einen Klartext-Assembler-Code zu übersetzen (wo dann auch z.B. MUL REG1 5 steht), welcher dann in einem zweiten Schritt endgültig in den Bytecode übersetzt wird (dort kann dann ein MUL REG1 5 zu einem MULREG1 5 werden, also 1 Opcode-Byte und ein Parameter).
Du solltest Dir echt mal den Java-Bytecode anschauen, der ist ja nicht für einen echten Prozessor gemacht sondern für einen virtuellen, daher ist der sicherlich auch etwas anders aufgebaut als x86-Maschinencode. Vielleicht hilft Dir das, was eigenes zu entwerfen. Anfangs kann es ja auch noch simpel und straightforward sein, später kannst Du es ja immernoch komplexer und optimierter machen.