Hallo,
mich würde mal interessieren wie man eine Solche Scriptsprache wie z.B LUA erstellen kann.
Beispiel:
Wir haben ein Programm geschrieben welches ein Overlay in Spielen und anderen Fullscreen Anwendungen läuft. Nun möchte man mittels Scriptsprache das Overlay anpassen. Z.B
eine FPS anzeige.
Also wie funktioniert das, wie schreibe ich eine solche Scriptsprache welche korrekt ausgelesen und ausgeführt wird. Ich möchte z.B erstmal wissen wie der generelle aufbau einer solche Sprache ist und wie man diesen Code währendessen ausführt. Z.b möchte ich beim Programm start ebend das er die Plugins ausliest und einbindet
und neue Funktionen hinzufügt z.B bei F3 soll dann ein Hello World erscheinen
Die Scripte sollten dann jedoch relativ einfach gehalten werden in etwa so
Function onKeyDown(key){
if (key == Keys.F3)
Message.Show("Hello World");
}
Naja. Man schreibt nicht mal so nebenher eine eigene Script- oder Programmiersprache.
Da unterschätzt Du den Aufwand ein wenig. Der Aufwand nimmt auch exponentiell zu, wenn man Elemente wie Enums und Co unterstützen/anbieten will.
Viel einfacher wäre es auf bestehendes aufzubauen (zB TypeScript).
Roslyn ist ja nahezu dafür gemacht, dass solche Anforderungen "schnell" umzusetzen sind.
Dein Code erinnert mich auch sehr an TypeScript.
Aber "sehr einfach" und "leichtgewichtig" ist das halt auch nicht (in meinen Augen).
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das ist mir durchaus bewusst das es nicht mal so ebend schnell mit ein paar Zeilen Code gemacht ist jedoch würde ich das gerne mal sehen bzw. verstehen wie soetwas funktioniert wie eine Datei geladen wird und deren Inhalt ausführbar wird.
Ebend wie LUA Scripte oder Php Scripte diese sind zwar schon realtiv gewaltig jedoch
möchte ich für meinen Zweck einfach nur das z.B 3-4 Commands ausführen kann
um es einfach zu verstehen mich interessiert dieses Thema
Mein Script Beispiel war ebend nur ein Beispiel ich würde mich natürlich auch mit etwas einfacheres zufriedengeben z.B das ich nur den Command verwende
also Message.Show("Hello World");
einfach das diese Zeile ausfürbar wird im eigentlichen Programm
TypeScript werde ich mir natürlich auch gerne ansehen 😉
Im Prinzip brauchst Du das Wissen von Compiler construction
Domain-specific language
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich habe Antlr und XText in der Java-Welt verwendet.
Antlr bietet dir eine Möglichkeit in einer BNF ähnlichen Sprache eine Grammatik zu formulieren und generiert dir dann ein Code-Gerüst heraus mit dem du deinen Interpreter schreibst. Dabei verlässt es sich auf das Visitor-Pattern und du schreibst dir deinen Interpreter ähnlich wie einen SAX-Parser.
Das Parsing wird komplett von Antlr abgebildet.
XText geht da zwei Schritte weiter und lässt dich auf einem Metamodell deiner Objekte arbeiten. Dafür habe ich leider nichts für .Net gefunden.
Antlr 4 gibt es aber für .Net.
Prinzipiell ist das Entwickeln einer DSL keine Hexerei und man kann es sehr wohl nebenbei machen - das Knowhow und Tools wie Antlr vorausgesetzt. Wie sinnvoll es ist, steht auf einem anderen Blatt. Zum herumspielen und lernen - auf alle Fälle! Für den Produktiveinsatz? Na vielleicht eher einen fertigen Interpreter inkludieren wie Jint oder einen der Lua-Interpreter. (ua. MoonSharp)
As a man thinketh in his heart, so he is.
Hallo Odin008,
als eher allgemeine Anmerkung will ich gerne einwerfen, dass du bei der Script-Sprache möglichst auf eine bekannte und verbreitete Sprache setzen solltest. (Für mich) Als Anwender gibt es kaum etwas lästigeres als für Mini-Aufgaben noch eine spezielle Skript-Syntax zu lernen.
Wäre die verwendete Script-Sprache z.B. JavaScript so brauch ich mir nur die speziellen Objekte anschauen und der Rest ist eh klar.
Für dein Beispiel sollte das zusammen mit Jint aus der-schlingels Link relativ einfach umsetzbar sein.
Wenns dir sehr um Compilerbau geht, so wirst du um das Drachenbuch kaum herumkommen - das ist der Klassiker auf diesem Gebiet.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Danke für die ganzen Antworten =) Freut mich sehr, soviel Input _
Ja gfoidl, ja das wäre im Endeffekt auch der fall jedoch möchte ich bevor ich ein Script/Engine von einem fertigen oder einer anderen Quelle verwende möchte ich mich jedoch erstmal in die Materie einlesen um zuverstehen was genau passiert. D.h ich möchte vorab versuchen selbst eine solche Scriptsprache zuerstellen aber im späteren verlauf auf eine bestehende zurück greifen um es Nutzerfreundlicher zu gestalten da mittlerweile Scriptsprachen für solchen Plugins/Mods immer beliebter und bekannter werden sollte es im endeffekt kein großes Problem sein sich mit einer solchen Sprache anzufreunden bzw. kennen die meisen den Syntax schon und müssen sich nur mit den neuen Funktionen und Methoden vertraut machen können aber schliesslich auf das vorhandene Wissen durch sagen wir Spiele, Z.B Multi Theft Auto (Verwendet LUA für die Programmierung der Server/Client Scripte) zurückgreifen
Vielleicht bin ich auch einfach zu naiv aber ich weigere mich fast immer vorhandene Klassen zu verwenden bevor ich nicht weiß wie sie Aufgebaut sind wie sie Funktionieren.. Vielleicht könnte ich ja eine solche Klasse selbst schreiben und könnte Funktionen ergänzen oder erweitern. Dies ging mit einer Compilierten Klasse ja nicht. Desswegen bin ich realtiv dagegen solche zu verwenden.
Natürlich ist mir auch klar das ich nicht das Rad neu erfinden muss. Jedoch blicke ich gerne auf meine Arbeiten zurück und kann Stolz sein es allein geschafft zu haben. Huch ich schweife ab 😄
Ich bedanke mich nochmal ich werde mich jetzt erstmal durch alles durchlesen =)
Dann müsstest Du aber auch das .NET Framework selbst neu schreiben, wenn Du dieser Devise treu bleiben willst.
Spaß beiseite; es macht sinn, dass man vorhandenes nimmt, sofern es auch getestet ist. Deswegen sind Paketsysteme so erfolgreich: weil man sich auf seine eigentliche Arbeit konzentrieren kann.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Falls du das Rad doch nicht neu erfinden willst: Es gibt auch C# als Skript
Danke auch dir für diesen Link =)
Jedoch "Möchte" ich das Rad nicht zwingend neu erfinden das war ein Beispiel klar ich greifen auch auf fertigen Sachen zurück jedoch erst wenn ich diese komplett verstanden habe und deren verhalten nachvollziehen kann, anders wäre es für mich Quatsch eine solche Klasse zu verwenden ohne zu wissen was sie tut oder kann.
Nochmal zu der Scriptsprache ich möchte es gerne selbst schreiben doch nur ein paar kleine Teile um den grundlegenden Aufbau zu verstehen dabei greife ich auch gerne auf vorhandene Klassen zurück und studiere deren verhalten und versuche dann anhand dieser es nachzubilden
Solange bis ich 1:1 nachvollziehen kann was in der Klasse passiert
Microsoft hat vor einiger Zeit, weitgehend unbemerkt, ein Projekt für Probleme diese Art ins Leben gerufen.
Damit kann man VBA als auch JavaScript recht einfach mit eigenen Anwendungen verknüpfen. Das erscheint mir deutlich sinnvoller als eine neue Scriptsprache entwickeln zu wollen.
simulation data can take you only so far...
"the only test for a combat vessel is combat."
Schau mal hier: Learn Roslyn Now: Part 14 Intro to the Scripting API
Das Problem dabei ist, dass es bisher nur eine Vor-Version gibt: NuGet: Microsoft.CodeAnalysis.Scripting
Wenn ich versuche, das Paket über NuGet zu installieren, bekomme ich eine ganze Menge Fehler, ich weiß noch nicht warum.
Das wird aber wohl noch ändern, wenn es endlich mal fertig ist. 😄
Wenn aber ein größeres Projekt geplant ist, dann würde ich darauf warten, eine bessere Script-Engine bekommst Du nicht.
Außerdem ist dort auch VB.Net möglich, es muss eben die entsprechende Sprache vorher angegeben werden.
Es ist mir nicht klar wie eine DSL hier abhilfe leisten könnte. Eine Scriptsprache braucht man dann wenn man nachträglich benutzerdefinierte Logik erlauben/ausführen will. Eine DSL ist was völlig anderes. Ich kann da keinen Zusammenhang erkennen. Was hat eine DSL bitte mit einer nachträglich interpretierten Scriptsprache zu tun?
simulation data can take you only so far...
"the only test for a combat vessel is combat."
Nochmal zu der Scriptsprache ich möchte es gerne selbst schreiben doch nur ein paar kleine Teile um den grundlegenden Aufbau zu verstehen dabei greife ich auch gerne auf vorhandene Klassen zurück und studiere deren verhalten und versuche dann anhand dieser es nachzubilden
Das ist ganz klar die vorstufe vom NIH Syndrom.
Hast du wirklich so viel Zeit dir Compiler/Interpreterbau anzueignen nur um soetwas zu integrieren?
Mein Chef/Projektleiter/Auftraggeber würde mir was erzählen, wenn ich für so ein Randthema so viel Arbeitszeit verbraten würde.
"den grundlegenden Aufbau zu verstehen"
Bedeutet das jetzt für Dich das ich also einen kompletten Compiler/Interpreten erstellen möchte?
Ich mein für mich klingt das so als möchte ich nur gerne wissen wie so etwas aufgebaut ist und funktioniert es interessiert mich halt da investiere ich auch gerne meine Freizeit und lese und experimentiere bis ich dann mal sagen kann "Okay, jetzt versteh ich was da passiert/passiert ist"
Ich habe ja auch schon erwähnt das dies NUR für mich ist, d.h ich möchte gerne FÜR MICH verstehen wie so etwas funktioniert. Im Endeffekt werde ich der Benutzerfreundlichkeit wegen auf eine fertige Alternative zurückgreifen
Ja das ist ja das schöne das ich damit soviel Zeit verplempern kann wie ich möchte da ich es in meiner Freizeit mache. Das bedeutet es stört keinen, tut keinen weh, mir machts spaß und es interessiert mich halt =) Ich mein ich arbeite nicht umsonst 8 - 10h am Tag da kann ich mich am Abend auch mal hinsetzen (Es ist für mich auch beruhigend andere lesen ein Buch, ich Programmier ein bissl rum) und etwas machen was mir extrem viel Spaß macht und großes Interesse dafür besteht - das ist nunmal das Programmieren und das Kochen!
#Kaffeepause 👍
Im Endeffekt wirst du wohl dich wohl mit dem Aufbau einer bestehenden Sprache bzw. einem entsprechenden Parser/Interpreter beschäftigen.
Ansonsten kannst du dir nur mit etwas überlegen helfen.
Aber im Kern musst du selbst lernen wie eine Skriptsprache geparst und verarbeitet wird.
Je nachdem was deine Sprache können soll, kann das ganz schön komplex werden.
Den Code von LUA kannst du dir als Besipiel nehmen und schauen wie dort die Skripte eingelesen und verarbeitet werden.
Das wäre eigentlich schon alles was du für den Anfang bräuchtest.
Hier sind aber gute Kentnisse in C Voraussetzung, da die Lib in C Programmiert wurde.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Was hat eine DSL bitte mit einer nachträglich interpretierten Scriptsprache zu tun?
Man kann diese Zweckmissbrauchen. Einfach mal über den Tellerrand schauen 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich weiß nicht, warum sich alle so gegen eine eigene Scriptsprache aussprechen. Natürlich würde man sowas in einem real life Projekt nicht anfangen. Aber das ist mit das interessanteste, was man zu Übungszwecken oder in seiner Freizeit programmieren kann. Ich hab schon alle möglichen Interpreter / VMs und Optimizer geschrieben.
Und wir haben auch tatsächlich mehrere eigene Scriptsprachen in der Arbeit, deren Anfänge liegen aber schon sehr lange zurück.
Darum geht es ja: es ist kein Freizeitprojekt aus Spaß, sondern die wollen das produktiv nutzen.
Und das sehe ich als ganz arg großen Fehler. Sorry 😃
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code