AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Sysygy Script Engine - Version 0.99h
Thema durchsuchen
Ansicht
Themen-Optionen

Sysygy Script Engine - Version 0.99h

Ein Thema von littleDave · begonnen am 13. Jun 2008 · letzter Beitrag vom 1. Sep 2009
Antwort Antwort
Seite 8 von 9   « Erste     678 9      
Benutzerbild von littleDave
littleDave
Registriert seit: 27. Apr 2006
Hallo liebe DP'ler

Ich meld mich mal wieder mit ner neuen Komponente

Einleitung
Nach dem Release meines Sysygy Image Viewers hab ich erstmal eine kleine Pause von dem Projekt gebraucht. Daher hab ich mich dazu entschlossen, meine Script-Engine, die ich bereits in dem Projekt verwende, weiter zu machen und allen zur Verfügung zu stellen.

Allgemeines
Sysygy Script Engine ist eine Skript-Sprache die den Dialekt Pascal benutzt. Es werden bei weitem nicht alle Features der Delphi-Sprache unterstützt, aber immerhin ein kleiner Teil. Beim kompilieren erstellt der Parser Byte-Code, denn dann von einem Interpreter ausgeführt wird.
Durch die Einbindung einer Script-Sprache ist es Möglich, ein Programm von Benutzern erweiterbar zu machen, ohne dass das Hauptprogramm neu kompiliert werden muss. Dadurch wird ein enormes Spektrum an neuen Möglichkeiten eröffnet.
Man kann mit der Script-Sprache z.B. aufwendige, mathematische Funktionen berechnen, die einen einfachen Matheparser überfordern würden. Denn dadurch, dass Ergebnisse in Variablen zwischengespeichert werden können und diese dann mit if-Anweisungen verschieden weiterbearbeitet werden können, kann man z.B. verschachtelte Funktionen erstellen, die nicht an das Programm gebunden sind sondern vom Benutzer während der Laufzeit des Programms geändert werden können (z.B. ein Funktionszeichner).
Ebenfalls ist es möglich, dass sich ein Programm selbst dynamisch anpasst: bei manchen Gelegenheiten ist es extrem schwer, bestimmte Situationen im Code zu verarbeiten. Möglich ist es zwar immer, doch manchmal kann der Aufwand extrem groß sein. An dieser Stelle könnte das Programm z.B. dynamisch neuen Quelltext erstellen, der dann von der Script-Sprache ausgeführt wird.
Sehr hilfreich wird eine Script-Sprache, wenn man z.B. ein Programm per "Fernwartung" erweitern oder ausbessern möchte und man nicht so einfach an die Datei herankommt. Dann kann es z.B. ausreichen, ein neues/verbessertes Script einfach an das Programm zu schicken und somit die Funktionalität erweitern/ausbessern.
Das mag jetzt zwar so klingen, als könnte man ganz einfach in einen PC eindringen - doch man sollte bedenken: das Script kann nur Funktionen ausführen, welche das Programm der ScriptEngine bereits zur Verfügung stellt. (Übertrieben) gesagt kann man nicht aus einer 2 KB-Exe ein Monsterprogramm machen. Ein kleines Beispiel wäre: ich habe eine StringListe, die sortiert werden soll. Die Vergleichsfunktion der einzelnen Zeilen lager ich in ein Script aus, das den Vergleich übernimmt. Das Script kann dann nur die Vergleichsfunktion beeinträchtigen aber z.B. nicht die Liste leeren.

Was unterstützt die Script-Sprache
  • Standard-Delphi-Typen: boolean, byte, shortint, word, smallint, integer, cardinal, int64, pointer, single, double, string, record (char kann über byte oder über string gelöst werden)
  • Variablen- und Typendeklarationen
  • uses-deklarationen
  • (natürlich) Kommentare im Script: //, (* *), { }
  • procedures und functions mit Parametern (optional auch var-Parameter)
  • direkter Aufruf von Delphi-Funktion aus dem Script heraus
  • Aufruf von einzelnen Script-Funktionen aus dem Programm heraus
  • try-finally und try-except Blöcke
  • Byte-Code in Stream speichern und später Ausführen
  • for, while und repeat-schleife
  • if und case-Anweisung (case auch mit strings)
  • Operatoren: and, or, xor, mod, shl, shr, not
  • "Klassen" mit Vererbung (wird weiter unten genauer erleutert)
  • Compiler-Anweisungen: {$IFDEF} {$IFNDEF} {$ELSE} {$DEFINE} {$UNDEF} {$INCLUDE} {$WARNINGS}
  • Lesen und schreiben von Script-variablen aus dem Program heraus
  • Code-Vervollständigung von SynEdit
  • Call-Stack zur Fehlerfindung aufrufbar

