Was suchen Sie in einer Skriptsprache? [geschlossen]

10

Ich schreibe eine kleine eingebettete Sprache für ein anderes Projekt. Obwohl die Spieleentwicklung nicht die ursprüngliche Absicht war, sieht sie allmählich gut aus, und ich denke, ich werde sie irgendwann in diesem Sinne entwickeln.

Ohne irgendwelche Details preiszugeben (um Voreingenommenheit zu vermeiden), bin ich neugierig zu wissen:

Welche Funktionen lieben Sie in einer Skriptsprache für die Spieleentwicklung?

Welche Aspekte fanden Sie am nützlichsten, wenn Sie Lua, Python oder eine andere eingebettete Sprache wie Tcl oder Guile als primäre Skriptsprache in einem Spielprojekt verwendet haben?

  • Sprachmerkmale (Lambdas, Klassen, Parallelität)

  • Implementierungsfunktionen (Leistungsoptimierungen, JIT, Hardwarebeschleunigung)

  • Integrationsfunktionen (C-, C ++ - oder .NET-Bindungen)

  • Oder etwas ganz anderes?

Jon Purdy
quelle
2
Verschleierung: Denn wenn es verschleiert werden kann, ist es wahrscheinlich auch ziemlich flexibel. Nehmen wir zum Beispiel Perl, das insofern verschleiert werden kann, als es wie die Ausgabe aussieht, die durch Leitungsrauschen von einem 300-Bit / s-Modem (als jemand anderes am anderen Ende des Hauses ein Telefon abnahm) in jenen Tagen verursacht wurde schnell. ;-P
Randolf Richardson
1
@ Randolf: Guter Punkt. Das einzige Problem bei der Verschleierung besteht darin, dass sie sich in der Regel auf eine stabile Sprache stützt, die junge Sprachen nicht sind. Ein Obfuscator, der mit 0.10 funktioniert, funktioniert möglicherweise nicht mit 0.11.
Jon Purdy
@ Jon Purdy: Das ist richtig (+1 für dich). Es gibt auch den Aspekt, dass verschleierter Code schwieriger zu warten ist. Wichtig ist jedoch, dass die Verschleierung ein interessantes Maß dafür sein kann, wie flexibel eine Sprache ist.
Randolf Richardson
5
@ Randolf: Wann sieht Perl nicht so aus?
Ken
1
@ Joe Wreschnig Das heißt "welche soll ich auswählen", dies ist mehr "welche Funktionen in einer Skriptsprache gut sind".
Die kommunistische Ente

Antworten:

4

Ich suche zwei Dinge - Geschwindigkeit und Integration. Normalerweise gehören die beiden zusammen und mit Vertrautheit. Leider gibt es für C ++ so gut wie keine Sprachen, die Geschwindigkeit und Integration bieten. Ich habe Lua benutzt und es saugte schrecklich. Ich habe die ganze Zeit damit verbracht, Bindungen zu schreiben und bei weitem nicht genug Zeit, um tatsächlich Code zu schreiben.

Sprachmerkmale? Das Einbetten einer Skriptsprache dient nicht dazu, dass sie über dynamische Funktionen verfügt, die meine Originalsprache nicht hatte, sondern dass sie zur Laufzeit interpretiert werden kann . Darüber hinaus ist mir das wirklich egal, solange es im Grunde genommen funktionsfähig ist, dann ist das in Ordnung - und passt zu meiner Hostsprache (in diesem Fall C ++). Erstaunlicherweise scheitern Sprachen, die für die Integration in Hostanwendungen ausgelegt sind, jedoch vollständig an der Integration .

Benötige ich Co-Routinen? Nein, ich brauche keine Co-Routinen. Benötige ich dynamisches Tippen? Nein, ich muss wissen, welche Typen aus meiner Skriptsprache auf mich zurückkommen, und da mein gesamter vorhandener Code auf sehr starker Typisierung basiert, möchte ich wirklich, dass mein Skriptcode dies auch respektieren kann. Benötige ich Müllabfuhr? Nein, meine Typen verwalten bereits ihre eigenen Ressourcen, und ich möchte definitiv deterministische Zerstörung. Will ich gehen Nein, ich möchte Ausnahmen werfen.

Das Problem, das ich fand, war, dass im Grunde alle vorhandenen Skriptsprachen so konzipiert waren, dass sie C und nicht C ++ erweitern und das C ++ - Modell in vielerlei Hinsicht nicht richtig unterstützen. Außerdem haben sie eine völlig andere Semantik. Wie um alles in der Welt werde ich übersetzen?shared_ptr , was automatische deterministische Zerstörung ist, in eine von Müll gesammelte Umgebung übersetzen? Sie können beliebige Wrapping-Bibliotheken schreiben. Sie werden nicht ändern, dass die zugrunde liegende Sprachsemantik nicht mit der Sprache kompatibel ist, die Sie damit erweitern möchten. Wie kann ich sicherstellen, dass dies void*der richtige Typ ist? Wie kann ich mit Vererbung umgehen? Wie werfe und fange ich Ausnahmen? Es funktioniert einfach nicht.

Eine gute Skriptsprache für C ++ wäre statisch typisiert, Wertesemantik, deterministisch zerstört, Ausnahmen auslösen und abfangen und meine Destruktoren / Konstruktoren / Kopierkonstruktoren respektieren, da dann alle meine Typen einfach funktionieren, nett und einfach, und die resultierende Sprache wird es sein schnell und unterstütze alle meine ursprüngliche Semantik, einfach zu binden.

DeadMG
quelle
Sie sollten so etwas wie diese Wrapper-Bibliothek ausprobieren, die ich kürzlich für mich geschrieben habe, um einige der gleichen Probleme zu lösen, die Sie hatten. Sie können shared_ptrs und ähnliches verwenden, es ist typsicher (so viel es auch sein kann), Sie können entscheiden, ob Sie das Leben von etwas wollen, das von Ihrem Code oder der Lua-Umgebung gesteuert wird, es unterstützt die Vererbung und es ist extrem ähnlich der normalen Lua API. Ich bin mir nicht sicher, ob ich die Beschwerde über das Erstellen von Bindungen bekomme. Ich verwende nur 99% der Zeit Vim-Schnipsel, um meine Bindungen zu erstellen.
Alex Ames
2

Für webbasiertes Spielen sind drei wichtige Faktoren für mich:

  • Vertrautheit
  • Geschwindigkeit
  • Integration

Ich mag Perl besonders, teilweise weil ich bereits mit der Sprache vertraut bin und weil ein Webservermodul wie mod_perl2 einen enormen Leistungs- und Integrationsvorteil bietet - mod_perl2 speichert eine kompilierte Version der Skripte im RAM (die nur interpretiert werden) Erstes Laden), wodurch es einen großen Geschwindigkeitsvorteil gegenüber anderen interpretierten Sprachen ohne Kompilierungsoptionen bietet. Außerdem wird es mit einer funktionsreichen API, die den Zugriff auf viele sehr leistungsstarke Funktionen ermöglicht, in den Apache HTTPd-Server integriert.

Diese Faktoren können für die webbasierte Spieleentwicklung hilfreich sein (und wenn Datenbankzugriff erforderlich ist, hilft das Zwischenspeichern der Datenbankverbindungen, die Antwortzeiten für Benutzer weiter zu verkürzen). Natürlich ist dies möglicherweise nicht die idealste Lösung für alles, da jede Sprache ihre Vor- und Nachteile hat, aber es hat immer gut für meine Bedürfnisse funktioniert.

Randolf Richardson
quelle
2

In der Reihenfolge der (abnehmenden) Wichtigkeit angeordnet:

  • Auf einen Blick lesbar. Eigentlich ist das eine Voraussetzung für jeden Sprache, die ich verwenden möchte, aber für die Skripterstellung ist es wohl wichtiger: Skripte ändern sich per Definition häufiger als "Kern" -Code. Also kein LISP oder PERL.
  • Knappheit. Skripte werden ständig geschrieben und neu geschrieben, und die Eingabe von viel, viel "Boilerplate" -Code ist ineffizient.
  • Einfaches Debuggen. Vorzugsweise mit Haltepunkten, Durchstieg usw.
  • Einfache Integration mit meiner gewählten "Kerntechnologie". Wenn ich C ++ für mein Spiel verwende, benötige ich gute C ++ - Bindungen, wie in LUA. Wenn das Spiel in C # ist, würde ich eine CLI-basierte Sprache wählen: C #, IronPython, Boo.
  • Sprachmerkmale: einfache assoziative Arrays, Coroutinen, vielleicht Lambdas. Eigentlich hängt dies hauptsächlich davon ab, wofür ich die Skripte verwenden werde. AI-Skripte unterscheiden sich beispielsweise von Initialisierungsskripten.
  • Gute Dokumentation. C # hat eine ganze MSDN, und Boo hat nur Quellen. Deshalb ist C # viel besser.
  • Gute Entwicklungsumgebung. VS oder Eclipse schlagen Notepad jedes Mal.
Keine Ursache
quelle
+1 Das hilft mir sehr, danke. Ich werde abwarten, ob es weitere Diskussionen gibt, aber ich denke, Sie haben es gut behandelt.
Jon Purdy