Script-Engine (Compiler+Interpreter) entwickelt

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Arakis
User
Beiträge: 6
Registriert: Dienstag 21. November 2006, 10:52

Dienstag 21. November 2006, 10:53

Ich habe einen Script-Kompilierer/-Interperter in .NET geschrieben, um Scripte in einer speziellen Sprache auszuführen, ohne dass dabei temporäre Assemblies den Speicher zumüllen. Die Syntax ist an Java/PHP/c# angelehnt. Die Script-Engine selbst ist in VB.NET geschrieben.

Die Script-Engine bietet folgendes:
- Alle gängigen Sprachelemente wie Deklaration, Schleifen, Bedingungen, Eigene Funktionen, ...
- Objektorientiert(Klassen müssen zuvor in .NET geschrieben worden sein)
- Kann in jedes beliebige .NET Programm eingebunden werden um Dinge zu automatisieren/anpassbar zu gestalten.
- Bei Beendigung eines Script wird der reservierte Speicher wieder freigegeben, es bleiben keine Temporären Assemblies wie bei einer nativen .NET Kompilierung im Speicher.
- Die Script-Engine kann so eingestellt werden, dass sie wie eine Sandbox arbeitet, in der auch unsicherer Code ausgeführt werden kann.
- Die Script-Engine kann aber auch so eingestellt werden, dass sie Vollzugriff auf die Host-Anwendung hat.
- Das Einbinden der Script-Engine in die eigene Applikation ist sehr einfach.
- Für nicht-kommerzielle Nutzung kostenlos.

Hier ist die Projekt-Url: http://scripting.larne.de

Leider habe ich noch nicht viel Doku geschrieben :/

Ich bin für jedes Feedback dankbar.

Grüße,
Sebastian
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 21. November 2006, 11:32

Arakis hat geschrieben:Die Syntax ist an Java/PHP/c# angelehnt.
Mir wird gleich übel... :?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Arakis
User
Beiträge: 6
Registriert: Dienstag 21. November 2006, 10:52

Dienstag 21. November 2006, 12:22

Man könnte auch meinen es könne einem von Python übel werden, wobei ich da Perl noch um einiges krasser finde von der Syntax her. Aber es wäre schön wenn wir uns darauf einigen könnten sachlich und konstruktiv zu bleiben.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 21. November 2006, 12:39

Es war nur ein spontaner Gefühlsausbruch ;)

Mir ist auch klar, das es einfacher ist, einen Parser zu schreiben der sich auf Steuerzeichen bezieht, als einen wie der von Python :) Dafür bleiben uns Python anhänger aber so unsinnige Zeichen wie {...} erspart, um Blöcke zu markieren. Außerdem muß man nicht die IMHO unsinnigen ; am Ende von *jeder* Zeile/Befehl schreiben...

Wenn ich mal ein wenig JavaScript schreibe, vergesse ich nämlich des öfteren ein Semikolon am Ende :?

Das Beispiel von deiner Seite:

Code: Alles auswählen

Var List As New ArrayList();
Var i As Integer = 0;
For (i=0 To 10)
{
  List.Add(i*2);
};

Var Value As Integer = 0;
For (Each Value In List)
{
  WriteLine(Value);
};
In Python:

Code: Alles auswählen

List = []
for i in xrange(10):
    List.append(i*2)

Value = 0
for item in List:
    print Value
Wobei mir irgendwie nicht klar ist, was die zweite Schleife bei dir macht, deswegen macht die in Python nicht wirklich viel Sinn...

Gut, der Python code ist kleiner, weil man halt keine Typen bestimmen muß... Aber dennoch, durch die fehlenden Markierungszeichen ist es einfach klarer...


btw. Warum machst du das überhaupt??? Es gibt doch IMHO ein paar Skriptsprachen, u.a. auch Python, für .NET...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 21. November 2006, 12:41

Weil es Spass macht, noch ein Beispiel:

Code: Alles auswählen

VAR var1 AS Integer = 42;
if (var1 < 42)
{
  WriteLine('var1 ist kleiner als 42');
}
elseif (var1 > 42)
{
  WriteLine('var1 ist größer als 42');
}
else
{
  WriteLine('var1 ist weder größer noch kleiner als 42');
}
in Python:

Code: Alles auswählen

var1 = 42
if var1 < 42:
    print 'var1 ist kleiner als 42'
elif var1 > 42:
    print 'var1 ist größer als 42'
else:
    print 'var1 ist weder größer noch kleiner als 42'