Was wird noch nicht unterstützt
Hier mal eine kurze Liste mit Featuren, die ich noch plane einzubauen:
  • 64-Bit-Typen (erledigt mit Version 0.98b) (extended und currency sind nicht geplant)
  • arrays
  • @ und ^ - Operator (da bin ich mir noch nicht sicher, ob die überhaupt gebraucht werden)
  • set und set of - Typen (erledigt mit Version 0.99h)
  • try-except und try-finally - Blöcke (kann noch etwas länger dauern) (erledigt mit Version 0.99d)
  • einzelne Funktionen im Script aus dem Programm heraus aufrufen (bisher kann nur das komplette Script ausgeführt werden) (erledigt; Feature eingeführt mit Version 0.99b)
  • Variablen umcasten (erledigt mit Version 0.99h)
  • div-Operator (Divisionen funktionieren schon, aber bitte unter "Enschränkung" nochmal genauer nachlesen) (hat sich erledigt, da "/" jetzt ordentlich funktioniert; letzte Änderung: Version: 0.99a)
  • Properties in den Script-Klassen erlauben

Sysygy "Klassen" vs Delphi Klassen
In der Script Engine ist es möglich, externe procedures und functions zu deklarieren. Um diese besser und übersichtlicher zusammenzubringen und den OOP-Gedanken nachzugehen hab ich mich dazu entschlossen, externe Methoden in Klassen zusammenfassen zu können. Dabei unterstützten diese "Pseudo"-Klassen auch Vererbung.
An einem Beispiel kann man das ganz gut erklären:
Nehmen wir an, ich habe in Delphi folgende Komponente, die ich in der Script-Sprache verfügbar machen will:
Delphi-Quellcode:
type
  TMyClass = class(TComponent)
  private
    FSomeThing : string;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  
    function GetSomeThing: string;
  end;
Jetzt kann man in der Script-Sprache eine Pseudo-Klasse erstellen, mit deren Hilfe man auf diese Klasse zugreifen kann.
Script-Code
Delphi-Quellcode:
unit myClassUnit;

uses Classes; // für TComponent

type
  TMyClass = class(TComponent)
  public
    function Create(AOwner: TComponent): TMyClass;
    function GetSomeThing;
  end;
Diese Klasse speist man jetzt in einen Exporter, der daraus eine Delphi-Unit erstellt (ist mit dabei). Diese Delphi-Unit bindet man dann in das Delphi-Projekt ein - den Rest übernimmt die Script-Sprache. Ein Script könnte jetzt z.B. so aussehen:
Delphi-Quellcode:
program Test;

uses myClassUnit;

var p: TMyClass;
    s: string;
begin
  p := p.Create; // hier ist ein großer Unterschied zu Delphi
  
  s := p.GetSomeThing;
  if p.ComponentCount = 0 then // da die Klasse von TComponent abgeleitet ist
    exit;
end;
Die Klassen in der Script-Engine sind also sozusaggen nur eine Zusammenfassung von externen Methoden. Es können keine Variablen oder Script-Interne Methoden hinzugefügt werden. Das will ich aber noch ändern, jedoch dauert das eine ganze weile.

Bisherige Einschränkungen
  • Man kann zwar schon Unterroutinen in Funktionen schreiben, jedoch kann man in jeder Routine nur auf die routineinternen Parameter, Variablen und auf die globalen Variablen zugreifen. Der Compiler spuckt eine Fehlermeldung aus, wenn man auf Variablen von "Parent"-Funktionen zugreifen will.
  • Bisher gibt es den Operator div nicht. Alle Divisionen werden mit dem / ausgeführt. Ob das Ergebniss ein float oder ein Integer ist, hängt dann von den Parametern ab. Wenn man jetzt die Integerdivision 1000 / 3 macht, kommt der Integerwert 333 raus - 1000.0 / 3.0: float-Wert mit 333,33333 usw. (bitte nächsten Punkt auch beachten)
  • Da intern sowie extern das Casten von integer auf float noch nicht möglich ist, gibt es eine Funktion "ToFloat(i: integer): single, die Integer-Variablen in eine Float-Variable umwandeln. Dass ist z.B. bei Divisionen mit Variablen, bei denen das Ergebniss ein float sein soll, praktisch. Das werd ich aber auf jeden fall noch ändern. (der Aufruf von "ToFloat" ist ab sofort obsolet)
  • Variablennamen und Funktionsnamen können sich [noch] überschneiden, will heißen: man kann noch einer Funktion den gleichen Namen wie einer Variable geben. Beim Aufruf wird man aber immer nur die Funktion bekommen, egal wo die Variable deklariert ist.
  • Ein Funktions/Variablen-Name darf nur einmal vorkommen (das ist nicht neu) - dabei werden die Funktionen der per uses eingebundenen Units mitgezählt (neu) - Man kann jede Funktion/Variable nur einmal definieren - aber nur innerhalb einer Unit. In mehrere Units können jetzt die gleichen Funktionsnamen/Variablen sein. Mann greift dann über UnitName.VariablenName drauf zu

So, genug der negativen Sachen

Was muss ich zusätzlich noch an Komponenten installieren?
Die Script-Sprache an sich braucht keine zusätzlichen Komponenten - es werden nur die Klassen benutzt, die bereits bei Delphi mit dabei sind. Auch die mitgelieferten Demos (bis auf eine) kommen mit den Komponenten aus. Jedoch werden für die Kompilierung der Haupt-GUI zwei große Sachen benötigt:
  • SynEdit für die Haupt-GUI und für die eine Demo (Code-Vervollständigung-Demo): http://synedit.sourceforge.net/
  • JEDI-Component-Library (JVCL) für die Haupt-GUI: http://www.delphi-jedi.org/
  • Da ich die TCoolBar und die TToolbar-Komponente in der Haupt-GUI verwende, ist die GUI unter Win95 wahrscheinlich nicht lauffähig (die Script-Engine an sich ist dadurch nicht betroffen). Für diese Komponenten wird die Datei COMCTL32.DLL in der Version 4.70 oder höher benötigt.

Wie installiere ich die Sysygy Script Engine?
Der Parser sowie der Interpretor sind Komponenten mit relativ wenig properties. Von daher ist eine Installation eigentlich nicht vorgesehen. Am besten, ihr kopiert die Quelltexte in einen beliebigen Ordner und fügt diesen in den Suchpfad von Delphi dazu. Ein fertiges Package wird jedoch nicht mitgeliefert.

Welche Delphi-Version muss ich haben?
Also garantieren kann ich für nichts. Ich hab die Script-Sprache mit Delphi 7 erstellt, von daher sollte alles, was neuer als D7 ist, damit klar kommt. Ich weiß nicht, wie weit runter man mit den Delphi-Versionen gehen kann. Jedoch sollte es schon möglich sein, Funktionen als overloaded zu deklarieren.

Sysygy Script Engine + FreePascal
Mit Version 0.99e hab ich es geschafft, die Script-Engine FreePascal-kompatibel zu machen. Ich habe (bis auf ein paar einzelne Scripts) nicht viel ausprobiert, aber es hat alles bisher geklappt. Da ja FPC auf sehr vielen Plattformen funktioniert, weiß ich nicht, ob wirklich alles unterstützt wird. x86-CPUs sollten ziemlich sicher funktionieren, bei x86-64Bit-Systemen weiß ich nicht, ob alles funktioniert.
Die die LCL ja nicht 100%ig kompatibel mit der VCL ist, sind einige Funktionen der Include-Dateien uSygInc*.pas nicht mit eingebunden. Zwar erscheinen diese Funktionen noch im Script, jedoch führt ein Aufruf zu einer Exception. Ich werde aber noch die neuen Includes {$IFDEF FPC} und {$IFDEF DELPHI} in die Header mit einbauen und somit die nicht verfügbaren Funktionen für das Script unsichtbar machen - jedoch dauert das noch etwas.
Bisher gibt es noch Probleme mit den Units uSygIncGraphics und uSygIncWinCRT, die anderen sollten aber funktionieren.

Wie benutze ich die Komponenten?
Ich habe ein paar Demoprogramme in den Download mit hinein gepackt, an denen man (hoffentlich) gut sehen kann, wie man die Komponenten am einfachsten benutzt. Hier ist aber mal der grundlegende Aufbau zur Benutzung
Delphi-Quellcode:
uses
  uSygParser, // für TSygScript_Parser
  uSygRunTime; // für TSygScript_RunTime

var Compiler : TSygScript_Parser; // das Objekt muss natürlich vorher erstellt werden
    Executor : TSygScript_RunTime; // ... und das Objekt sollte auch vorher erstellt werden

function CompileAndExecute(ScriptSource: string): boolean;
begin
  // Ergebniss vorinitalisieren
  result := False;
  // Script kompilieren
  if Compiler.ParseScript(ScriptSource) then
  begin
    // ByteCode im Executor speichern
    Executor.FillData(Compiler.OutputData);
    // Script ausführen
    Executor.Run;
    result := True;
  end;
end;
Was ist in den Download dabei?
  • Der komplette Source-Code der Script-Sprache
  • 7 Demo-Programme, die die einzelnen Features und ihre Anwendung zeigen
  • eine vorkompilierte Version der Haupt-GUI
  • ein kleiner Massen-Datei-Umbenenner, der die Script-Engine für die neuen Dateinamen benutzt (als Anwendungsbeispiel)

Lizenz:
Das "Hauptprogramm" sowie die Komponente ist unter der BSD-Lizenz lizenziert. Der Lizenztext liegt ebenfalls nochmal im Hauptordner der zip-Datei sowie als Header in jeder .pas-Datei.
Falls jemand eine andere Lizenz haben will, bin ich gerne bereit, eine einzelne, personengebundene Lizenz nach Absprache zu erstellen.

Und nun ...
... wünsch ich viel Spaß beim ausprobieren und freu mich auf eure Meinungen.

Change-Log

Version: 0.99h (15.10.2008)
  • Direkte Type-Casts sind jetzt möglich [z.B. Pointer(cardinal(25) + integer(GetPointer))]
  • Enum-Types sind jetzt möglich [z.B. type TTest = (ttEins, ttZwei, ttDrei);]
  • OnError-Event in Interpretor geändert: CallStack wird jetzt als Parameter übergeben. Das liegt daran, dass das OnError-Event bei try-finally und try-except Blöcken verzögert ausgegeben wird und dann die Abfrage von CallstackTrack im OnError-Event dann nicht mehr an der wahren OnError-Position ist.
  • Kleines Problem mit cardinals behoben
  • Problem mit - behoben: es musste immer ein Leerzeichen vor einem Minus sein, wenn eine Zahl angegeben wurde, sonst gab es eine Fehlermeldung
  • Constanten können jetzt auch ein - haben
  • Identifier-Expression verbessert/ausgebaut:
  • TKlasse(Identifier).Funktion funktioniert jetzt
  • Unitname.Variablenname sowie Unitname.Funktionsname funktioniert jetzt
  • Es können jetzt mehrere Variablen/Funktionen den gleichen Namen haben - solange sie in verschiedenen Units deklariert sind. Über UnitName.Identifier kann dann auf die verschiedenen Variablen/Funktionen zugegriffen werden
  • Fehler im not-Operator behoben: der Operator hatte die falsche Priorität
  • Fehler in Operatoren "*/ mod and shr shl" behoben
  • Fehler in Vergleichsoperatoren behoben: komplexere Vergleiche ohne genügend Klammern lieferten ein falsches Ergebniss
  • Fehler in Vergleichsoperatoren behoben: grundlegende Vergleiche funktionierten zwar, jedoch konnte es passieren, dass das Negieren von Vergleichen nicht funktionierten
  • RunTimerOnError-Event: Parameter verändert
Version: 0.99g (06.08.2008)
  • Kleiner Fehler im Parser: int64-Typen wurden nicht zu int32-Typen umgewandelt, falls erforderlich
  • Code-Completion-Display etwas verbessert
  • Geschwindigkeit von TSygScript_RunTime.LoadFromStream extrem verbessert
  • Memory-Leak im Parser behoben
  • ein paar kleine Probleme mit Records behoben
  • manche Variablen wurden bei verschachtelten Funktionen ungültig
Version: 0.99f (24.07.2008)
  • Im Interpretor kann man jetzt mit Hilfe von Properties schnell Script-Variablen abrufen bzw. ändern
  • Die Angabe der Unit beim Registrieren von Methoden bzw. beim Lesen von Variablen ist jetzt optional. Es kann auch einfach ein Leerstring übergeben werden - dann wird die erste Variable genommen, die den gesuchten Namen hat
  • Das Script wurde beim Aufruf von Run nochmals intialsiert, obwohl "InitializeRun" bereits aufgerufen wurde
  • Kompiliergeschwindigkeit verdoppelt. Das kompilieren von langen Scripts mit vielen uses-Units dauert jetzt nicht mehr so lange
  • Fehler bei exit-Anweisung in verschachtelten try-finally-Blöcken behoben -> es wurde nur die letzte finally-Anweisung aufgerufen
  • Die Continue-Anweisung funktioniert jetzt auch in while und repeat - Schleifen korrekt
  • Kleiner Memory-Leak entfernt
  • Kritischer Fehler im Parser und im Interpretor behoben: beim Aufruf von tieferen Unterlementen (z.B. Application.MainForm.Caption - Application.MainForm an sich funktionierte bereits) wurden Variablen im Script-Stack überschrieben.
  • Schwerer Fehler mit der Script-String-List behoben. Bei bestimmten Unit-Konsterlationen wurden die falschen Strings im Script verwendet
