AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte ScriptEngine II (v. 0.6.1)
Thema durchsuchen
Ansicht
Themen-Optionen

ScriptEngine II (v. 0.6.1)

Ein Thema von littleDave · begonnen am 21. Sep 2009 · letzter Beitrag vom 4. Aug 2011
Antwort Antwort
Seite 4 von 12   « Erste     234 56     Letzte »    
Benutzerbild von littleDave
littleDave
Registriert seit: 27. Apr 2006
Hallo liebe DP'ler

ScriptEngineII


ist der Nachfolger meiner letzten ScriptEngine. Da es sich um ein komplettes Remake handelt, sind die beiden jedoch nicht mehr vergleichbar.

Kurzübersicht
  • Die Script-Engine bnutzt Object-Pascal als Script-Sprache und unterstützt objekt-orientierte Programmierung.
  • Der Quelltext wird in ByteCode übersetzt, der dann von einer optimierten RunTime ausgeführt wird
  • Trotz der Möglichkeiten ist das Interface der Komponente sehr klein und übersichtlich gehalten
  • Für den Einstieg habe ich eine kleine Doku in Form eines PDFs mit in den Download gepackt

Installation
In der ZIP-Datei befindet sich ein Unterordner "src". Diesen extrahiert ihr einfach in einen Ordner eurer Wahl und fügt diesen Ordner dann in den Bibliothekspfad von Delphi hinzu. Im Quelltextorder befindet sich die Datei "ScriptEngine.inc". Diese Datei kann zum konfigurieren der ScriptEngine benutzt werden. Die einzelnen Defines sind (hoffentlich) ausreichend erklärt.

Benötigte Delphi-Version
Bisher hab ich es nur mit Delphi 7 und mit Lazarus getestet. Unter FreePascal hab ich nur ein paar Tests ausgeführt und diese sind auch korrekt gelaufen. Unter Delphi 2009/2010 hab ich die ScriptEngine ebenfalls erfolgreich getestet.

Besonderheiten
  • wenn man innerhalb einer Klassenmethode auf andere Klassenmethoden oder -Variablen zugreifen will, muss man immer "Self" mit angeben
    Update 10.10.2010
    Mit der Version ist 0.5.4.1 ist das nun nicht mehr notwendig!
  • Records sind Referenz-Typen

Bisherige Probleme
Im Moment sind noch folgende Probleme vorhanden:
  • überladene Methoden haben bisher folgende Einschränkung:
    • sie müssen alle vom selben Typ sein (statisch, nicht statisch)
  • der Befehl reintroduce ist noch nicht vorhanden

Lizenz
MPL v1.1 , GPL v3.0 oder LGPL v3.0

