[Tutorial] Compiler und Virtual Machine
Re: [Tutorial] Compiler und Virtual Machine
Sie müssen nicht zwingend NICHT nullterminiert sein, das ist in Windeseile geändert.
Genau genommen waren sie noch vor ca. 30 Minuten nullterminiert!
Spiele gerade verschiedene Designstudien parallel durch.
LG Thomas
Edit:
Das Einzige, was ich vermeiden möchte, ist, dass die VM zur LAUFZEIT die Länge des Strings für *PC+LÄNGE DES STRINGS berechnen muss, --> Speed.
Deshalb habe ich das mit dem Voranstellen der Stringlänge so gemacht.
Andere Möglichkeit wäre dann ein String-Konstanten-Pool, dann bleibt hier *PC+4 konstant für einen Long-Zahlen-Paramenter (=String Index). Aber den muss ich beim Laden trennen, das ist zusätzlicher Aufwand für einen Lader.
Man sieht, es gibt Pros und Kons für verschiedenste Varianten.
Wie löst ihr das?
Genau genommen waren sie noch vor ca. 30 Minuten nullterminiert!
Spiele gerade verschiedene Designstudien parallel durch.
LG Thomas
Edit:
Das Einzige, was ich vermeiden möchte, ist, dass die VM zur LAUFZEIT die Länge des Strings für *PC+LÄNGE DES STRINGS berechnen muss, --> Speed.
Deshalb habe ich das mit dem Voranstellen der Stringlänge so gemacht.
Andere Möglichkeit wäre dann ein String-Konstanten-Pool, dann bleibt hier *PC+4 konstant für einen Long-Zahlen-Paramenter (=String Index). Aber den muss ich beim Laden trennen, das ist zusätzlicher Aufwand für einen Lader.
Man sieht, es gibt Pros und Kons für verschiedenste Varianten.
Wie löst ihr das?
Windows 7 und Windows 10 (Laptop), PB 5.62 | Projekt: Tutorial - Compiler und Virtual Machine | vielleicht einmal ein Old School Text-Adventure Tutorial | Neu: Spielereien, Üben rund um OOP in PB
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: [Tutorial] Compiler und Virtual Machine
So, hier ein Beispiel, wie man den String ohne Peeks aus dem Speicher liest.
Wenn Du das verstehst, wird alles schön
Gruß
Thomas
Wenn Du das verstehst, wird alles schön
Code: Alles auswählen
str.s = "Hallo"
*str = @str
*mem.String = @*str
Debug *mem\s
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: [Tutorial] Compiler und Virtual Machine
Ganz lieben Dank ts-soft!
Das habe ich daraus gemacht (ohne Debug-Sachen):
Wir haben hier einen 0-terminierten String, der aber davor trotzdem noch die Länge gespeichert hat.
Warum? Weil ich in der letzten Zeile die sLen (String Lenght) zum *PC rechnen muss und zur RUNTIME NICHT LEN(*sPara\s) machen will.
Das wäre zu meiner Version also bloß 1 Byte mehr, bei - glaube ich zumindest - mehr Performace der VM.
LG Puretom
Das habe ich daraus gemacht (ohne Debug-Sachen):
Code: Alles auswählen
*PC+4 ; PC auf String-Länge
sLen=*PC\l ; - holen
*PC+4 ; PC auf String
*str = *PC ; - mit einem Pointer
*sPara.String = @*str ; - kompliziert holen ;-))
sPush(*sPara\s) ; String auf Operanden-Stack
*PC+sLen-3 ; PC auf nächsten Opcode (nur -3 wg. 0-Byte)
Warum? Weil ich in der letzten Zeile die sLen (String Lenght) zum *PC rechnen muss und zur RUNTIME NICHT LEN(*sPara\s) machen will.
Das wäre zu meiner Version also bloß 1 Byte mehr, bei - glaube ich zumindest - mehr Performace der VM.
- Ist die Pointerversion als solches wirklich so viel schneller als PeekS() und PeekL() usw. ?
LG Puretom
Windows 7 und Windows 10 (Laptop), PB 5.62 | Projekt: Tutorial - Compiler und Virtual Machine | vielleicht einmal ein Old School Text-Adventure Tutorial | Neu: Spielereien, Üben rund um OOP in PB
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: [Tutorial] Compiler und Virtual Machine
Das solltest Du Dir eigentlich beantworten könnenpuretom hat geschrieben:[*]Ist die Pointerversion als solches wirklich so viel schneller als PeekS() und PeekL() usw. ?
Peek und Poke sind Funktionen, mit Werten auf Stack, Stack bereinigen usw., bei den Pointern wird direkt der Wert
gelesen oder geschrieben. Nicht die länge des Codes ist entscheidend, Poke und Peek scheinen nur kürzer!
Nur der String bedarf einer Extrawurscht, da die Adresse der Variable lediglich die Adresse zum String enthält und nicht
den String.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: [Tutorial] Compiler und Virtual Machine
Fällt mir gerade auf, Du verwendest feste IDs für Dateien usw., das ist ungünstig, weil im Code, der vor dem "Compilieren" ausgeführt wird,
könnte ja bereits eine z.B. Datei mit der ID geöffnet worden sein und nicht geschlossen.
Ich würde in Modulen, genauso wie in Includes, UserLibraries usw. nur mit #PB_Any arbeiten.
Gruß
Thomas
könnte ja bereits eine z.B. Datei mit der ID geöffnet worden sein und nicht geschlossen.
Ich würde in Modulen, genauso wie in Includes, UserLibraries usw. nur mit #PB_Any arbeiten.
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: [Tutorial] Compiler und Virtual Machine
Danke für den Tipp!
Machst du das konsequent immer so?
Und auf einen Pointer?
also:
*SourceFile = CreateFile(#PB_Any, Dateiname$ )
Machst du das konsequent immer so?
Und auf einen Pointer?
also:
*SourceFile = CreateFile(#PB_Any, Dateiname$ )
Windows 7 und Windows 10 (Laptop), PB 5.62 | Projekt: Tutorial - Compiler und Virtual Machine | vielleicht einmal ein Old School Text-Adventure Tutorial | Neu: Spielereien, Üben rund um OOP in PB
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: [Tutorial] Compiler und Virtual Machine
Ich mach das in allen Proceduren, die wiederverwendbar sein sollen, in Modulen, Includes und UserLibraries-Sources sowieso.puretom hat geschrieben:Machst du das konsequent immer so?
Das kannst Du halten wie ein Dachdecker. Ob Integer oder Pointer hat keine Auswirkungen, dabei geht es mehr um die Ethik.puretom hat geschrieben: Und auf einen Pointer?
also:
*SourceFile = CreateFile(#PB_Any, Dateiname$ )
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: [Tutorial] Compiler und Virtual Machine
Das werde ich mal glatt bei Gelegenheit ändern!
Ich arbeite nämlich gerade im Schweiße meines Angesichts an meiner Virtual Machine!
Falls ich vergesse, bitte erinnere mich nochmal !
LG Thomas
Ich arbeite nämlich gerade im Schweiße meines Angesichts an meiner Virtual Machine!
Falls ich vergesse, bitte erinnere mich nochmal !
LG Thomas
Windows 7 und Windows 10 (Laptop), PB 5.62 | Projekt: Tutorial - Compiler und Virtual Machine | vielleicht einmal ein Old School Text-Adventure Tutorial | Neu: Spielereien, Üben rund um OOP in PB
Re: [Tutorial] Compiler und Virtual Machine
Hi Leute!
Ich würde gerne in ein Array, das mein Return-Stack wird, nur Pointer speichern.
Nach einem Gosub speichert die VM da drin den alten Program Counter (*PC), der eben selber schon ein Pointer in eine Memory-Zelle ist.
Wird das so (siehe Code) was?
Ich GLAUBE gelesen zu haben irgendwo, dass man sich beim Typ Pointer darauf verlassen könne, dass er vom Typ (also 4 Byte, 8 Byte usw.) immer dem entsprechenden Adressierungsraum meines verwendeten Betriebssystems (32 Bit, 64 Bit, ... bzw. der dazu passenden Pure Basic Compilerversion) entsprechen würden. Das trifft zwar für Integer auch zu, aber irgendwo habe ich mal eine Diskussion gelesen, denke ich, wo da ein Unterschied gemacht wurde!
Danke für eure Hilfe!
Ich würde gerne in ein Array, das mein Return-Stack wird, nur Pointer speichern.
Nach einem Gosub speichert die VM da drin den alten Program Counter (*PC), der eben selber schon ein Pointer in eine Memory-Zelle ist.
Wird das so (siehe Code) was?
Der Compiler akzeptiert es problemlos, doch ich frage mich:Global Dim *RetStack(10000)
- Ist das jetzt ein Array of Integers, das als Namensbestandteil ein * vorne hat?
- Oder ist das jetzt ein Array of Pointers?
Ich GLAUBE gelesen zu haben irgendwo, dass man sich beim Typ Pointer darauf verlassen könne, dass er vom Typ (also 4 Byte, 8 Byte usw.) immer dem entsprechenden Adressierungsraum meines verwendeten Betriebssystems (32 Bit, 64 Bit, ... bzw. der dazu passenden Pure Basic Compilerversion) entsprechen würden. Das trifft zwar für Integer auch zu, aber irgendwo habe ich mal eine Diskussion gelesen, denke ich, wo da ein Unterschied gemacht wurde!
Danke für eure Hilfe!
Windows 7 und Windows 10 (Laptop), PB 5.62 | Projekt: Tutorial - Compiler und Virtual Machine | vielleicht einmal ein Old School Text-Adventure Tutorial | Neu: Spielereien, Üben rund um OOP in PB
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: [Tutorial] Compiler und Virtual Machine
Naja, pointer als Arraytyp ist nicht offiziell dokumentiert. Es funktioniert zwar und das Array wird auch reserviert, ich
würde aber in diesem Fall eher Integer nehmen, weil das könnte mit der nächsten Version von PB evtl. verboten werden.
Ansonsten, Pointer und Integer passen sich der nativen Registerbreite des Compilers an, also entweder 32 oder 64 Bit.
Pointer in ein IntegerArray sollte kein Problem sein.
Gruß
Thomas
// edit
PS: Du solltest EnableExplicit in den Modulen nutzen, z.B. bei der Umstellung auf #PB_Any hast Du File als Variable
eingeführt. Ohne Deklaration wird es schwer zu erkennen, ist das Global oder Lokal in der Procedure.
Also ein Protected File am beginn der Procedure gibt einem gleich den notwendigen Hinweis, ausserdem vermeidet
EnableExplicit auch weitere Fehler.
würde aber in diesem Fall eher Integer nehmen, weil das könnte mit der nächsten Version von PB evtl. verboten werden.
Ansonsten, Pointer und Integer passen sich der nativen Registerbreite des Compilers an, also entweder 32 oder 64 Bit.
Pointer in ein IntegerArray sollte kein Problem sein.
Gruß
Thomas
// edit
PS: Du solltest EnableExplicit in den Modulen nutzen, z.B. bei der Umstellung auf #PB_Any hast Du File als Variable
eingeführt. Ohne Deklaration wird es schwer zu erkennen, ist das Global oder Lokal in der Procedure.
Also ein Protected File am beginn der Procedure gibt einem gleich den notwendigen Hinweis, ausserdem vermeidet
EnableExplicit auch weitere Fehler.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.