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 7 von 12   « Erste     567 89     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
 
#61
  Alt 14. Apr 2010, 19:52
Neues Version Version 0.4.8.0
  • Neue Features
    • Konstanten können jetzt auch in Class-Helpers deklariert werden
    • Der Unit-Cache-Manager hat jetzt ein Event, mit dem man einen eigenen Stream für das Speichern des Caches angeben kann. Zwar ist das noch nicht dokumentiert, werde das aber bei Gelegenheit nachholen.
    • Dynamische Methoden sind jetzt ebenfalls im Call-Stack zu finden
  • Änderungen
    • Stack-Overflow-Handling in den Scripts werden jetzt besser behandelt
    • Der Stack wird jetzt vor dem Finalization-Abschnitt zurückgesetzt
    • das Lesen von Properties kann jetzt weiter verschachtelt werden als vorher
  • Bug-Fixes
    • Ein paar seltene Probleme beim Linken behoben
    • Das Überprüfen von Procedure-Pointer (z.B. bei Events) hat zur Laufzeit einen Fehler verursacht
    • Variablen-Namen in Methoden wurden nicht mit den Parameter-Namen der Methode auf doppelte Deklarationen überprüft
    • kleines Problem mit break, continue und exit-Anweisungen in verschachtelten Schleifen behoben
    • kleiner Bug beim Konvertieren von integer zu string im Parser
    • Enumerations hatten intern eine Datengröße von 0 wodurch man sie nicht in Klassen oder Records verwenden konnte
    • seltene Probleme mit Referenced-Variablen behoben, wenn sie als Parameter an eine Methode übergeben wurden

Der Download befindet sich wie immer im ersten Post ( - oder im SVN)

Grüße

[edit=mkinzler]Link zum 1. Post eingefügt Mfg, mkinzler[/edit]
  Mit Zitat antworten Zitat
mkinzler

 
Delphi 11 Alexandria
 
#62
  Alt 14. Apr 2010, 20:01
Gute Arbeit!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#63
  Alt 14. Apr 2010, 20:13
Zitat von mkinzler:
Gute Arbeit!
Danke freut mich wirklich
  Mit Zitat antworten Zitat
EugenB

 
Lazarus
 
#64
  Alt 14. Apr 2010, 20:24
Zitat von mkinzler:
Gute Arbeit!
Genau, gute Arbeit

Dank dem neuen Stack-Overflow-Handling hab ich nun auch nen blockierenden Fehler gelöst bekommen danke
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#65
  Alt 14. Apr 2010, 21:52
Zitat von EugenB:
Dank dem neuen Stack-Overflow-Handling hab ich nun auch nen blockierenden Fehler gelöst bekommen danke
Da bin ich aber froh . Freut mich

Wegen dem Feature-Request in deiner Mail (Quelltext-Zeilen bei Fehlern): ich überlege mir im Moment ein Debugger-Interface, mit dem solche Informationen dann ausgelesen werden können. Die kompilierten Daten (also TSE2PE) enthalten absichtlich so wenig Informationen wie möglich. Daher sind auch keine Quelltext-Zeilen mit drinnen. Ich werde wahrscheinlich einen weiteren Container definieren, die dann die nötigen Informationen beinhalten. Aber das geistert bei mir im Moment nur im Kopf herum - konkrete Sachen kann ich daher noch nicht sagen.
  Mit Zitat antworten Zitat
schöni

 
Delphi 7 Personal
 
#66
  Alt 15. Apr 2010, 08:32
Suuuper! Danke für die Arbeit.

Hab mir die Ide der Script Engine angesehen. Baue seber auch grad ne IDE. Daher mein Interesse.

Gute Arbeit.

Schön wäre noch Debugging auf Quellcodeebene. Debugfähigkeiten fehlen in meiner IDE noch völlig. Da kämpde ich noch mit der Schnittstelle.
Meine IDE ist als "Einfache Freepascal IDE" unter Freeware hier in der DP zu finden.

Deine ist optisch schöner. Und es ist nicht die X-te Pascal IDE, sondern eine Scriptmaschine mit den daraus resultierenden Möglichkeiten.

Ein dickes Lob von mir.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#67
  Alt 15. Apr 2010, 18:09
Noch ein schnelles Update Version 0.4.8.1

eine wichtige Bug-Fix-Version
  • Bug-Fixes
    • Es gab unter bestimmten Situationen ein größeres Problem bei verschachtelten Record-Aufrufen sowie beim Zugriff auf einzelne Record-Felder. Manchmal funktionierte es, manchmal kamen falsche Werte und manchmal kam es zu Zugriffsverletzungen. Das hing davon ab, ob der interne Cache des Memory-Managers benutzt wird und wie voll dieser war.
  • kleine Änderungen
    • die Größe der kompilierten exe aus Delphi heraus ist jetzt kleiner

Der Download befindet sich wie immer im ersten Post ( - oder im SVN)

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

 
Delphi 7 Professional
 
#68
  Alt 19. Apr 2010, 19:01
Mal wieder ein größeres Update Version 0.4.9.0
  • Neuerungen
    • Der is-Operator (if myVar is TMyClass then ...) ist jetzt eingebaut. Dieser funktioniert jedoch bisher nur mit script-internen Klassen (also nicht mit externen bzw. importierten Klassen)
    • Die case-Anweisung unterstützt jetzt auch mehrere Auswahl-Argumente (getrennt mit Komma)
    • Neuen Unit-Import-Generator: einen generischen Unit-Importer. In dem generierten Quelltext kann dann über zwei defines eingestellt werden, ob der Import als Package oder Anwendungs-Intern erfolgen soll (IDE->Project->Generate Unit->Generic Unit)
    • Unit-Namen können jetzt auch Punkte (.) enthalten. Somit kann man jetzt mehrere Ebenen in die Units einbauen (z.B. Unit1.SubUnit.SubUnit)
    • Neuer DLL-Memory-Manager für die Packages (nur für Windows!). Wenn man ein DLL-Package erstellt, konnte man bisher nur über eine Methode den Memory-Manager setzen. Da diese Methode jedoch erst nach dem Initialisieren von manchen Sachen der VCL gesetzt werden kann, kann man jetzt, wie bei ShareMem, eine besonderen Unit benutzen. Das besondere dabei: Es funktioniert wie ShareMem (also als erste Unit in der DLL die Unit "uSE2DLLMemoryManager" hinzufügen), braucht jedoch keine extra DLL. Da das ganze über Memory-Mapped-Files gelöst ist, ist noch keine Linux-Implementierung vorhanden. Für Linux-Benutzer bleibt jedoch die bisherige Möglichkeit natürlich vorhanden.
    • Ein paar Helper-Methoden für die TStream-Klasse eingebaut
    • Neue Helper-Methode für strings: "LastIndexOf" (umgedrehtes pos -> sucht also nach der letzten Position eines sub-strings in einem string
  • Änderungen
    • Typen-Namen können jetzt auch komplett mit Unit-Namen angegeben werden
    • Geschwindigkeit vom Unit-Cache verbessert
    • Geschwindigkeit vom Tokenizer verbessert
    • Code-Completion durchsucht jetzt auch die Helper-Klassen, um die kompatible Variablen für die Paramter auszuwählen
  • Bug-Fixes
    • Einen weiteren kritischen Fehler im Compiler behoben
    • kleinen Fehler beim finden von Typen behoben

Der Download befindet sich wie immer im ersten Post ( - oder im SVN)

Grüße
  Mit Zitat antworten Zitat
EugenB

 
Lazarus
 
#69
  Alt 22. Apr 2010, 22:46
Zitat von littleDave:
Mal wieder ein größeres Update Version 0.4.9.0

...
Nabend , endlich mal etwas zeit gehabt die Version zu testen (zumindest, es versucht..)

sofort beim Neu Compilieren der Src kommen diese Fehler bei Lazarus:

Code:
Hint: Start of reading config file C:\Lazarus\fpc\2.4.0\bin\i386-win32\fpc.cfg
Hint: End of reading config file C:\Lazarus\fpc\2.4.0\bin\i386-win32\fpc.cfg
Free Pascal Compiler version 2.4.0 [2009/12/18] for i386
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Win32 for i386
Compiling SimpleTest.lpr
Compiling main.pas
Compiling C:\Lazarus\components\SEII\src\uSE2RunTime.pas
Compiling C:\Lazarus\components\SEII\src\uSE2RunCall.pas
Compiling C:\Lazarus\components\SEII\src\uSE2RunTimeClasses.pas
{...}
C:\Lazarus\components\SEII\src\uSE2RunCall.pas(717,13) Hint: Conversion between ordinals and pointers is not portable
C:\Lazarus\components\SEII\src\uSE2RunCall.pas(8,38) Hint: Unit "uSE2BaseTypes" not used in uSE2RunCall
Compiling C:\Lazarus\components\SEII\src\uSE2IncHelpers.pas
C:\Lazarus\components\SEII\src\uSE2IncHelpers.pas(562,38) Hint: Parameter "Target" not used
C:\Lazarus\components\SEII\src\uSE2IncHelpers.pas(8,12) Hint: Unit "uSE2Types" not used in uSE2IncHelpers
C:\Lazarus\components\SEII\src\uSE2IncHelpers.pas(8,27) Hint: Unit "uSE2BaseTypes" not used in uSE2IncHelpers
Compiling C:\Lazarus\components\SEII\src\uSE2Packages.pas
Compiling C:\Lazarus\components\SEII\src\uSE2DLLMemoryManager.pas
C:\Lazarus\components\SEII\src\uSE2DLLMemoryManager.pas(76,24) Hint: Local variable "mm" does not seem to be initialized
C:\Lazarus\components\SEII\src\uSE2DLLMemoryManager.pas(144,7) Fatal: Selected assembler reader not supported
Da haben wir wieder das schöne Assembler ....

Entweder bei FPC die alte Variante nutzen, oder halt irgendwie für FPC ne andere Assembler Version nehmen

MfG
Eugen
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

 
Delphi 7 Professional
 
#70
  Alt 24. Apr 2010, 22:00
Zitat von EugenB:
Nabend , endlich mal etwas zeit gehabt die Version zu testen (zumindest, es versucht..)
sofort beim Neu Compilieren der Src kommen diese Fehler bei Lazarus:
Sollte behoben sein, denn .....

Version 0.5.0.0
  • Neuerungen
    • TObject hat eine neue Funktion: ClassName: liefert den Strong-Name der Klasse (Unit.Name)
    • Neue Unit: System.Diagnostics: Enthällt die Klasse Debug (noch nicht ganz fertig) (Debug.Assert)
    • Exception-Handling in der Script-Engine erweitert (bzw. eingebaut)
  • Änderungen
    • die Funktion TSE2RunTime.GetCallStack hat nun eine optionale maximale Stack-Tiefe, die ausgewertet wird
    • Die Geschwindigkeit des Stack ist nun besser. Dadurch werden vor allem sehr verschachtelte, rekursive Aufrufe sehr viel schneller
    • Die Streams in den Beispiel-Packages "Streams" sind jetzt in der Unit "IO.Streams"
  • Bug-Fixes
    • Das von EugenB beschriebene Problem in der uSE2DLLMemoryManager.pas unter FPC behoben
    • Parameter-Typen in Methoden können jetzt auch mit Unit-Name angegeben werden

Noch mal zum Exception-Handling. Es ist jetzt in der Script-Engine möglich, Exceptions abzufangen, auszuwerten und sogar eigene zu werfen. Dabei gibt nicht wie bei den Klassen zwei verschiedene Root-Objekte für die Exceptions, sondern es gibt nur einen Root-Typ. Wie das ganze genau funktioniert, habe ich in das pdf gepackt. Download habe ich ja eine vorkompilierte Version der Beispiel-IDE mitgeliefert. In dieser könnt ihr mal das Projekt "Projects\Exception Test Studio\ExceptStudio.sproject" öffnen und durchlaufen lassen.


Der Download befindet sich wie immer im ersten Post ( - oder im SVN)

Grüße
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 12   « Erste     567 89     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 10:43 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