PureBoard
http://forums.purebasic.com/german/

[Tutorial] Compiler und Virtual Machine
http://forums.purebasic.com/german/viewtopic.php?f=9&t=27222
Seite 9 von 10

Autor:  puretom [ 21.10.2013 20:26 ]
Betreff des Beitrags:  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?

Autor:  ts-soft [ 21.10.2013 21:05 ]
Betreff des Beitrags:  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 :wink:
Code:
str.s = "Hallo"
*str = @str
*mem.String = @*str
Debug *mem\s


Gruß
Thomas

Autor:  puretom [ 21.10.2013 21:35 ]
Betreff des Beitrags:  Re: [Tutorial] Compiler und Virtual Machine

Ganz lieben Dank ts-soft!

Das habe ich daraus gemacht (ohne Debug-Sachen):

Code:
     
              *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

Autor:  ts-soft [ 21.10.2013 21:53 ]
Betreff des Beitrags:  Re: [Tutorial] Compiler und Virtual Machine

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

Autor:  ts-soft [ 25.10.2013 17:33 ]
Betreff des Beitrags:  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

Autor:  puretom [ 25.10.2013 18:06 ]
Betreff des Beitrags:  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$ )

Autor:  ts-soft [ 25.10.2013 18:21 ]
Betreff des Beitrags:  Re: [Tutorial] Compiler und Virtual Machine

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

Autor:  puretom [ 25.10.2013 18:34 ]
Betreff des Beitrags:  Re: [Tutorial] Compiler und Virtual Machine

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

Autor:  puretom [ 25.10.2013 21:54 ]
Betreff des Beitrags:  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?

Zitat:
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!

Autor:  ts-soft [ 25.10.2013 22:07 ]
Betreff des Beitrags:  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.

Seite 9 von 10 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/