EDIT: Ach, was mir da noch auffällt... Muss nicht bei deinem IF-Beispiel ganz am Ende ein Semikolon??? Ich hab das ganze von http://scripting.larne.de/wiki/index.ph ... =Anleitung

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Dienstag 21. November 2006, 12:53

jens hat geschrieben:Es war nur ein spontaner Gefühlsausbruch ;)
Spätestens wenn man die Doku liest ist der durchaus sachlich gerechtfertigt. :twisted:

Da wird ungarische Notation der übelsten Sorte empfohlen. Mir ist jetzt auch schlecht. :?
Mir ist auch klar, das es einfacher ist, einen Parser zu schreiben der sich auf Steuerzeichen bezieht, als einen wie der von Python :) Dafür bleiben uns Python anhänger aber so unsinnige Zeichen wie {...} erspart, um Blöcke zu markieren.


Die Blöcke sind relativ einfach zu parsen. Man muss sich im Lexer nur die Einrückung der vorhergehenden Zeile merken, mit der aktuellen vergleichen und falls beide unterschiedlich sind ein entsprechendes Token für '{' oder '}' liefern. Das ist nur ganz minimal aufwändiger als die Klammern direkt im Quelltext zu haben.
Arakis
User
Beiträge: 6
Registriert: Dienstag 21. November 2006, 10:52

Dienstag 21. November 2006, 13:26

@jens: Richtig, im Prinzip muss da auch ein Semikolon hin, aber da eine geschweifte Klammer im prinzip immer "anweisung beendet" bzw. "code block zu ende" bedeutet, ist es halt nicht unbedingt nötig. Der Parser selbst ist nicht unbedingt der beste, der akzeptiert es manchmal sogar wenn man vergisst klammern zu schließen - nur wird dann auf grund der rekursion die ganze anweisung nicht ausgeführt.
BlackJack

Dienstag 21. November 2006, 14:32

Ich habe die beiden Beispiele mal mit meiner Lieblings-.NET-Sprache umgesetzt:

Code: Alles auswählen

using Nemerle.Collections
using System.Console
using System.Math

def Liste = List.Range (1, 11) . Map (fun (x) { x * 2 })
Liste.Iter(WriteLine : (int -> void))


def Var = 42

def CompareWith42 (value)
    match (Sign (value - 42))
        |  0 => "weder grösser noch kleiner"
        |  1 => "grösser"
        | -1 => "kleiner"
        |  _ => assert (false)  // Should never happen.

WriteLine ("Var ist {0} als 42.", CompareWith42 (Var))
Die Einrückungssyntax wie bei Python gefällt mir besonders gut. Man kann allerdings auch '{}' benutzen, deshalb sind anonyme Funktionen (``fun``) mächtiger als in Python.

Nemerle ist statisch typisiert, versucht aber wo es möglich ist die Typen selbst zu ermitteln. Im Beispiel da oben musste ich nur beim Iterieren über `Liste` nachhelfen, weil es von `System.Console.WriteLine` zwei Varianten gab die vom Typ her passen.
Arakis
User
Beiträge: 6
Registriert: Dienstag 21. November 2006, 10:52

Dienstag 21. November 2006, 14:46

jens hat geschrieben:btw. Warum machst du das überhaupt??? Es gibt doch IMHO ein paar Skriptsprachen, u.a. auch Python, für .NET...
Wenn du ein bestehendes .NET Programm mit Scripten automatisieren möchtest, kann man dies über Plugins oder temporär kompilierten Assemblies lösen. Nachteil ist, dass einmal geladene Assemblies nicht mehr entladen werden, sofern sie in der selben Appdomain geladen wurden. Ist der auszuführnde code jedoch in einer anderen appdomain, so muss .NET Remoting her und dann wird's "Langsam" und das ganze bricht in einer schnittestellen definitions chaos aus, wenn man z.b. 100 klassen hat, welche man veröffentlichen will, welche zig unterobjekte haben. Deshalb habe ich eine Script-engine geschrieben, welche in der selben appdomain laufen kann, im selben prozess und vollzugriff auf sämtlche vorgänge des Host-prozesses hat, sofern man diesen erteilt.

Scripte können so endlos oft während der Laufzeit geändert werden, ohne dass der Speicher mit temporären Assemblies zugemüllt wird - Denn es werden gar keine Assemblies kompiliert, sondern es wird eine zwischen struktur geparst, welche dann rasch ausgeführt werden kann mit dem Larne Script Interpreter.

Grüße,
Sebastian
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 15:37

