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 3 von 12     123 45     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)
 
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#21
  Alt 27. Sep 2009, 20:02
Ich habe gerade ein Problem gefunden, bei dem auch der Cache-Manager betroffen ist - vielleicht liegt es daran:

In der Datei "uSE2Consts.pas" findet man folgende Zeile:
Delphi-Quellcode:
class procedure TSE2StreamHelper.WriteString(Stream: TStream;
  const s: string);
var len: cardinal;
begin
  len := length(s);
  Stream.Write(len, SizeOf(len) * SizeOf(char)); // <-- hier ist ein fehler
  Stream.Write(s[1], len);
end;
Diese muss man durch folgende Zeilen ersetzen
Delphi-Quellcode:
class procedure TSE2StreamHelper.WriteString(Stream: TStream;
  const s: string);
var len: cardinal;
begin
  len := length(s);
  Stream.Write(len, SizeOf(len));
  Stream.Write(s[1], len * SizeOf(char)); // <-- muss nur eine Zeile weiter drunter
end;
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#22
  Alt 27. Sep 2009, 21:26
Ich hab gerade eine neue Version hochgeladen Version 0.3.3.0

Zum einen hab ich den Bug, den ich gerade beschrieben habe beseitigt. Zudem hab ich noch ein Problem behoben, der mit aktivierten Range-Check aufgetreten ist (Danke an _X_ für den Hinweis).

Es gibt auch eine neue Unit: "uSE2IncHelpers.pas". Bindet man diese Unit ein, sind ein paar Helper-Klassen für die Typen TDateTime, String, Pointer, Single, Double und TColor eingebaut. Die Helper-Funktionen sind auch in der eingebauten IntelliSense-Funktion verfügbar.

Hier mal zwei, drei Beispiele, die mit den Helper-Klassen möglich sind:
Delphi-Quellcode:
var time: TDateTime;
    str : string;
    ptr : pointer;
    dbl : double;
    res : boolean;
begin
  res := dbl.IsNan;
  res := ptr.Assigned;
  res := (str.IndexOf('h') > 10) and (str.EndsWith('hey'));
  res := (time.Month > 2) and (time.DayOfYear > 128);
end.
Um die Helper-Klassen zu benutzen muss man nur die Unit "uSE2IncHelpers" in die Uses-Liste der Anwendung aufnehmen.

Leider hab ich es noch nicht geschafft, die Helper-Klassen sowie die partiellen Klassen in das PDF mit aufzunehmen - ich werd es aber noch nachholen.

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms

 
Delphi XE Professional
 
#23
  Alt 28. Sep 2009, 06:52
Zitat von littleDave:
Zitat von toms:
Unter Delphi 6 lässt es sich nicht kompilieren. Einige Funktionen sind in der SysUtils.pas noch nicht vorhanden.
Wenn das nicht zu viele seien sollten, wäre es super, wenn du mir eben ne Liste schreiben würdest - dann schmeiß ich diese per Compiler-Switch heraus.

Zitat:
[Error] uSE2IncStrings.pas(306): Undeclared identifier: 'LeftBStr'
[Error] uSE2IncStrings.pas(328): Undeclared identifier: 'MidBStr'
[Error] uSE2IncStrings.pas(345): Undeclared identifier: 'PosEx'
[Error] uSE2IncStrings.pas(350): Undeclared identifier: 'PosEx'
[Error] uSE2IncStrings.pas(366): Undeclared identifier: 'RightBStr'
Diese Funktionen lassen sich leicht nachbauen (anstatt diese per Compiler-Switch herauszuschmeißen)
Thomas
  Mit Zitat antworten Zitat
_x_
 
#24
  Alt 28. Sep 2009, 16:46
Unter Linux bekommt man in der Unit uSE2PerfMonitor kleine Probs mit Uses Windows; Bitte ein {$IFNDEF FPC} reinmachen.

mfg _X_
  Mit Zitat antworten Zitat
EugenB

 
Lazarus
 
#25
  Alt 28. Sep 2009, 17:52
Ich freu mich das es endlich das die Version der ScriptEngine gibt

Aber leider schade das man keine Antwort per PN bekommt

Anyway, weiter so , endlich mal ne OOP Scriptsprache =)
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#26
  Alt 28. Sep 2009, 20:21
Zitat von toms:
Zitat von littleDave:
Zitat von toms:
Unter Delphi 6 lässt es sich nicht kompilieren. Einige Funktionen sind in der SysUtils.pas noch nicht vorhanden.
Wenn das nicht zu viele seien sollten, wäre es super, wenn du mir eben ne Liste schreiben würdest - dann schmeiß ich diese per Compiler-Switch heraus.
Zitat:
[Error] uSE2IncStrings.pas(306): Undeclared identifier: 'LeftBStr'
[Error] uSE2IncStrings.pas(328): Undeclared identifier: 'MidBStr'
[Error] uSE2IncStrings.pas(345): Undeclared identifier: 'PosEx'
[Error] uSE2IncStrings.pas(350): Undeclared identifier: 'PosEx'
[Error] uSE2IncStrings.pas(366): Undeclared identifier: 'RightBStr'
Diese Funktionen lassen sich leicht nachbauen (anstatt diese per Compiler-Switch herauszuschmeißen)
Vielen Dank für die Liste - die nächste Version wird die Funktionen nachgebaut drinnen haben. Danke für die Mühe

