Domänenspezifische Skriptsprachen [geschlossen]


12

Wie die meisten von Ihnen wissen, werden eingebettete Interpreter für Sprachen wie Lua und Python häufig für die Erstellung von Spielelogik verwendet, aber ich habe nicht viele Informationen darüber erhalten, wie Leute für ihre Skripte domänenspezifische Sprachen verwenden, z 'zusätzlich zu der Sprache, die für den Rest des Spiels verwendet wird, mit Makros oder flüssiger Programmierung oder so weiter.

Meine Fragen lauten also wie folgt:

  • Welche Beispiele für solche DSLs haben Sie in realen Spielen gesehen?
  • Auf welche Probleme wurde gestoßen?
  • Würden Sie diese Route anderen Spieleentwicklern empfehlen und unter welchen Umständen?
  • Sehen Sie, dass dies immer häufiger vorkommt, wenn sich die Spieleentwicklung zu metaprogrammierfreundlicheren Sprachen entwickelt, z. B. Boo?

Um die reale Frage zur DSL-Nutzung zu beantworten, wurden sie von Battlefield 1942 verwendet. Obwohl viele Mods aufgetaucht sind; aus meiner sicht war es schrecklich und ich verlor sehr schnell das interesse.
Jonathan Dickinson

Antworten:


6

Mein Rat wäre "nicht".

Ich habe eine domänenspezifische Auszeichnungssprache für Spieldaten verwendet. Es war ein Schmerz. Ich habe Tage damit verbracht, es zu entwerfen, und dann musste ich jede oder jede zweite Woche daran arbeiten, um weitere Funktionen hinzuzufügen. Irgendwann wurde mir klar, dass ich einige meiner Spieldaten automatisch generieren musste, und schließlich schrieb ich ein kleines Programm, um Eingabedateien in der Auszeichnungssprache zu analysieren, sie zu massieren und verschiedene Dateien auch in der Auszeichnungssprache auszugeben.

Ich habe ehrlich gesagt keine Ahnung, was ich dachte. Das Ganze wäre einfacher, effizienter, weniger fehleranfällig und weitaus weniger zeitaufwändig gewesen, wenn ich nur Lua verwendet hätte.

Wenn Sie auf einem so eingeschränkten System arbeiten, dass Sie eine Lua-Umgebung nicht starten können, sollten Sie vielleicht ein DSL verwenden, aber auf Qual vorbereitet sein. Ansonsten glaube ich fest daran, dass Sie einfach Lua verwenden sollten. Lua wurde ursprünglich als einfache Datenauszeichnungssprache entwickelt und eignet sich immer noch hervorragend für die Verwendung als solche. Wenn (nicht, wenn) Sie feststellen, dass Sie etwas Komplizierteres benötigen, haben Sie es bereits. Alle meine aktuellen Spieleentwicklungen wurden in Lua durchgeführt und ich war noch nie effizienter oder weniger fehleranfällig.

Ich kann gegen DSLs nicht stark genug empfehlen.


Äh, warum nicht? Hättest du gerade Lisp benutzt, wäre es eine viel angenehmere Erfahrung gewesen, denke ich. :) Starcraft II hat die Skriptsprache Galaxy, die in der Tat eine domänenspezifische Sprache ist, die sich an Nicht-Tech-Leute richtet.
Jacmoe

3
Lisp wäre kein DSL mehr als Lua oder Python. Es wäre eine vollständig formulierte Sprache, die jemand anderes lange Zeit für das Entwerfen aufgewendet hat, Zeit, die Sie vermeiden können, selbst auszugeben.
Coderanger

2

Ich habe nicht viele Informationen über Leute gesehen, die für ihre Skripte domänenspezifische Sprachen verwenden, z. B. das Erstellen eines kleinen logischen Skript-Dialekts über die Sprache, die für den Rest des Spiels verwendet wird, mithilfe von Makros oder fließender Programmierung oder so weiter.

Skriptsprachen sind in Spielen in der Regel eine teure Angelegenheit. Sogar Lua, das ziemlich schnell ist, ist immer noch sehr viel langsamer als nativer Code. Spielteams sind in der Regel nur bereit, diesen Treffer zu erzielen, da dies ihnen zwei sehr große Vorteile bringt:

  1. Die Möglichkeit, Skripte zu ändern, ohne das Spiel neu kompilieren und laden zu müssen.
  2. Die Fähigkeit für Nicht-Programmierer, Skripte zu schreiben.

DSLs geben dir das leider nicht.


Ich würde argumentieren, dass 2) ein roter Hering ist. Für ein ausreichend interessantes Skript benötigt ein Nicht-Programmierer mehr Hand- oder Debugging-Hilfe, als es wert ist. Es gibt gute Programmierer-Designer, die keine Hilfe brauchen, aber Sie können Lua For Dummies nicht auf den Schreibtisch eines regulären Level-Designers schlagen und erwarten, dass sie Spaß machen.
16.07.10 um 08:41

Genau. Ich denke nicht, dass # 2 in der Praxis gut funktioniert, aber ich habe gesehen, dass dies ein angeblicher Grund für die Integration einer Skriptsprache war.
Munificent

Es gibt viele Leute mit guten Spielideen, die Lua-Skripte schreiben können, aber ich würde nie in der Nähe von malloc / sprintf / einem Ort vertrauen, an dem sie eine Datenstruktur auswählen mussten / etc. Das ist es, was # 2 bedeutet - "Die Fähigkeit für schlechte Programmierer, minimalen Schaden zu verursachen und dennoch Arbeit zu erledigen."