Arakis hat geschrieben:Man könnte auch meinen es könne einem von Python übel werden, wobei ich da Perl noch um einiges krasser finde von der Syntax her. Aber es wäre schön wenn wir uns darauf einigen könnten sachlich und konstruktiv zu bleiben.
Dem schließe ich mich an. Formulierungen wie "da wird mir übel finde ich auch" äußerst unpassend und lässt auf lange sicht eine Community lächerlich erscheinen, weil viele dazu neigen auf Grund dessen alle über eine Kam einer Comunnity zu scheren. Stichwort: GIGA, Gamestar etc.

So ein wenig Sachliche Kritik: Mir gefällt die entliehene Syntax nicht so gut. Ich fühle mich dabei nicht so wohl. Das liegt zum teil auch daran das mich teilweise die Deklaration von Variabeln an Basic (oder wars Pascal. Schon zu lange her ^^) erinnert.
BlackJack hat geschrieben:
jens hat geschrieben:Es war nur ein spontaner Gefühlsausbruch ;)
Spätestens wenn man die Doku liest ist der durchaus sachlich gerechtfertigt. :twisted:

Da wird ungarische Notation der übelsten Sorte empfohlen. Mir ist jetzt auch schlecht. :?
[…]
Sry, du wärst der letzte gewesen von dem ich so ein Statement erwartet hätte :/ :-[ :?
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 21. November 2006, 15:41

Mensch XtraNine du hast es heute aber nicht so mit dem Humor, was? Wäre doch ein wenig langweilig, so ganz ohne...

Ich denke gerade unser Forum ist recht offen und hilfsbereit... Natürlich sind wir alle mehr oder weniger fixiert auf Python, aber das ist wohl nicht sehr verwunderlich, oder?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Dienstag 21. November 2006, 15:53

Wenn jemand mit einer Sprache daherkommt die in Syntax und Konventionen sozusagen das Gegenteil von Python ist, dann sollte er ein paar bissige Kommentare mit Smilies vertragen können. IMHO.

Das was die Sprache zu lösen versucht, sollte man besser an anderer Stelle in Angriff nehmen, nämlich dort wo die .NET Laufzeitumgebung die Assemblies nicht wieder verwirft und den Speicherplatz freigibt. Wenn man das Problem nämlich an der Stelle beseitigt, kann man plötzlich *alle* .NET Sprachen für's Skripting mit "Speicherdiät" verwenden.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 21. November 2006, 15:57

@Arakis: Sag mal, nur interessehalber, was machst du eigentlich genau, das du überhaupt auf .NET angewiesen bist?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 15:58

jens hat geschrieben:Mensch XtraNine du hast es heute aber nicht so mit dem Humor, was? Wäre doch ein wenig langweilig, so ganz ohne...

Ich denke gerade unser Forum ist recht offen und hilfsbereit... Natürlich sind wir alle mehr oder weniger fixiert auf Python, aber das ist wohl nicht sehr verwunderlich, oder?
Naja ok, kann auch sein das ich das alles heute falsch interpretiere. :? Naja, Sorry falls sich dadurch jemand angegriffen gefühlt hat. :/
Arakis
User
Beiträge: 6
Registriert: Dienstag 21. November 2006, 10:52

Dienstag 21. November 2006, 16:40

@BlackJack: Du hast es begriffen ^^

@Jens: Ich entwickel in .NET seit dem es rausgekommen ist(vorhaber aber viel in Delphi) und da es ursprünglich für mein Internetspiel gedacht war, welches ebenfalls in .NET geschrieben ist( http://stne.net ), sprach nichts dagegen es auch in .NET zu schreiben. Außerdem ist so ein integrierter Garbage collector recht nützlich :twisted: Da mir viele sagten dass die Script Engine echt gut ist, habe ich sie nun veröffentlicht.

Die Sprache ist an alles mögliche angelehnt, ich habe mir bei jeder Syntax überlegt, wie man sie am ehensten akzeptieren könnte. Der eine hasst Pyhton, der andere perl, wieder andere c++/javascript ({}), andere pascal und die meisten halt vb. Die Syntax sollte nicht zu komplex zu begreifen sein, vernünftig lesbar und leicht verständlich für jemanden mit grundkenntnisssen in der Programmierung, schließlich sollte die Sprache massentauglich für meine Spieler werden. Aber wie BlackJack es schon erkannt hat, es geht nich um die Sprache, sondern um die Engine, und dessen Möglichkeiten. Und dass das Framework irgendwann mal lernt Assemblies zu entladen ohne die ganze Appdomain zu entladen, wage ich zu bezweifeln.
Antworten