Naja, Teils,Teils.
Zuerst werden alles Variablen,Array,Funktions,usw. Namen wegoptimiert und durch eindeutige Nummern ersetzt um später schnellere Zugriffe zu erreichen (außer im Debugger).:
z.B.: a+b wird zu [Var:1]+[Var:7]
Komplexe Ausdrücke werden werden soweit es geht vereinfach:
z.B.: x*(12/(4-1)) wird zu x*3 und dann wir x wegoptimiert
Verschachtelungen werden in eine Baumstrucktur umgewandelt, erhalten aber nicht wie in Java eine eine eigene Zeile sondern bleiben auf einer Zeile:
z.b: x=(a+b)/12 wir Symbolisch zu SET x DIV ADD a b 12,
in weiterer Folge [Token:Set] [Var:x] [Token:ADD] [Var:a] [Var:b] [Num:12]
Also eine Struktur, aber ohne Verschachtelungen.
Das ganze passiert On-The-Fly.
d.h. beim ersten mal arbeitet der Intepreter wirklich noch
x=(a+b)/12
ab, führ es aus, und ersetzt es dann mit der optimierten Form.
Ob es bereits optimiert ist erkennt er am ersten Byte, das kennzeichnet ob es sich schon um BCode oder normalen Code handelt. Das ganze hat den Vorteil das keine längeren Ladezeiten durch zu viel Voroptimierung entstehen, der Nachteil ist aber das der ersten Durchlauf des Befehls etwas länger dauert, da er Übersetzt und Ausgeführt werden muss, aber dafür sind alle nächsten Durchläufe (spez. in Schleifen) schneller. Das hat den Vorteil das wirklich nur das übersetzt wird was auch ausgeführt wird. Ich denke dieses Verhalten ähnelt einem
JIT-Compiler, ist nur etwas primitver.
Der Bytecode ist der optimierte QuellcodeCode (da wird vorher alles in BCode übersetzt) und alle Bibliotheken zusammen in einem DBIN - Archiv verschlüsselt gespeichert.
Derzeit arbeite ich daran, Teile des Codes die nie erreicht werden (z.b. Selects/Ifs mit konstanten Werten), oder nie benötigte Variablen wegzuoptimieren, aber das ist schon etwas schwieriger, da der Programmierer ja die Variablen im Speicher ändern kann oder direkt in den Code jumpen mit GoTo (Ich glaub diese Unding der Programmierung bau ich wieder aus.

)