|
Antwort |
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
Was wird noch nicht unterstützt Hier mal eine kurze Liste mit Featuren, die ich noch plane einzubauen:
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:
Jetzt kann man in der Script-Sprache eine Pseudo-Klasse erstellen, mit deren Hilfe man auf diese Klasse zugreifen kann.
type
TMyClass = class(TComponent) private FSomeThing : string; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function GetSomeThing: string; end; Script-Code
Delphi-Quellcode:
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:
unit myClassUnit;
uses Classes; // für TComponent type TMyClass = class(TComponent) public function Create(AOwner: TComponent): TMyClass; function GetSomeThing; end;
Delphi-Quellcode:
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.
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; Bisherige Einschränkungen
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:
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:
Was ist in den Download dabei?
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;
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)
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 |
FreePascal / Lazarus |
#31
So, wie versprochen habe ich es versucht unter Lazarus zum laufen zu bringen, was leider nicht geht,
weil die LCL anscheind kein CopyMemory kennt. Ich habe es unter Linux versucht. Was genau macht diese Methode ? kann man die auch noch anders Schreiben ? weil MoveMemory wird auch nicht gefunden. SygScript_Runtime_unit in dieser Unit traten die Fehler auf. Es währe außerdem noch schön, wenn du von vornerein die Windows unit nur mit Komplier schalter einbinden könntest. die musste ich in allen Units rauß nehmen. Evlt. gibt es ja noch eine andere Lösung für das Problem, ich habe ein neues Projekt angefangen, und mir ein Beispiel von dir angeschaut und folgende unit hinzugefügt:
Delphi-Quellcode:
brauche ich wirklich alle ?
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, SygScript_Constants_unit, SygScript_Parser_unit, SygScript_Runtime_unit; ;
Michael Springwald
|
Zitat |
Delphi 7 Professional |
#32
Zitat von mimi:
So, wie versprochen habe ich es versucht unter Lazarus zum laufen zu bringen, was leider nicht geht,
weil die LCL anscheind kein CopyMemory kennt. Ich habe es unter Linux versucht. Was genau macht diese Methode ? kann man die auch noch anders Schreiben ? weil MoveMemory wird auch nicht gefunden. SygScript_Runtime_unit in dieser Unit traten die Fehler auf. Es währe außerdem noch schön, wenn du von vornerein die Windows unit nur mit Komplier schalter einbinden könntest. die musste ich in allen Units rauß nehmen.
Zitat von mimi:
Evlt. gibt es ja noch eine andere Lösung für das Problem, ich habe ein neues Projekt angefangen, und mir ein Beispiel von dir angeschaut und folgende unit hinzugefügt:
Delphi-Quellcode:
brauche ich wirklich alle ?
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, SygScript_Constants_unit, SygScript_Parser_unit, SygScript_Runtime_unit; ; Also wenn du nur kompilieren willst, brauchst du nur die uSygParser. Fürs Ausführen brauchst du nur die uSygRunTime. Wenn du dann noch die bereits konvertierten Units auch zur Verfügung stellen willst, musst du die auch noch einbinden. Hier ist mal das einfachste Beispiel:
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; |
Zitat |
FreePascal / Lazarus |
#33
leider lässt sich uSygRunTim halt nicht kompelieren.
Ich denke CopyMemory müsste als eigene Funktion geben. Lazarus unter Windows zu Installieren ist ein Kinderspiel inzwischen auch unter Linux.... Allerdings unter Linux nur die 0.9.24 die "svn" Version musst du per Hand Kompilieren. Ich könnte mir auch vorstellen bei meinem GamePack deine Scrip Sprache zu verwenden. Z.B. das jeder ganz einfach 2D Spiele schreibe kann ohne Delphi oder Lazarus *G*. Vorrausgesetzt das es damit geht... nochmal zu klassen: in wie weit werden sie unterstütz ? das währe für mein GamePack eine Voraussetzung. z.b. erben und Methoden und Eigenschaften und Events und sowas... Die Idee währe aber gar nicht mal so schlecht....
Michael Springwald
|
Zitat |
|
#34
Bei mir lief die Demo 2 manchmal instabil.
Spätestens wenn ich 3X Ctrl+F9 und dann F9 gedrückt habe, gab es die Fehlermeldung: Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00404448 in module 'PROJECT1.EXE'. Read of address 00C1C654'. Process stopped. Use Step or Run to continue. |
Zitat |
Delphi 7 Professional |
#35
Zitat von mimi:
leider lässt sich uSygRunTim halt nicht kompelieren.
Ich denke CopyMemory müsste als eigene Funktion geben. Lazarus unter Windows zu Installieren ist ein Kinderspiel inzwischen auch unter Linux.... Allerdings unter Linux nur die 0.9.24 die "svn" Version musst du per Hand Kompilieren.
Zitat von mimi:
Vorrausgesetzt das es damit geht... nochmal zu klassen: in wie weit werden sie unterstütz ? das währe für mein GamePack eine Voraussetzung. z.b. erben und Methoden und Eigenschaften und Events und sowas...
Die Idee währe aber gar nicht mal so schlecht.... Was ich aber noch nicht funktioniert sind Events. Was du wahrscheinlich willst ist, einem Klassenevent im Script eine Scriptfunktion zuzuweisen - das funktioniert noch nicht. Ich hab leider auch noch keine genaue Idee, wie ich das genau realisieren kann. Aber bisher ist das noch nicht möglich.
Zitat von extrem:
Bei mir lief die Demo 2 manchmal instabil.
Spätestens wenn ich 3X Ctrl+F9 und dann F9 gedrückt habe, gab es die Fehlermeldung: Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00404448 in module 'PROJECT1.EXE'. Read of address 00C1C654'. Process stopped. Use Step or Run to continue. |
Zitat |
Delphi 7 Professional |
#36
Ich hab den Fehler, den mir extrem hier genannt hat gefunden und behoben. Im neuen Release (Version 0.99c) ist der Fehler nicht mehr drinnen. Download der neuen Version und den ChangeLog (diesmal wieder etwas kürzer ) gibts im ersten Post.
Grüße |
Zitat |
rotfc
|
#37
Zitat von littleDave:
Zitat von alzaimar:
Drögen am Mörgen vertreibt Kümmer und Sörgen.
Vielen Dank an alzaimar für sein beruhigendes #25! (* Trotzdem @alzaimar: "Schaun mer mal, dann seh' ma scho'."? Besser: "Schaun mer mal, dann seh(n)'mer scho'. Das erste "wir" = "mer" sollte zum zweiten "wir" = "ma" (bei Dir) passen, oller Preusse LG Roland *) |
Zitat |
|
#38
Da es ein eindeutiges Schuldeingeständnis war, musste ich leider diesen Vorfall den zuständigen Behörden melden.
|
Zitat |
Delphi 7 Professional |
#40
So, um mal wieder vom OT wegzukommen , hab ich mal wieder eine neue Version hochgeladen.
Diesmal gibt es wieder eine sehr wichtige Erweiterung: try-finally und try-except - Blöcke. Dies Blöcke können natürlich auch verschachtelt werden, klar . Was jedoch nicht unterstützt wird ist die on e:[ExceptionTyp] do - Anweisung im except-Teil. Exception-Klassen beherrscht die Script-Sprache nicht. Aber ich schau, dass ich das auch noch einbaue. Außerdem arbeite ich im Moment daran, die ScriptEngine auch FPC-kompatibel zu machen. Ich hab zwar FPC [noch] nicht installiert, aber das kommt noch. Was ich jetzt aber schon mal gemacht habe: ich habe die "uses Windows" - Deklaration aus dem Quelltext verbannt. Falls jedoch die Unit Windows benutzt werden muss, hab ich sie mit {$IFDEF WIN32} eingebunden. Außerdem hab ich die Funktion "CopyMemory" aus der "uSygRunTime" durch die Pascal-Funktion "Move" ersetzt. Ich weiß jetzt zwar nicht, ob "Move" in FPC bereits unterstützt wird, jedoch ist dies wahrscheinlicher als dass die Windows-Funktion "CopyMemory" unterstützt wird Und jetzt mal was ganz besonderes: ich hab seit dem letzten Release kein Bug mehr gefunden - hoffentlich bleibt das so (also das mit "kein Bug vorhanden sein" natürlich, nicht das "keinen Bug finden" ) Den Download gibt (wie immer) im ersten Post Grüße Dave |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |