[Tutorial] Compiler und Virtual Machine

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
puretom
Beiträge: 109
Registriert: 06.09.2013 22:02

Re: [Tutorial] Compiler und Virtual Machine

Beitrag von puretom »

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?
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
Benutzeravatar
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

Beitrag von ts-soft »

So, hier ein Beispiel, wie man den String ohne Peeks aus dem Speicher liest.
Wenn Du das verstehst, wird alles schön :wink:

Code: Alles auswählen

str.s = "Hallo"
*str = @str
*mem.String = @*str
Debug *mem\s
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.
Bild
puretom
Beiträge: 109
Registriert: 06.09.2013 22:02

Re: [Tutorial] Compiler und Virtual Machine

Beitrag von puretom »

Ganz lieben Dank ts-soft!

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)

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.
  • 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
Benutzeravatar
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

Beitrag von ts-soft »

puretom hat geschrieben:[*]Ist die Pointerversion als solches wirklich so viel schneller als PeekS() und PeekL() usw. ?
Das solltest Du Dir eigentlich beantworten können :wink:
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.
Bild
Benutzeravatar
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

Beitrag von ts-soft »

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
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.
Bild
puretom
Beiträge: 109
Registriert: 06.09.2013 22:02

Re: [Tutorial] Compiler und Virtual Machine

Beitrag von puretom »

Danke für den Tipp!

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
Benutzeravatar
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

Beitrag von ts-soft »

puretom hat geschrieben:Machst du das konsequent immer so?
Ich mach das in allen Proceduren, die wiederverwendbar sein sollen, in Modulen, Includes und UserLibraries-Sources sowieso.
puretom hat geschrieben: Und auf einen Pointer?

also:

*SourceFile = CreateFile(#PB_Any, Dateiname$ )
Das kannst Du halten wie ein Dachdecker. Ob Integer oder Pointer hat keine Auswirkungen, dabei geht es mehr um die Ethik.

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.
Bild
puretom
Beiträge: 109
Registriert: 06.09.2013 22:02

Re: [Tutorial] Compiler und Virtual Machine

Beitrag von puretom »

Das werde ich mal glatt bei Gelegenheit ändern!

Ich arbeite nämlich gerade im Schweiße meines Angesichts :wink: an meiner Virtual Machine!

Falls ich vergesse, bitte erinnere mich nochmal :oops: !

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
puretom
Beiträge: 109
Registriert: 06.09.2013 22:02

Re: [Tutorial] Compiler und Virtual Machine

Beitrag von puretom »

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?
Global Dim *RetStack(10000)
Der Compiler akzeptiert es problemlos, doch ich frage mich:
  • Ist das jetzt ein Array of Integers, das als Namensbestandteil ein * vorne hat?
  • Oder ist das jetzt ein Array of Pointers?
Was ist der Unterschied für mich bzw. warum grüble ich darüber nach?

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
Benutzeravatar
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

Beitrag von ts-soft »

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.
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.
Bild
Antworten