@ts-soft
mein ziel ist es halt einen schnellen Interpreter zu schreiben und dafür nehme ich das in kauf es sind ja immerhin 20-30% im Beispiel.
STARGÅTE hat geschrieben:Also das Select:Case langsammer ist ist klar.
Das ein Call ohne Parameter und Rückgabe wert schneller ist, ist auch klar.
Die Frage die sich mir stellt ist:
Wie verwaltest du bzw. wie erzeugst nun dann deine Byte-Sequenz, in der dann die Jumps aufgerufen werden.
Du musst ja irgendwie auch die Operationen alle einzeln haben.
Das heißt, um A+B zu rechnen, musst du ja A und B setzen und dann auch das Ergebnis wieder irgenwie zurück geben.
Genau das macht ja n Prozedure dnan auch.
In deinem Fall benutzt du ja dieses "a". Was machst du aber nun wenn du "tiefere" Rechnungen hast. Beispiel:
(A+B)*(C+D)
Hier musst du ja irgendwie A+B und C+D "sichern" um dann zu multiplizieren.
Hier gehts halt nicht, das du immer zum ergebnis etwas dazu addierst/multiplizierst usw.
Bis jetzt ist deine Variante schneller, aber ich vermute, das du schnell noch sachen dazu schreiben musst, und du dann an die Geschwindigkeit von Prozeduren rankommst.
Ok dann versuche ich mal zu erklären wie mein Interpreter arbeitet.
nehmen wir als Beispielcode "debug (A+B)*(C+D)"
mein Compiler würde das erst so umwandeln:
Code: Alles auswählen
tempvariable2=C+D
tempvariable1=A+B
tempvariable1*tempvariable2
debug tempvariable1
End
später beim ausführen steht es dann so im speicher:
Word [65]
Integer [pointer zu variable/wert 1]
Integer [pointer zu variable/wert 2]
Integer [pointer zu variable/wert 3]
;65 ist der bytecode für (=+) einer variable erst einen wert zuweisen und anschließend noch einen wert addieren was "tempvariable2=C+D" enspricht
Word [65]
Integer [pointer zu variable/wert 1]
Integer [pointer zu variable/wert 2]
Integer [pointer zu variable/wert 3]
; > tempvariable1=A+B
Word [14]
Integer [pointer zu variable/wert 1]
Integer [pointer zu variable/wert 2]
; 14: einen wert mit einem anderen multiplizieren > tempvariable1*tempvariable2
Word [40]
Integer [pointer zu variable/wert 1]
; 40 ist Debug einen wert ausgeben -> debug tempvariable1
Word [5]
; 5 ist End
mein Interpreter arbeitet es dann nacheinander ab.
ungefähr so:
Code: Alles auswählen
repeat
code=Peekw(*position) :*position+2
select code
case 5
break
case 14; *
pointer1=peeki(*position):*position+sizeof(intger)
pointer2=peeki(*position):*position+sizeof(intger)
poke(pointer1,peek(pointer1)*peek(pointer2))
case 40; debug
wert=peek(*position):*position+sizeof(intger)
debug wert
case 65
pointer1=peeki(*position):*position+sizeof(intger)
pointer2=peeki(*position):*position+sizeof(intger)
pointer3=peeki(*position):*position+sizeof(intger)
poke(pointer1,peek(pointer2)+peek(pointer3))
default
break
endselect;(select/case hab ich ja jetzt durch JMP/CALL ersetzt. Ist hier nur zum einfacheren Verständnis)
forever
Das ist jetzt natürlich extrem zusammengefasst da ja auch noch überall der Variablentyp beachtet werden muss usw...
Ich hoffe das hat dir geholfen zu verstehen wie mein Programm arbeitet.
Und noch als Hinweis mein Programm ist schon "fertig" ich möchte es jetzt nur noch so schnell wie möglich machen.
__________________________________________________
Code-Tags hinzugefügt
03.07.2011
RSBasic