Zitat von _x_:
Unter Linux bekommt man in der Unit uSE2PerfMonitor kleine Probs mit Uses Windows; Bitte ein {$IFNDEF FPC} reinmachen.

mfg _X_
Ist in der aktuellen Version bereits so eingebaut - es wird auch ein Konfigurations-File geben mit dem man das Kompilieren der Script-Engine einstellen kann.

Zitat von EugenB:
Ich freu mich das es endlich das die Version der ScriptEngine gibt
[...]
Anyway, weiter so , endlich mal ne OOP Scriptsprache =)
Danke für das Lob Freut mich, dass sie ankommt.

Zitat von EugenB:
Aber leider schade das man keine Antwort per PN bekommt
Oh, ist meine Nachricht nicht gesendet worden ? Komisch ... hol ich aber gleich nach.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#27
  Alt 28. Sep 2009, 21:14
Zitat von littleDave:
Vielen Dank für die Liste - die nächste Version wird die Funktionen nachgebaut drinnen haben.
mach die einfach ein nur dann rein, wenn auch nötig ... es muß in aktuellen Versionen ja nicht unbedingt doppelter Ersatz-Code vorhanden sein

Delphi-Quellcode:
{$IF not Declared(PosEx)}
  function PosEx(...): string;
  begin
    ...
  end;
{$IFEND}
bzw.
Delphi-Quellcode:
interface
  {$IF not Declared(PosEx)}
    function PosEx(...): string;
    {$DEFINE INCLUDE_POSEX}
  {$IFEND}

implementation
  {$IFDEF INCLUDE_POSEX}
    function PosEx(...): string;
    begin
      ...
    end;
  {$ENDIF}
[add]
OK, man könnte es auch von der Delphi-Verion abhängig machen, aber so ist es wohl einfacher ... also wenn man nicht ständig gucken muß, wann was eingeführt wurde usw.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#28
  Alt 28. Sep 2009, 21:40
Zitat von himitsu:
mach die einfach ein nur dann rein, wenn auch nötig ... es muß in aktuellen Versionen ja nicht unbedingt doppelter Ersatz-Code vorhanden sein
Ich habs so gelöst:

Delphi-Quellcode:
{$IFNDEF DELPHI7UP}
function PosEx(....)
begin
  (...)
end;
{$ENDIF}

// Aufruf:
{$IFDEF DELPHI7UP}
  result := StrUtils.PosEx(....);
{$ELSE}
  result := PosEx(...);
{$ENDIF}
Das Define "DELPHI7UP" wird per Include-File gesetzt, dass in jede Unit der Script-Engine eingebunden wird.

Zitat von himitsu:
Delphi-Quellcode:
{$IF not Declared(PosEx)}
  function PosEx(...): string;
  begin
    ...
  end;
{$IFEND}
geht das wirklich - also das "IF not Declared(PosEx)"? Ich dachte, per Compiler-Switch kann man generell nicht auf Delphi-Elemente zugreifen bzw. überprüfen, ob etwas bereits vorhanden ist

Zitat von himitsu:
OK, man könnte es auch von der Delphi-Verion abhängig machen, aber so ist es wohl einfacher ... also wenn man nicht ständig gucken muß, wann was eingeführt wurde usw.
Ich habs jetzt so gelöst, da ich das "declared" nicht kannte.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms

 
Delphi XE Professional
 
#29
  Alt 28. Sep 2009, 22:00
Es läuft soweit unter Delphi 2010, es gibt jedoch einige Warnungen.
Angehängte Dateien
Dateityp: txt d2010_warnungen_121.txt (6,3 KB, 5x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#30
  Alt 28. Sep 2009, 22:03
Zitat von littleDave:
geht das wirklich - also das "IF not Declared(PosEx)"? Ich dachte, per Compiler-Switch kann man generell nicht auf Delphi-Elemente zugreifen bzw. überprüfen, ob etwas bereits vorhanden ist
Also Funktionen aufrufen oder auf Variableninhalte zugreifen geht natürlich nicht,
aber die "Funktionen" Declared (für Funktionen, Klassen, Konstanten und Variablen) und Defined für Compilerschalter geht.

Ich weiß jetzt nur nicht in welcher Delphiversion das {$IF ...} eingeführt wurde.

Delphi-Quellcode:
{$DEFINE Schalter1}

// dieses
{$IFDEF Schalter1}
  {$IFDEF Schalter2}
    ...
  {$ENDIF}
{$ENDIF}

// ist das Gleiche wie das
{$IF Defined(Schalter1) and Defined(Schalter2)}
  ...
{$IFEND}

// und dann gibt es noch sowas

{$IF not Declared(xyz)} {$MESSAGE Hint 'xyz gibt es nicht'} {$IFEND}

const xyz = 5;

{$IF Declared(xyz)} {$MESSAGE Hint 'jetzt schon'} {$IFEND}

{$IF xyz = 5} {$MESSAGE Hint 'xyz ist 5'} {$IFEND}
[add]
die D2010-Warungen sollten so wohl auch schon in/ab D2009 kommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 12     123 45     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 03:38 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