In AutoIt wird der lesbare Code in Tokens zerlegt, das sind u.A. die einzelnen Funktionsnamen, Strings, Zahlen, Variablenname, Keywords, Operatoren (+ - , [ ...) Diese Tokenliste wird dann Stück für Stück eingelesen, dabei muss aber während der Ausführung bestimmt werden, in welcher Reihenfolge die Befehle ausgeführt werden.
Beispiel
7*(5+3)
[/autoit]
wird sozusagen in die Tokens
- Zahl: 7
- Multiplikation
- Klammer auf
- Zahl: 5
- Plus
- Zahl: 3
- Klammer zu
zerlegt. Beim Ausführen muss der Interpreter daraus die richtie Reihenfolge der Berechnung bestimmen.
Lua z.B. hat eine assemblerähnliche Sprache, in die das erstmal übersetzt und dann in bytecode weiterumgewandelt wird. Dieser Bytecode wird dann interpretiert.
Dadurch kann Befehl für Befehl abgearbeitet werden und der Interpreter muss nicht mehr die Reihenfolge bestimmen.
Beispiel
7*(5+3)
[/autoit]
wird umgewandelt zu
- Addiere 5 und 3
- Multipliziere Ergebnis mit 7
Zudem verhalten sich die lokalen Variablen anders. In AutoIt gibt es eine Liste mit Variablennamen und Werten, die bei jedem Verwenden einer Variable durchsucht werden muss. In Lua werden die lokalen Variablen zu Indices auf dem Stack und können dadurch schneller wieder ausgelesen werden.
Außerdem wird Lua ein bisschen optimiert, sodass aus den 7*(5+3) vor der Ausführung der Wert 65 berechnet werden würden.
Java funktioniert so ähnlich, aber hat festgelegte Typen und wahrscheinlich ist der Optimierer hier ausschlaggebend, denn bei einer Programmanalyse würde er herausfinden, dass die innere Schleife absolut unnütz ist, denn da wird bis 100000000 gezählt, die Variable aber außerhalb dieser Schleife nie verwendet. Dazu habe ich auch etwas in den von dir verlinkten Thread geschrieben am Beispiel C++, das auch sagenhafte 0 Millisekunden gekommen ist.