Version: 0.99e (18.07.2008)
  • ScriptEngine mit Lazarus kompilierbar
  • Zwei neue Script-Compiler-Defines: {$IFDEF FPC} wenn Lazarus/FPC benutzt wird und {$IFDEF DELPHI} wenn Delphi benutzt wird
  • Einige Funktionen der VCL gibt es in der LCL nicht, daher sind diese auch nicht in der Script-Engine verfügbar. Die Klassen behinhalten zwar auch diese Funktionen, beim Aufruf wird aber eine Exception ausgelöst, wenn die entsprechende Funktion unter Lazarus nicht verfügbar ist.
  • Der Aufruf von Script-Funktionen aus dem Programm heraus funktioniert jetzt auch, wenn das Script währenddessen schon läuft
  • Die Parameter von TSygScript_Parser.FindFunction, TSygScript_Parser.Call abgeändert
  • var-Parameter beim Aufruf von Script-Funktionen aus dem Programm heraus funktioniert jetzt. Dabei muss beim Aufruf einfach ein Pointer auf die Variable übergeben werden
  • In der Unit WinCRT können jetzt Events registriert werden. Ein Demo-Script ("EventTestProgram.scs") für die Verwendung ist mit dabei
  • Das Beispielscript "TimeInformation.scs" etwas überarbeitet
Version: 0.99d (16.07.2008)
  • try-finally und try-except-Blöcke eingeführt
  • Neue Funktion in der System-Unit: RaiseException(msg: string);
  • Neue Funktion in der System-Unit: Assert(Condition: boolean; msg: string);
  • Neues Beispiel-Script für das Hauptprogramm: "ClearTempData" (löscht alle, für ein Source-Release unrelevanten, Dateien, die von Delphi erstellt wurden)
  • Resourcen-Schutz-Blöcke (try-finally) in die anderen Demo-Programme eingefügt
  • Windows-uses aus den Units entfernt, die die "Windows.pas" nicht benutzen. Falls die Windows.pas benutzt werden muss, wird diese per {$IFDEF WIN32} eingebunden
  • CopyMemory ersetzt durch "System.Move"
  • Alte Debug-Anweisungen im Parser gelöscht
  • Fehlermeldungen des Compilers in const-strings ausgelagert und etwas überarbeitet
Version: 0.99c (12.07.2008)
  • Kleiner Fehler im Parser und im Interpretor behoben: LoadFromStream/SaveToStream hat eine Untermethode aufgerufen, die fehlerhaften Code drinnen hatte
  • Demo 4: Quelltext der Demo war noch nicht auf die neuen UnitNamen aus Version 0.99b umgestellt
Version: 0.99b (10.07.2008)
  • In dieser Version haben sich einige externen Sachen (z.B. Funktionsnamen, Unitnamen, ...) geändert! Daher ist ein Update auf diese Version mit etwas Aufwand verbunden! Natürlich versuche ich solche groben Änderungen nicht zu machen; doch machmal hab ich keine andere Wahl.
  • Hauptprogramm: Toolbar eingebaut
  • Sinnvollere Unit-Namen vergeben
  • Einige Komponenten und Funktionen umbenannt
  • Aufbau vom Interpretor etwas verändert
  • Fehler im Interpretor im Operator disc behoben
  • Einzelne Script-Funktionen jetzt aufrufbar
  • Fehler bei Doubles in Records behoben
  • Größe des ByteCode-Streams verringert
  • Fehler in Records behoben: beim Aufruf von externen Funktionen, die ein Record mit einer String-Variable als Parameter hatten, wurde zu wenig Speicherplatz benutzt und es gab eine Exception
  • Fehler in Records behoben: beim Aufruf von externen Funktionen, die ein Record mit einer Single-Variable als Parameter hatten, wurde zu viel Speicherplatz benutzt und die Daten wurden ungültig
  • Code-Completion setzt die Property "GenerateCode" jetzt automatisch wieder zurück
  • Es gibt jetzt eine overloaded-procedure von ParseScript, bei der man den Script-Quelltext als Parameter mitliefern kann
  • TPoint und TRect in die Unit "System" verschoben
  • drei neue Script-Unit hinzugefügt: Forms, Menus, StdCtrls (weitere werden noch folgen)
  • Fehler in der uses-Deklaration behoben: identifiers aus weiteren uses-Units wurden nicht gefunden
  • Neue Demo hinzugefügt: Diese Demo zeigt, wie man einzelne Script-Funktionen aus dem Programm heraus aufruft
  • Neue overloaded-function im Interpretor: CallStackTrace kann jetzt auch ohne StringList ausgeführt werden. Der Inhalt der StringList (inc. Zeilenumbrüche) wird dann als Strings-Result-Wert zurückgegeben