Sie verursachen möglicherweise keine Speicherverluste mit einem Skript, aber ein schlechter Programmierer kann immer noch fehlerhaften, nicht wartbaren und langsamen Code schreiben. Schlechte Programmierer sollten nicht in der Nähe Ihres Spiels zugelassen werden. Stellen Sie Designer mit bewährter Skripterfahrung ein, und Sie werden in Ordnung sein.
07.02.11

2

Ich finde es merkwürdig, dass sich Ihre Frage auf beschränkt interne DSLs beschränkt, da ich lieber die Verwendung eines externen DSL befürworten würde , um Skripte zur Laufzeit laden zu können und insbesondere Nicht-Entwicklern zu ermöglichen, Spielelogik in das DSL zu schreiben .

Zum Beispiel verwendet mein aktuelles Projekt ein (für den Moment) einfaches externes DSL, um einen Teil der Spielelogik zu spezifizieren, der es Spieldesignern ermöglicht, Balancetests größtenteils ohne Entwicklerintervention durchzuführen.

Natürlich müssen Sie einen Parser schreiben. Zu diesem Zweck ist meines Erachtens das am meisten empfohlene Tool ANTLR, das sich an einige Sprachen richtet . Obwohl wir bei meinem Projekt den Parser Combinator-Weg mit jParsec gegangen sind (unser Backend ist Java, es gibt Varianten in anderen Sprachen), ist das für seine enge Beziehung zu BNF ganz nett, aber vielleicht weniger gut dokumentiert.


2

Mein Rat wäre: Tu !

Aber nur, wenn Sie eine Verwendung dafür haben.

Sie müssen kein DSL erstellen, wenn Sie es nur intern verwenden möchten.

Galaxy ist die Skriptsprache, die der Startcraft II-Editor verwendet. Es ist ein Paradebeispiel für eine domänenspezifische Sprache.

Es richtet sich eher an Spieleentwickler als an Programmierer:

Timer - Start Raise Lava Timer as a One Shot timer that will expire in 20.0 Game Time seconds
Variable - Set Raise Lava Timer = (Last started timer)
Timer - Create a timer window for (Last started timer), with the title "Lava will raise in: ", using Remaining time (initially Visible)
Variable - Set Lava Timer Window = (Last created timer window)
Timer - Show (Last created timer window) for (All players)
Variable - Set Lava Death? = false

Beispiel-Tutorial

Lisp ist die perfekte Sprache, um domänenspezifische Sprachen zu erstellen, aber es gibt natürlich auch andere Optionen. Wie Boo.

Auf diese Weise müssen Ihre Designer / Modder das Programmieren nicht lernen, auch wenn es nur Lua ist, es programmiert immer noch.

Bearbeiten: Lassen Sie mich hinzufügen, dass ein DSL in einer Skriptsprache implementiert werden kann - es ist nicht gleichbedeutend mit dem Nichtverwenden einer Skriptsprache. Vor allem, wenn Sie Lisp oder ähnliches verwenden, da es sich hervorragend zum Erstellen domänenspezifischer Sprachen eignet.


1

Interne dsls sind nur syntaktischer Zucker auf einer guten API. Die API ist das Wichtigste. Nachdem Sie eine gute API haben, ist das Erstellen einer dsl trivial und nicht so wichtig.


0

UnrealScript ist wohl ein DSL. Es scheint die Aufgabe zu erledigen, obwohl ich denke, dass es möglich ist, Spieleskriptsprachen noch "domänenspezifischer" zu gestalten. Ich würde empfehlen, ein DSL zu erstellen, wenn es für die Domain etwas gibt, das von Sprachänderungen profitiert. Ich habe ein paar Ideen in diesem Bereich, aber noch keine vollständigen Informationen.

Sehen Sie, dass dies immer häufiger vorkommt, wenn sich die Spieleentwicklung zu metaprogrammierfreundlicheren Sprachen entwickelt, z. B. Boo?

Ich denke nicht, dass eine ziemlich neue Engine, die eine Sprache unterstützt, ein Beweis dafür ist, dass sich die Spieleentwicklung in eine bestimmte Richtung bewegt. Es ist noch früh.


0

Wenn Sie wirklich eine Allzweck-Programmiersprache benötigen, ist das Rollern Ihrer eigenen mit ziemlicher Sicherheit ein Fehler. Wenn Ihre Sprache Variablen, Ausdrucksauswertung, Schleifen, Bedingungen, Klassen, Funktionen usw. benötigt, sollten Sie sich am besten an eine bekannte Sprache wie Lua, Lisp, Python, JavaScript usw. halten.

Wenn es jedoch hauptsächlich darum geht, Daten zu definieren, ist vielleicht eher deklarativ als imperativ; definiert vielleicht Zustände und Regeln (wie GDL); und braucht nicht das meiste was eine GP sprache gut kann, dann überlege eine DSL.

Aber Vorsicht: Das Erstellen von Sprachen und Compilern kann sehr schwierig sein, und Vorkenntnisse sind eine große Hilfe. Ich würde einen PEG-Parser (selbst ein DSL) empfehlen, der auf einer EBNF-Grammatik (einem anderen DSL) basiert, und wenn das eine zu große Frage ist, sollten Sie es besser nicht versuchen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.