Feature-Liste
  • Übersicht
    • Object-Pascal als Dialekt
    • Ganzzahltypen: byte, shortint, word, smallint, cardinal, integer, int64
    • Fließkommatypen: single, double
    • Stringtypen: string, UTF8String, WideString
    • Operatoren: + - * / div mod shr shl and or xor not @
    • Vergleich: = < > <= >= <> is
    • Schleifen: for while repeat for-in-do
    • Datenvergleich: if case
    • Spezielle Blocks: try-finally / try-except
    • Konstanten
    • verschachtelte Unit-Namen (z.B. Unit1.SubUnit.SubUnit)
    • Partielle Units
    • Ablaufkontrolle: continue break exit
    • Exception-Handling und Exception-Throw möglich
    • Multi-Threading-Scripts
  • Methoden
    • Methodentypen: procedure function constructor destructor
    • Methodenparametertypen: const var
    • Methodenoperatoren: virtual abstract override overload forward
    • Import von DLL-Methoden direkt im Script (z.B.: procedure Sleep(milliSec: DWORD); external 'kernel32.dllname 'Sleep'; stdcall; )
    • OOP-Features: inherited
    • Spezielle Operatoren: external export
    • Unterstützte Aufrufkonventionen: register pascal stdcall cdecl
    • Methoden-Pointer
    • Events
  • Records
    • Abschnitte: private protected public
    • Record-Constanten (const-Deklaration in der record-Deklaration)
    • (statische) Record-Methoden
    • (statische) Record-Variablen
    • (statische) Record-Properties
    • Property-Typen: read+write, read-only, write-only
    • Property-Zugriff: direkt, über Methoden, über Methoden mit Parametern
  • Klassen
    • Objekt-Orientierte Programmierung
    • Klassenvererbung
    • Methoden überschreiben
    • Klassen-Sektionen: private protected public
    • Class-Constanten (const-Deklaration in der Class-Deklaration)
    • (statische) Klassenmethoden
    • (statische) Klassenvariablen
    • (statische) Klassenproperties
    • Property-Typen: read+write, read-only, write-only
    • Property-Zugriff: direkt, über Methoden, über Methoden mit Parametern
    • Partielle Klassen (so ähnlich wie bei .NET)
  • Class Helpers
    • Es können zu jedem Datentyp beliebig viele "Helfer-Klassen" erstellt werden
    • gleicher Aufbau wie bei normalen Klassen, nur die Deklaration ist etwas anders:
      • TStringHelper = helper for string
    • Class Helpers erweitern eine Klasse/einen Datentyp ohne die Vererbung zu nutzen
  • Compiler
    • schneller Compiler
    • eingebauter Unit-Cache für schnelleres kompilieren (so wie Delphi-DCUs)
    • partielle Units – mehrere einzelne Units mit gleichem Namen werden zu einer Unit zusammengefasst
    • Linker zum zusammenstellen und zum optimieren des Byte-Codes
    • IntelliSense / Code-Completion und Parameter-Hints-Unterstützung
    • eingebaut als abstrakte Klasse – für SynEdit bereits vorhanden
    • Speichern des kompilierten ByteCodes in einen Stream
  • RunTime
    • schneller ByteCode-Interpreter
    • direkter Aufruf von Delphi-Funktionen
    • Script-Methoden aus dem Programm heraus aufrufbar
    • Script-Methoden als TMethod-Event nativ aufrufbar
    • einfacher Garbage Collector für Script-Klassen (nur falls das Objekt nicht manuell zerstört wurde)
    • eigener Memory-Manager mit Caching für schnelleres Ausführen und für weniger Speicherfragmentierung
    • Exception-Handling
    • Stack-Tracing
  • Quelltext
    • durchgehende Namenskonvention (Units starten mit uSE2 und Klassen mit TSE2)
    • bisher keine Memory-Leaks gefunden

Noch ein paar kurze Hinweise
- Diesmal habe ich leider nicht so viele Beispiele mit in den Download hinein gepackt - es werden aber noch ein paar nachgeliefert

SVN
Ich hab für die Script-Engine ein Source-Forge-Projekt erstellt. Dort sind alle Änderungen auch per SVN abrufbar. Wichtige Releases werd ich natürlich weiterhin hier hochladen

Mitgelieferte IDE
Ich habe die kompilierte Version meiner aktuellen IDE mit in das Download-Paket gepackt. Zusätzlich hab ich den Source in den Unterordner IDEsrc gepackt - zusammen mit den drei kompilierten Packages. Mit der IDE kann man ein paar Testprojekte öffnen, die sich im Unterordner "Projects" befinden.

Ich hoffe, euch gefällt die neue Script-Engine und vielleicht kann der eine oder andere sie ja benutzen.

Download
Auf SourceForge.net (ca. 2,6 MB)

Grüße
Miniaturansicht angehängter Grafiken
screenshot1.png  
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

Geändert von littleDave (10. Apr 2011 um 13:59 Uhr)
 
Florian Hämmerle
 
#31
  Alt 30. Sep 2009, 09:10
Hat deine Scriptsprache bzw. deine Scripengine schon einen Namen? Deine erste Engine hieß ja SY.... .
Arbeitest du schon in einem deiner Projekte mit der neuen Scriptsprache (Widget-Engine oder ähnliches)?

mfg Florian
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#32
  Alt 30. Sep 2009, 16:53
Zitat von toms:
Es läuft soweit unter Delphi 2010, es gibt jedoch einige Warnungen.
Ich hab mir jetzt die Trial von Delphi 2010 heruntergeladen und die ScriptEngine darin kompiliert. Ich habe alle Warnungen behoben und ein paar Tests gemacht. Bisher gab es keine Probleme mehr mit Delphi 2010 - somit sollte man die ScriptEngine ab der neuen Version (ist bereits online) auch mit Delphi 2009/2010 benutzen können.

@himitsu
Das $IF scheint ja sehr mächtig zu sein . Mal schauen, ob ich das benutzen kann Danke für die Infos


Zitat von Florian Hämmerle:
Hat deine Scriptsprache bzw. deine Scripengine schon einen Namen? Deine erste Engine hieß ja SY.... .
Ja, einen Namen hat die schon: ScriptEngine II .

Zitat von Florian Hämmerle:
Arbeitest du schon in einem deiner Projekte mit der neuen Scriptsprache (Widget-Engine oder ähnliches)?
Also die Script-Engine ist schon produktiv in einem Projekt drinnen, jedoch hab ich das bisher in der DP noch nicht veröffentlicht - das dauert auch noch eine Weile. Wer aber mehr wissen will, kann sich meinen Gael Development Blog anschauen - ist mal wieder was mit OpenGL .

Die Widget-Engine befindet sich gerade noch im Winterschlaf . Jedoch will ich die neue Script-Sprache auch in die Widget-Engine einbauen. Zuvor muss ich mir aber erst ein Interface für die Widget-Engine überlegen und vielleicht die ein oder andere Veränderung machen.

@All: Es gibt eine neue Version der Script-Engine Version: 0.3.4.0
Ich habe gerade eine neue Version der Script-Engine hochgeladen. Diesmal hab ich einiges verbessert:
  • Delphi 2010 Support
    Dank toms hab ich die Script-Engine jetzt auch kompatibel mit Delphi 2010 (und somit auch mit 2009) gemacht. Um das zu Testen, hab ich mir zudem noch die Trial heruntergeladen. Bisher gab es mit D2010 keine Probleme.
  • Delphi 6 Support
    Dank toms hab ich die 4 Funktionen, die in Delphi 6 nicht vorhanden waren, durch eigene ersetzt. Somit sollte die Script-Engine jetzt auch mit Delphi 6 funktionieren - jedoch hab ich keine weiteren Tests gemacht, da ich kein Delphi 6 habe.
  • FreePascal Support
    Ich habe (hoffentlich) alle Windows-spezifischen Teile in FreePascal deaktiviert. Somit sollten nun keine Probleme mehr vorhanden sein.
  • Konfiguration
    Ich habe die Datei "ScriptEngine.inc" extrem aufgepeppt. Jetzt findet man in der Include-Datei einen Konfigurations-Abschnitt, mit dem man die Script-Engine beim kompilieren des Delphi-Projektes ein wenig anpassen kann. Ich hoffe, ich habe alle Defines genügend beschrieben
  • Erweiterung bei der Script-Engine
    Ich habe die Helper-Klassen von Single und Double noch um ein paar weitere Funktionen erweitert. Zudem gibt es ein neues Keyword in der ScriptEngine: deprecated. Mit diesem Keyword kann man Typen, Variablen, Klassen oder Funktionen als Veraltet markieren. Nach dem Keyword kann man noch einen String eingeben, der dann der Compiler-Warnung hinzugefügt wird.
  • IntelliSense
    Ich habe den Inhalt, der in der IntelliSense-Klasse ausgegeben wird, erweitert. Somit werden jetzt auch Unit-Namen und die Basis-Typen von Klassen und von eigenen Typen angezeigt.
  • Dokumentation
    Ich habe nun endlich Partielle Klassen und Class Helper mit in das PDF mit aufgenommen. Zwar sind die Abschnitt nicht sehr lang, doch ich hoffe, dass es verständlich rübergekommen ist.
  • Mitgelieferte IDE
    Ich habe nun meine aktuelle IDE mit in den Download gepackt. Damit könnt ihr mal etwas rumspielen. Den Quelltext muss ich noch etwas überarbeiten und liefere ihn somit erst etwas später nach.

Grüße

Edit - falsche Version
Ich hab leider die falsche Version hochgeladen Alle, die sich das Paket vor dem 30.09.2009 23:30 Uhr heruntergeladen haben, haben leider eine alte Version. Ich hab gerade die richtige hochgeladen - Sorry. In der alten Version gab es noch ein Problem mit partiellen Klassen.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#33
  Alt 1. Okt 2009, 20:58
So, es gibt (schon wieder ) ein kleines Update Version 0.3.4.1

Dies ist nur eine Bugfix-Version und bringt keine neuen Features. Folgendes hab ich verbessert:
  • IntelliSense
    Die Unitnamen werden beim IntelliSense-Fenster jetzt nur dann angezeigt, wenn sie erlaubt sind.
  • Klassen-Ableitung
    Mann kann nun nicht mehr eine rekursive Klassendeklaration angeben (gab einen Stack-Overflow-Error)
  • Klassen forwarden
    Es gab einen kleinen Parser-Fehler, wenn man Klassen forwarden wollte
Grüße
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#34
  Alt 5. Okt 2009, 20:04
Es gibt mal wieder ein Update Version 0.3.5.0

Folgendes hat sich verändert:
  • Bug fixes
    • FindMethod hat den Rückgabetyp nicht überprüft
    • Kritischer Fehler in String-Umwandlung: man konnte keine verschiedenen String-Typen benutzen
  • IDE
    • Konsolen-Fenster hat nicht mehr das Hauptformular als Parent (gab Probleme mit Windows 7)
    • Beim "Save Project" kommt jetzt der normale Windows-Dialog
    • Neues Demoprojekt: NativeCallTest
  • Neue Features
    • Script-Funktionen können jetzt auch zu TMethod gecastet werden (Beispiel im PDF)
    • Funktions-Pointer der importierten Methoden werden jetzt nur einmal pro TSE2PE-Instanz gesetzt

SVN
Auf Drängen von EugenB hab ich ein SourceForge-Projekt für die ScriptEngineII erstellt . Somit kann man sich jetzt immer den aktuellsten Quelltext per SVN herunterladen.

Nativer Script-Methoden-Aufruf
Wie bereits gesagt kann man jetzt die Script-Methoden auch "nativ" aufrufen. Um das mal etwas zu verdeutlichen hier mal ein Beispiel:

Sagen wir mal, ich will folgende Script-Methode dem FormResize-Event zuweisen:
Delphi-Quellcode:
var
  formWidth, formHeight : integer;

procedure MyFormResize(Sender: TObject);
begin
  formWidth := TForm(Sender).Width;
  formHeight := TForm(Sender).Height;
end;
Bisher musste man immer eine Wrapper-Funktion bauen, die folgendermaßen aussehen konnte:
Delphi-Quellcode:
// ....
  Self.OnResize := MyCustomHandler;
// ...

procedure TForm1.MyCustomHandler(Sender: TObject);
var Method : Pointer;
begin
  Method := Self.FRunTime.CodeAccess.FindMethod('MyFormResize', '', [pmIn], [btObject]);
  if Method <> nil then
     Self.FRunTime.Call(Method, [Sender]);
end;
Dann wurde bei jedem Event erst die Funktion "MyCustomHandler" ausgeführt, in der dann die Script-Funktion ausgeführt wurde.
Nun kann man wie folgt machen
Delphi-Quellcode:
// ....
  Self.OnResize := MyCustomHandler;
// ...

procedure TForm1.SetEventHandler;
var Method : Pointer;
    MyEvent: TNotifyEvent;
begin
  Method := Self.FRunTime.CodeAccess.FindMethod('MyFormResize', '', [pmIn], [btObject]);
  if Method <> nil then
  begin
    MyEvent := TNotifyEvent( Self.FRunTime.ScriptAsMethod(Method, nil) );
    Self.OnResize := MyEvent; // <-----
  end;
end;
Jetzt wird bei jedem OnResize-Event automatisch die Script-Funktion ausgeführt.

Man kann die Events zwar noch (!!!) nicht in der Script-Engine selber setzten, da man noch keine Methoden als Typ deklariert kann. Aber sobald man das machen kann, kann man die Events dann auch in der Script-Engine selber setzen.

Natürlich kann man nicht nur normale Funktionen "nativ" ausführen. Man kann auch Klassen-Methoden so aufrufen - aber ich hab das alles im PDF beschrieben.

Grüße
  Mit Zitat antworten Zitat
_x_
 
#35
  Alt 5. Okt 2009, 20:06
Eine Frage: Ist die IDE auch unter Linux lauffähig?

mfg _X_
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#36
  Alt 5. Okt 2009, 20:16
Zitat von _x_:
Eine Frage: Ist die IDE auch unter Linux lauffähig?

mfg _X_
Mit Wine sollte es funktionieren. Ich hab bei mir kein Linux, daher kann ich es auch nicht ausprobieren. Hab im Moment nicht mal Lazarus drauf, da ich am Wochenende die Windows 7 Final installiert habe (MSDN-AA ist schon was geilen - ist bisher schon viel besser als Vista).

An sich ist es ja nur ein Beispiel. Der Quelltext ist zwar immer noch nicht verfügbar kommt aber noch
  Mit Zitat antworten Zitat
_x_
 
#37
  Alt 5. Okt 2009, 20:25
Unter Wine geht die IDE.

Wenn du die JVCL verwendest, (tust du doch, glaub ich, oder? ), kannst du Linux leider abschreiben.

mgh _X_
  Mit Zitat antworten Zitat
EugenB

 
Lazarus
 
#38
  Alt 6. Okt 2009, 15:43
Hey^^,

danke für den SVN ^^

Habe mal die Demos nach Lazarus konvertiert damit man auch mal so kurz testen kann ^^, und dabei herrausgefunden, das Convert.IntToStr nicht funktioniert

SEII-Code:
Console.WriteLine(Convert.IntToStr(32)); Gibt nur eine leere Zeile aus


Weißt du vllt woran es liegt?

Lazarus 0.9.29 (letzter Snapshot)
FPC 2.2.4

Bisher noch keine anderen Bugs gefunden ^^

MfG,
Eugen
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#39
  Alt 6. Okt 2009, 16:53
Zitat von _x_:
Unter Wine geht die IDE.

Wenn du die JVCL verwendest, (tust du doch, glaub ich, oder? ), kannst du Linux leider abschreiben.

mgh _X_
Ja, in der IDE verwende ich die TJvTabBar ... mal schauen, vielleicht kann ich das noch etwas abstrakter gestalten

Zitat von EugenB:
Hey^^,

danke für den SVN ^^
Kein Problem

Zitat von EugenB:
Habe mal die Demos nach Lazarus konvertiert damit man auch mal so kurz testen kann ^^, und dabei herrausgefunden, das Convert.IntToStr nicht funktioniert

SEII-Code:
Console.WriteLine(Convert.IntToStr(32)); Gibt nur eine leere Zeile aus

Weißt du vllt woran es liegt?

Lazarus 0.9.29 (letzter Snapshot)
FPC 2.2.4
Ja, ich glaub ich weiß woran das liegt. Hab das Problem heute auch schon gefunden, da ich den aktuellen Source testen wollte. Das Problem liegt an der Calling-Convention von FPC (soweit ich das mitbekommen habe). In FreePascal werden strings als Rückgabewert von Funktionen auch im EAX-Register zurückgeliefert. Jedenfalls funktioniert es, wenn ich den EAX-Wert nach dem Aufruf einer Funktion auslese. Also eine Lösung ist gefunden, jedoch muss ich die noch weiter ausprobieren .

Zitat von EugenB:
Bisher noch keine anderen Bugs gefunden ^^

MfG,
Eugen
Das ist gut
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#40
  Alt 10. Okt 2009, 12:29
Eine neues Update ist da Version 0.4.0.0

Änderungen
  • Packages
    Man kann jetzt eigene Script-Units oder externe Klassen in DLLs auslagern und diese dann nahtlos in die Script-Engine einfügen. Was jedoch wichtig ist: bei Packages sollte die DLL mit der gleichen Delphi-Version erstellt worden sein wie das Hauptprogramm.

    Leider hab ich noch keine Demo für Packages erstellt, jedoch hab ich bereits die drei Testpackages für die IDE mit in den Download gepackt. Mit diesen Packages hat man Zugriff auf Streams und einige Listen.

    In der IDE gibt es einen Package-Viewer, mit dem man die geladenen Packages anzeigen kann.
  • FreePascal
    Bei FreePascal ist die Call-Convention etwas anders als in Delphi. Dies hat vor allem Strings als Rückgabewert beeinflusst: sie sind nicht angekommen. Dieses Problem sollte nun behoben sein.
  • Memory Leak unter FreePascal behoben (dank an EugenB)
  • Linker
    Der Linker speichert die benutzen Methoden jetzt in einem Baum. Dadurch ist das kompilieren etwas langsamer (ca. 0.1 sek), jedoch werden jetzt nur wirklich die Methoden mit in den finalen ByteCode hineinkopiert, die auch benutzt werden. Das Schlüsselwort export funktioniert weiterhin.
  • Tools
    Es gibt jetzt einen Unit-Importer, mit dem man Delphi-Klassen einfacher der Script-Engine hinzufügen kann. Dafür muss man nur den Interface-Teil der entsprechenden Unit in eine neue Unit in der IDE kopieren. Nachdem sich das neue Script kompilieren lässt (z.B. nachdem man hinter jeder Funktion/Procedure/Methode das Schlüsselwort "external" schreibt), wählt man unter "Project" -> "Generate Unit" -> "Application Unit" aus. Dann wird ein neuer Tab in der IDE geöffnet, dessen Inhalt man einfach komplett in die Zwischenablage kopiert und in eine neue Unit in Delphi einfügt.
  • Sonstiges
    Ein paar Bugs bzw. ein paar zu strenge Regeln im Parser behoben
  • Neue Klasse in der System-Unit: TPersistent

Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 12   « Erste     234 56     Letzte »    


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 15:24 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