Version: 0.99a (03.07.2008)
  • Code-Minimierung eingeführt: die Code-Minimierung reduziert den erstellen Byte-Code, in dem er unbenutzte Stellen löscht
  • Call-Stack jetzt erstellbar (zum Debuggen)
  • Kleiner Fehler im RunTime-Stack behoben (Ausführung wurde nicht beeinträchtigt)
  • Hauptprogramm: Export-Funktion durch Ausnutzung von neuen Features sehr viel schneller gemacht
  • Hauptprogramm: InstructionList-Viewer erweitert
  • Neue Script-Demo für das Hauptprogramm: TimeInformation.scs
  • Kleiner Fehler in der Code-Completion behoben
  • Konstanten werden nicht mehr im Stack gespeichert
  • Doppelte Einträge in der Runtime-StringList werden jetzt vermieden
  • kleiner Fehler im automatischen Type-Cast behoben: integer -> float wurde zu spät ausgeführt -> starke Rundungsfehler
  • ehemalige Debug-NOOPs im Code entfernt
Version: 0.99 (23.06.2008)
  • kleiner Operator-Fehler im Interpretor beseitigt
  • ToFloat ist jetzt endlich obsolet
  • Return-Address-Typ geändert (ist für einen Stack-Trace wichtig, den ich später einbauen werde)
  • Neues Demoprogramm: ein Massen-Datei-Umbenenner, der den neuen Dateinamen anhand eines Scripts erstellt
  • Neue Funktion: "InitializeRun" in "TSygScript_RunTime": muss aufgerufen werden, wenn das Script mehrmals verwendet werden soll, ohne dass der ByteCode neu geladen werden soll (die Verwendung wird im neuen Demo-Programm gezeigt)
  • Formatierung in der Code-Completion verändert
  • kleinerer Download da die Demos nun nicht mehr vorkompiliert sind
  • ein paar kleine Bugs behoben
Version: 0.98b (18.06.2008)
  • 64-Bit-Typen hinzugefügt (int64, double)
  • TDateTime auf double geändert
  • Neue Funktionen in SysUtils: DiscSpace, DiscFree, FileSize
  • Viele Funktionen auf int64 bzw double geändert
  • Automatisches casten zwischen den Variablen (ToFloat sollte immer noch verwendet werden)
  • Viele Bugs beim Ausführen von Delphi-Methoden behoben (viele waren mit single-Typen)
  • GetVariable und SetVariable im Interpretor können nun auch mit double/int64 umgehen
  • extended aus der Typendeklaration entfert (sorgt sonst nur für Verwirrung)
  • rtlVclOptimize herausgenommen
  • Geschwindigkeit des Stacks erhöht
  • fehlende Funktion im Release-Paket hinzugefügt (hat anscheindend noch niemand gemerkt)
Version: 0.98a (13.06.2008)
  • Initial release
Miniaturansicht angehängter Grafiken
screen1_141.gif   screen2_812.gif  
Angehängte Dateien
Dateityp: zip sysygyscriptengine_704.zip (1,79 MB, 379x aufgerufen)
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
 
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#71
  Alt 9. Mai 2009, 15:04
Zitat von Geri:
Die Script engine ist für mich immer noch interessant. Du schreibst aber, dass du an einer Neuen Scriptengine dran bist. Hast du schon einen Zeitpunkt für das erste Release und macht es dann besser wenn man auf diese neue Engine wartet?
Zitat von mkinzler:
Bzw wie kompatibel wird die neue zu der (schon hervorragenden) "alten" Engine sein?
Also die neue Script-Engine kommt ganz gut vorran - im Momemt bin ich bei der Implementierung von arrays und records. Danach stehen Klassen auf der ToDo-Liste.

Generell wird die Script-Engine nicht sehr kompatibel zu der alten sein. Die Virtual Machine ist komplett neu geschrieben und ist somit nicht von den Daten kompatibel. Jedoch wird die Syntax ebenfalls wieder Pascal sein, somit ist die Sprache an sich sehr kompatibel. Jedoch hab ich die Syntax auch schon erweitert und die Funktionen werden in virtuellen statischen Klassen in der Script-Engine zusammengefasst.

Hier mal ein Beispiel
Delphi-Quellcode:
//alte Script-Sprache
var i: integer;
begin
  i := StrToInt('123');
  WriteLn(IntToStr(i));
end;

// Neue Script-Sprache
var i: integer;
begin
  i := Convert.StrToInt('123');
  Console.WriteLine(Convert.IntToStr(i)); // Entweder so
  Console.WriteLine(i); // oder so - overloaded Methoden werden unterstützt
end;
Jedoch wird man Projekte an die neue Script-Engine etwas anpassen müssen. Die grundlegenden Funktionen bleiben in etwa gleich, jedoch mit etwas anderen Parametern:
Delphi-Quellcode:
var PE: TSE2RunTime;
begin
  PE := Compiler.Compile('program Test; begin end.');
  try
    if PE <> nil then // korrekt kompiliert
    begin
      // z.B.
      PE.SaveToFile('Compiled.dat');

      PE.Initialize;
      PE.Run;
      PE.Finalize;
    end;
  finally
    PE.Free;
  end;

  // Oder so
  PE := TSE2RunTime.Create;
  try
    PE.LoadFromFile('Compiled.dat');
    PE.Initialize;
    PE.Run;
    PE.Finalize;
  finally
    PE.Free;
  end;
end;
Wann der erste Release sein wird, kann ich noch nicht sagen - aber ich beeil mich
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#72
  Alt 9. Mai 2009, 15:17
Meine Frage zielte auch eher auf die Anwendung. Das sich intern viel geänder hat, habe ich erwartet.
Markus Kinzler
  Mit Zitat antworten Zitat
Namenloser

 
FreePascal / Lazarus
 
#73
  Alt 9. Mai 2009, 15:44
Zitat von igel457:
Hallo little Dave,

ich verfolge deine Scriptengine nun schon seit einer Weile gespannt. Das Projekt hört sich auf jeden Fall hochinteressant an. Vielleicht kann ich die Script Engine ja in Andorra 2D integrieren um so die GUI, Gameplay usw. steuern zu können.

Weiter so,
Andreas
Das wäre genial für gescriptete Gegner!
  Mit Zitat antworten Zitat
Florian Hämmerle
 
#74
  Alt 9. Mai 2009, 16:46
Wird es die Scriptengine auch wieder als OpenSource geben?

mfg Florian
  Mit Zitat antworten Zitat
EugenB

 
Lazarus
 
#75
  Alt 11. Jun 2009, 15:22
Gibt es welche Updates?

Oder Testversionen?

Es warten wohl viele auf diese Script-Engine =)

MfG,
Eugen
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#76
  Alt 17. Jun 2009, 21:15
Sorry das ich mich in letzter Zeit (bzw. in den letzten 6 Monaten) nicht mehr so oft melde. Das kommt halt davon wenn man nicht mehr Student sondern Azubi ist.

Also ich arbeite immer noch an der Script-Sprache. Jedoch hat sich bei mir ein heftiger Design-Fehler eingeschlichen, der mich dazu zwang, relativ viel neu zu schreiben. Jedoch bin ich langsam wieder auf nem grünen Ast.

Ich kann bereits externe Klassen in die Script-Engine einbinden, externe Objekte erstellen, Funktionen aufrufen und Properties abfragen und setzen. Es ist also schon sehr viel erledigt. Zudem kann ich auch einzelne Script-Funktionen aus dem Programm heraus aufrufen.
Jetzt werd ich mal schauen, dass ich die Classes-Unit einbaue. Dann hat man schonmal nen guten Grundstock. Was jedoch noch nicht funktioniert sind arrays und records. Jedoch denke ich, dass ich es diesmal besser umsetzen werden.

Eine Testversion würd ich ja schon gerne mal hochladen, jedoch bin ich mir nicht mehr so ganz sicher, ob das wirklich gut ist. Nach dem letzten großen Design-Fehler bin ich mir nicht mehr sicher, wieviel sich an den Aufrufen noch ändern wird.

Es gibt noch viel zu tun, jedoch versuch ich in den nächten 2 Monaten was ordendliches fertig zu stellen. Für garantieren kann ich leider nichts.
  Mit Zitat antworten Zitat
EugenB

 
Lazarus
 
#77
  Alt 18. Jun 2009, 01:14
GuuuuuT,

weiter so =)

Also nicht mehr lange und die ScriptEngine unterstützt Classes? also OOP?

MfG,
Eugen
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#78
  Alt 18. Jun 2009, 20:03
Naja, so weit bin ich dann noch nicht.

Also ich hab die Script-Engine so aufgebaut, dass ich sie möglichst einfach erweitern kann. Alle wichtigen Eigenschaften wie virtual, overload, override, usw. sind schon als reservierte Worte drinnen und werden auch schon ein wenig benutzt. Jedoch kann man noch keine eigenen Klassen erstellen.

Aber ich will das irgendwie hinbekommen
  Mit Zitat antworten Zitat
skydiablo
 
#79
  Alt 28. Jun 2009, 17:12
moin !

bin eben per zufall hier im thread gelandet und wollte es ja nicht glauben ! das beschriebene hier ist die lösung meines prob ! ich habe ein recht großes projekt in delphi mit TjvInterpreter geschrieben... nun wollte ich das ganze ding neu coden, diesmal aber für linux und dafür fpc nutzen. wie sicherlich bekannt ist tjvinterpreter nicht fpc tauglich und so setze ich jetzt mal alles auf dieses pferd hier ! das ist echt klasse und ich freue mich schon auf deine umsetzung...

hast ein weiteren fan der sein nächstes projekt mit deinem code schmücken möchte

greez, sky...

EDIT: so, habe nun doch noch etwas weiter im netz nach scripting möglichkeiten gesucht. nun brauch ich eine doch recht objektive meinung deines interpeter: kannst du dich mit dem RemObjects Pascal Script in functionsumfang, geschwindigkeit und stabilität messen ?

greez & thx, sky...
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#80
  Alt 1. Sep 2009, 19:27
Hallo,

ich meld mich mal wieder *g*. In meinem letzten Post (der ja doch schon 2,5 Monate her ist ), hab ich ja angekündigt, dass ich versuche in 2 Monaten was auf die Beine zu stellen. Leider hab ich das Zeitlimit nicht geschafft, da ich mit diesem Post noch keine Version veröffentlichen will.

Aber ich hab mir gedacht - machste mal nen Status-Update - und diesmal ist es wirklich ein gewaltiger Schritt, den ich geschafft habe, denn

.... *trommelwirbel* ...

ich habe es endlich geschafft, dass meine Script-Sprache objekt-orientiertes Arbeiten möglich macht. Im Klartext heißt das, dass man jetzt im Script eigene Klassen erstellen kann (natürlich mit Variablen, Properties, Methoden, Constructor, Destructor, ...) und diese dann im Script verwenden. Dabei unterstützten die Klassen sogar Vererbung (also Zugriff auf Public/Protected-Properties/Methoden von Eltern-Klassen, Methoden überschreiben, usw.).

Am besten ich zeig euch mal ein kleines Script:

Delphi-Quellcode:
program Project1;

type
  TTest1 = class(TObject)
  private
    FABC : integer;
  public
    constructor Create; override;
    procedure Test1; virtual;
    
    property ABC : integer read FABC;
  end;
  
  TTest2 = class(TTest1)
  public
    constructor Create; override;
    procedure Test1; override;
  end;
  
  TTest3 = class(TTest2)
  public
    procedure Test1; override;
  end;

{ TTest1 }
  
constructor TTest1.Create;
begin
  inherited;
  Self.FABC := 1024;
  Console.WriteLine('TTest1.Create');
end;

procedure TTest1.Test1;
begin
  Console.WriteLine('TTest1.Test1');
end;

{ TTest2 }

constructor TTest2.Create;
begin
  inherited;
  Console.WriteLine('TTest2.Create');
end;

procedure TTest2.Test1;
begin
  inherited;
  Console.WriteLine('TTest2.Test1');
end;

{ TTest3 }
     
procedure TTest3.Test1;
begin
  inherited;
  Self.FABC := 512; // nur sichtbar, da in gleicher Unit
  Console.WriteLine('TTest3.Test1');
end;

{ Main }

var p: TTest1; // Der Basistyp
begin
  p := TTest3.Create; // eine abgeleitete Variante davon
  try
    Console.WriteLine(p.ABC);
    p.Test1;
    Console.WriteLine(p.ABC);
  finally
    p.Free;
  end;
end.
Wenn ich dieses Script ausführe, bekomme ich folgende Ausgabe in der Konsole:
Code:
TTest1.Create
TTest2.Create
1024
TTest1.Test1
TTest2.Test1
TTest3.Test1
512
Das ist jetzt schon etwas schwerer zu lesen, aber wenn man mal mit dem Finger den Ablauf so langgeht, dann kann man das schon ganz gut nachvollziehen.

Die Script-Klassen kann ich auch aus dem Programm heraus erstellen und die Vererbung nutzen. Hier mal ein wenig Pseudo-Code (Pseudo-Code, da die einzelnen Methoden noch ein paar andere Paremter haben, die hierfür erstmal nur stören würden)
Delphi-Quellcode:
var aClass : Pointer;
    aObject : Pointer;
    method : Pointer;

begin
  // erstmal die Klasse suchen, die erstellt werden soll
  aClass := FRunTime.CodeAccess.FindClass('TTest3');
  // dann eine "Instanz" der Klasse erzeugen
  aObject := FRunTime.CreateClass(aClass);
  // dann noch die Basis-Methode suchen
  method := FRunTime.CodeAccess.FindMethod('TTest1.Test');
  // und dann die Methode mit "aObject" als Self-Parameter aufrufen
  FRunTime.Call(method, [aObject]);

  // -> jetzt wird im Script nicht die Funktion TTest1.Test ausgeführt, sondern
  // jetzt wird die Funktion "TTest3.Test" ausgeführt.
end;
Das ganze funktioniert schon sehr gut - jedoch muss ich den Compiler noch viel strenger machen. Zudem muss ich noch den Befehl "reintroduce" einbauen sowie den "inherited" - Befehl erweitern. Außerdem warten noch ein paar Bugs darauf, gelöscht zu werden.

Ich hoffe, dass ein paar Leute eine object-orientierte Script-Sprache brauchen könnten - ich brauch sie auf jeden fall

Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 8 von 9   « Erste     678 9      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz