PBScript - Scriptsprache mit PureBasic-Syntax

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Hi Stargate,
so hatte gestern keine Zeit mehr, es zu testen.

Zum ersten Punkt: Ja es ist ein Bug. Normalerweise macht der Interpreter bei jeder Operation die richtige Typenumwandung. Ich hab sie nur bei der Rückgabe einer Funktion vergessen. Im ersten Beispiel interpretiert der Compiler '3.14' als Double, und speichert ihn so dann in den Bytecode. Deswegen ist dann in 'value\double' der richtige Wert. Im zweiten ist '3' ein Byte, also wäre 'value\byte' das richtige ('value\integer' funktioniert auch, da das erste byte ja 3 ist). Im letzten ist es eine Operation mit mindestens einem Double, daher auch hier 'value\double' richtig. Wird zur neuen Version gefixed.

Zum zweiten Punkt: Hm, naja, erstmal ist es eine Scriptsprache. Scriptsprachen sollte man nicht für zeitaufwändige Operationen benutzen. Das erste Problem ist, dass ich einen Funktionaufruf vorbereiten muss, also speichern, wie viele lokale Variablen es z.z. gibt, damit ich das am ende wiederherstellen kann (ähnlich dem Stack in ASM). Am Ende muss ich halt alle lokalen Variablen freigeben, und, wie gesagt, den Kontext wiederherstellen. Dieser Overhead wird es leider immer geben.
Das zweite Problem ist, dass der Interpreter nicht sooo, bzw. garnicht, optimiert ist (das könnte man noch verbessern). Also wenn er diese Zeile ausführen will, passiert folgendes:
- Zeile ausführen (Funktionsaufruf)
- Zeile ist 'ProcedureReturn'. Diese Zeile braucht einen Ausdruck (Funktionsaufruf)
- Ausdruck ist eine Konstante. Welchen Typ hat Konstante? (Funktionsaufruf) Welchen Wert hat Konstante? (Funktionsaufruf)
Somit gibt es in meinem Interpreter 4 Funktionsaufrufe, um diese Zeile ausführen zu können. Wie gesagt, daran könnte man noch arbeiten, z.b. dass der Code komplett in einer Funktion abläuft. Ob das so einfach geht, werde ich dann mal sehen.
btw.: Der Compiler optimiert schon soweit, dass er es direkt als Konstante '30' speichert.

Es hat mich aber schon überrascht, dass es sooo langsam ist. Allerdings sagen meine Messungen 300-500mal langsamer (nicht 5000). Was es auch nochmal ein wenig schneller macht, ist, nicht PBSCallProcedure() zu verwenden, sondern PBSStartScriptCode():

Code: Alles auswählen

*ByteCode = PBSCompileScriptString("Procedure.i Test() : ProcedureReturn 10+20 : EndProcedure : Test()")
S = PBSOpenByteMemory(#PB_Any, *ByteCode)

Time = ElapsedMilliseconds()
For n = 1 To #Size1
PBSStartByteCode(S)
Next
Hab im Script dann den Aufruf von Test(). PBSCallProcedure() muss halt erst noch die Funktion mit dem Namen 'test' finden. So ist es "nur noch" ca. 100-200mal schneller. Aber man muss auch dazu sagen, wenn man nicht so viele Funktionsaufrufe durchführt, sondern den Interpreter eher in einer Funktion rumrechnen lässt, ist die Zeit durchaus akzeptabel, find ich.


So und da ich grad schon so schön schreibe, kann ich ja noch ein kleinen Ausblick geben, was es in der nächsten Version gibt. Daran arbeite ich nämlich fleißig schon seit ein paar Wochen. Es geht nämlich um die größte Neuheit bei PB seit Jahren und auch jetzt bei PBS, nämlich Arrays und Listen in Structuren. Und ich kann sagen, das is echt ne s*** Arbeit. Komplettes rewrite beim Compilieren und Interpretieren von Variablen.
Naja da funktioniert auch schon einiges, kann aber noch ein bisschen dauern ;)

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Version alpha 0.69:

Soooo, es gab noch ein paar größere Probleme, weshalb ich ne Woche länger brauchte, als ich eigentlich wollte >_< . Aber hier ist jetzt das wahrscheinlich größte Update seit dem Release.
Die erste Neuerung ist, dass ichs endlich geschafft hab, die Lib als MultiLib zu tailbiten. Zuvor konnte ich es nicht, wegen einem Bug in TailBite. Subsystems sind also nicht mehr nötig.

Dann die zweite große Neuerung ist, wie bereits angekündigt, Array und Listen in Strukturen. Das hat auch deshalb so lang gedauert, da ich ein komplettes Rewrite vom Compiler und Interpreter machen musste, was Variablen angeht. Leider kann ich darum auch keine Abwärtskompatibilität gewährleisten. Alte Bytecodes können also mit der neuen Version nicht mehr ausgeführt werden. Ich hoffe das war das letzte Mal :| .

So zu den Arrays/Listen in Strukturen hoffe ich, hab ich an alles gedacht. Initializieren und Freigeben von Arrays/Listen wird wie in PB automatisch durchgeführt. Es gibt nun auch InitializeStructure, mit dem man das auch manuell machen kann. CopyList/CopyArray/FreeList/FreeArray/CopyStructure/ClearStructure funktionieren auch komplett rekursiv.

So dann hab ich bemerkt, dass ich einige Speicherlecks hatte. Vorallem im Kompiler wurden viele Speicherblöcke nach dem Kompilieren nicht freigegeben. Aber auch im Interpreter gab es kleine Speicherlecks. Der Großteil ist nun beseitigt, viele Scripte liefen nun mit +-0 allocierten/freigegebenen Speicherblöcken. Hab allerdings festgestellt, dass ich bei Strings nicht alles bereinige. Das werde ich aber als nächstes angehen.
Außerdem gab es, wie immer, einige kleine Bugs (z.b. der von Stargate ;))

Zur Versionsnummer: Es wird nur eine vorläufige Version sein, sie ist auch z.Z. mit PB4.51 kompiliert. Wenn dann mal die endgültige 4.60 rauskommt, werd ich PBS 0.70 mit dieser kompilieren.
Es fehlt in dieser Version auch noch etwas: die Funktionen PBSGet/SetVariable funktionieren noch nicht mit den neuen Arrays/Listen. Auch bei PBSCallListProcedure und der neuen PBSCallArrayProcedure kann man z.Z. nur "normale" Arrays/Listen angeben. Das wird hoffentlich dann in der nächsten Version drin sein.

Hier jetzt nochmal die Änderungen im Detail:
- (NEU) PBSCompilerAddStructure(): Unterstützung von Arrays/Listen
- (NEU) PBSCallArrayProcedure() ermöglicht das Aufrufen von Funktionen der Array-Library (PBSGetArraySize() wird in einer der nächsten Versionen entfernt)

Im Script:
- (NEU) Arrays/Listen in Strukturen
- (NEU) Weitere Funktionen sind im Script direkt verfügbar: CopyArray, FreeArray, InitializeStructure

- UserLib ist jetzt eine MultiLib (kein Subsystem mehr nötig)
- Speicherlecks im Compiler und Interpreter
- Bugfix


Noch ein Nachtrag zu @MightyMAC:
Dich hab ich natürlich nicht vergessen ;)
Ich hatte zu der Idee, den aktuellen Stand eines Scriptes zu lesen/speichern, einfach noch keine Zeit. Das ist aber u.a. auch geplant zur neuen Version.

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Hi,

ist es möglich, daß das Auslesen von Float-Werten aus einem Script nicht funktioniert?

Zum Beispiel gibt

Code: Alles auswählen

Define string.s
Define *bytecode
Define value.PBSValue

Procedure.s CommandGetUserName_(a.i)
  ProcedureReturn "Hallo"
EndProcedure

string = #LF$
string + "Procedure.s GetUserName(a.i)"+#LF$
string + "EndProcedure"+#LF$
string + ""+#LF$
string + "Global val.s = GetUserName(0)"+#LF$
string + "Global fval.f = 10.0"+#LF$

*bytecode = PBSCompileScriptString(string)
If (*bytecode = #Null)
  MessageRequester("Compiler-Error", PBSGetErrorText())
  End
EndIf

If PBSOpenByteMemory(0, *bytecode)
  PBSSetProcedureAdress(0, "GetUserName", @CommandGetUserName_())
  
  PBSStartByteCode(0)
  Debug PBSGetVariableString(0, "val")

  PBSGetVariableValue(0,"fval",value)
  Debug StrF(value\float)
  ; oder
  Debug StrF(PBSGetVariableFloat(0, "fval"))
  
  PBSCloseByteScript(0)
EndIf
immer fval=0.0 zurück, obwohl es 10.0 sein sollte.

Gruß
MAC
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Hi,

ja stimmt. War ein kleiner Bug, allerdings nicht von der Get-Funktion, sondern vom Interpreter. Er hat Float-Variablen nicht richtig gespeichert :oops:

lg kevin
Zuletzt geändert von CSHW89 am 21.07.2011 18:32, insgesamt 1-mal geändert.
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Danke, aber klappt irgendwie nicht:
Bild

Ist aber nicht so schlimm, bis zum eigentlichen Update kann ich noch warten (hab noch genug andere Baustellen in meinem Projekt um die ich mich derweil kümmern kann).

MfG
MAC
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Version beta 0.70
So wieder mal ein paar größere Neuerungen, diesmal nur von der Schnittstelle:
  • Ich hatte ja mal i-wann zu Anfang geschrieben, dass ich mal ein Decompiler implementieren will, hier ist er nun in Form von 'PBSGetByteCodeText'. Diese Funktion gibt den Quellcode eines Scriptes zurück. Allerdings ist es mehr oder weniger Pseudocode. Man kann ihn also nicht wieder kompilieren. Es soll einfach nur eine Hilfestellung sein, damit man ein wenig debuggen kann. Dazu gibt es noch die Funktion 'PBSGetCurrentPosition', um die aktuelle Position zu bestimmen (insbesondere auch nach Fehlern: wo trat der Fehler auf?).
  • Flusskontrolle. Man kann nun nicht nur das Script starten, sondern es auch Schritt für Schritt ausführen (PBSStepByteCode), allerdings (z.Z.) noch mit Einschränkung: Ein Funktionsaufruf wird komplett ausgeführt (dazu siehe Beispiel in der Hilfe). Außerdem kann noch mit PBSSetCurrentPosition zu einer bestimmten Stelle im Bytecode gesprungen werden. Hierbei ist aber auch Vorsicht geboten, es verhält sich wie ein 'Goto'. Aus Proceduren oder in Proceduren zu springen führt zu unkontrollierten Fehlern!!
  • Laden und Speichern von Scripten (Hatte sich ja MightyMAC gewünscht ;)). Allerdings hatte ich dabei erhebliche Probleme, das gescheit umzusetzen. Es funktioniert zwar jetzt, allerdings nur unter bestimmten Rahmenbedingungen. Diese sind:
    - Ein Script sollte im gleichen Thread ausgeführt und gespeichert werden. Dazu sollte man aus dem Script eine Funktion aufrufen, die dann das Script speichert
    - Dieser Aufruf darf nicht in einer Procedure im Script sein. Es wird nämlich nur die Position gespeichert, an der die Ausführung gerade stoppt, nicht der Aufrufstack im Script. Beim Laden gibt es dann (ähnlich zum PBSSetCurrentPosition) ein Goto-Sprung zu dieser Stelle.

    Beispiele für PBSLoadMemoryScript und PBSSaveMemoryScript stehen in der Hilfe. PBSSaveMemoryScript führt ein Script aus, und speichert dann sein Kontext. Danach werden die Werte eines Arrays ausgegeben.
    Das Beispiel von PBSLoadMemoryScript lädt aus der erstellten Datei das Script, und stellt den Kontext wieder her. Das Array wird nochmal ausgegeben (die Werte sollten gleich sein).
    Falls etwas nicht funktioniert, oder i-welche Fragen sind: Fragen! Entweder hier oder per PN.
  • Die bessere Unterstützung in der Schnittstelle für Arrays und Listen in Strukturen. Dies war ja in der letzten Version noch nicht komplett.
Nochmal alle Neuerungen im Überblick:
- (NEU) PBSGetByteCodeText() und PBSGetCurrentPosition() zur besseren Fehlersuche
- (NEU) PBSStepByteCode() und PBSSetCurrentPosition() zur Flusskontrolle von Scripten
- (NEU) PBSLoadMemoryScript() und PBSSaveMemoryScript() ermöglicht das Speichern und Laden des derzeitigen Status des Scriptes
- (NEU) PBSGetStructureItemCollect(), um zu prüfen, ob ein Element der Struktur eine Collection ist
- (NEU) Alle Get- und Set-Methoden für Variablenwerte, sowie PBSCallArrayProcedure() und PBSCallListProcedure() unterstützen nun Arrays und Listen in Strukturen

- Bug mit Floats
- Minimales Speicherleck bei Debug

Link ist im ersten Post.

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
MightyMAC
Beiträge: 55
Registriert: 07.01.2007 18:11
Wohnort: Duisburg
Kontaktdaten:

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von MightyMAC »

Danke, das hört sich gut an. Werde ich mir mal zu Gemüte führen. :D

MfG
MAC
Windows XP 32-bit SP3, Windows 7 64-bit, PB 4.60, PB 5.11, PB 5.20
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Hi,
MightyMAC hatte mich aufmerksam gemacht, dass die Lib mit der Option Threadsafe nicht funktionierte. War bzw. ist ein blöder kleiner Fehler bei Tailbite, den ich jetzt grad umschifft hab. Neue Version 0.71 steht zum Download bereit (wie immer erster Post).

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Version 0.72
Da für PB4.60 ja nun ein Kandidat bereit steht, hab ich PBScript mal damit kompiliert. Außerdem kann man weitere grundlegende Funktionen im Script nativ benutzen. Dazu gehören die Funktionen der Math-Lib aus PB4.50 (bzw. Exp,Infinity,NaN,ect...), und die neuen Funktionen der LinkedList-Lib aus PB4.60 (Siehe im Inhalt der Hilfe ganz unten unter Funktionen/Konstanten).

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: PBScript - Scriptsprache mit PureBasic-Syntax

Beitrag von CSHW89 »

Da PB 5.00 nun Formen annimmt, hier die neu kompilierte Version.

Version 0.73:
- Version für PB 5.00
- Bug mit Break
- Compilerfehler bei Division mit einer Konstanten durch Null

lg Kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten