Script

Aus DGL Wiki
Version vom 10. August 2008, 18:16 Uhr von Thoronador (Diskussion | Beiträge) (Einige Rechtschreibfehler behoben.)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Hinweis: Dieser Artikel ist noch unvollständig.
(Mehr Informationen/weitere Artikel)

Rechtschreibung und Grammatik sowie ein Inhaltscheck fehlen.

Incomplete.jpg

Scriptsprache

Allgemein

Ein Script ist eine Folge von Befehlen, Bedingungen und Variablenoperationen. Die Scripte werden zur Laufzeit verarbeitet und ausgeführt, hierbei existiert in der Regel ein sogenannter Bytecode. Der Bytecode entspricht einer bestimmten Operation auf der Virtuellen Maschine. Eine virtuelle Maschine ist dabei das System, welches den Bytecode in den passenden CPU Code umwandelt. Die virtuelle Maschine wird oft um Fähigkeiten, wie z.B. Garbage Collection, Laufzeitcodeoptimierung, Speicheroptimierung, Modulsysteme und so weiter, erweitert. So kann man ein Programm schreiben, welches ohne Änderungen auf jedem erdenktlichen System läuft. Dazu muss man für die Zielplatform eine virtuelle Maschine zur Verfügung haben und entsprechende Hardware. Wenn ein Script 64MB Speicher braucht, dann kann man es nicht auf ein 32MB-System laufen.

Verwendungszweck

Scriptsprachen werden oft für nicht zeitkritische Aufgaben verwendet, wie z.B. GUI, Kontrollskripte oder KI. Java, Lua oder C# können den Quellcode schon vorcompilieren und liefern dann nur noch den optimierten Bytecode. Der Vorteil liegt auf der Hand, der Ladeprozess ist kürzer und der Code wird schneller ausgeführt. Die Scriptsprachen sind vom Funktionsumfang, Geschwindigkeit und Syntax unterschiedlich.

Im Bereich Spieleentwicklung und Grafikentwicklung sind Scripte sehr Nützliche Helfer. So kann man z.B. die ganze UI durch ein Script laden und mit dem Programm verbinden, ohne das Programm selber immer wieder neu zu compilieren. Man spart Zeit und kann diese Arbeit dann auch einen Grafiker übergeben, da keine Programmierfähigkeiten mehr von nöten sind. Um solch ein System zu realisieren, braucht man eine Scriptsprache, UI Format(z.B. XML) und natürlich eine Schnittstelle zur eigenen UI. Je nach Scriptsprache kann man objektorientierten oder prozeduralen Code verwenden. C# z.B. kann C++ Klassen verstehen, wenn man aber ein generisches System haben will, sollte man das Lua-Konzept mal näher betrachten. Hierbei werden die, durch dll/so standartdisierten Funktionen unterstützt, die von allen Hochsprachen verstanden werden und Metatables verwendet. Metatables bieten die Möglichkeit, Klassen aus jeder Hochsprache an Lua zu verbinden. Dabei besitzt jede Variable von Lua eine Metatabelle, in der setter,getter und andere grundlegende Operationen überladen werden können.

Performance und nützliche Tipps

In der Spieleindustrie ist Lua eine sehr verbreitete Scriptsprache, da sie flexibel, schnell, leicht verständlich, der Code offen ist und frei zur Verfügung steht. Die höchste Geschwindigkeit und Sicherheit kann man durch statisches Mappen der Hochsprachenfunktionen auf die Scriptfunktionen erreichen. Etwas langsamer (beim Start), unsicherer, aber fehlertolleranter ist das Mappen der Funktionen beim Programmstart. Hierbei kann man ein Propertysystem verwenden, welches z.B. bei Delphi oder C# die RTTI-Daten verwendet. Die langsamste, unsicherste, aber für Fehler unanfälligste Variante ist das Mappen zur Laufzeit. Dabei werden anhand von z.B. RTTI oder Propertydaten die Daten konvertiert und an die richtigen Funktionen weitergeleitet.

Die erste Lösung ist z.B. bei KI Scripten ein absolutes Muss. Wenn man Scripte braucht und sich die Funktionalität aber öfters erweitert oder verändert, dann sollte man die zweite Lösung verwenden. Dieser Fall kann z.B. bei Ladescripten auftreten, wie z.B. Materials. Wenn man GUI entwickelt, dann sollte man die letzte Variante wählen, da man hier nicht Zeit sondern Fehlertolleranz höher priorisiert.

Eine weitere Performancefalle ist das Ausführen von zuviel Code auf der Scriptseite. In den Scripten sollten man eine Handvoll von Befehlen zur Verfügung haben und die Möglichkeit, Entscheidungen zu treffen. Ein Script delegiert die Arbeit, aber macht selber keine, so ruft es z.B. eine Funktion(IsPlayerInView("Heinz")) auf, fragt noch nach Informationen(GetHealthOfPlayer("Heinz")) und verwendet diese Informationen(if (a && b){dosomething();}) um eine Entscheidung zu treffen und somit eine weitere Funktion(DoEmotion(shout,"Medic!!!");) aufzurufen. Die ganze Funktionalität liegt also im Script, aber die Implementierung liegt auf Seiten der Hochsprache. Dinge, die ohne Probleme auf der Scriptseite gemacht werden können, sind Funktionsaufrufe, logische und einfache mathematische Operationen.

Nützliche Features

Ein wichtiger Aspekt bei Scriptsprachen ist die Sicherheit. Es ist in der Regel erwünscht, dass man bei einem Fehler im Script nicht die ganze Anwendung mit in den Tod reisst und deswegen werden Maßnahmen getroffen. So kann man z.B. das Erstellen und Verändern von Speicher unterbinden, allerdings braucht man auch Variablen in einer Scriptumgebung und deswegen ist es häufig so gelöst, dass man einen festen Speicher für die VM reserviert und in diesem kann die VM ihre Operationen und Variablen verarbeiten. Geht der reservierte Speicher zu neige, dann wird z.B. der Speicherbereich defragmentiert und von nicht mehr genutzten Daten gesäubert. Einige Scriptsprachen reservieren dann auch mehr Speicher und rennen dann eventuell in den Tod, wenn nicht mehr genügend Speicher verfügbar ist. Eine fixe Speicherbegrenzung hat viele Vorteile, man kann zu mobilen und Embedded Geräten kompatibel bleiben, der Speicherverbrauch ist leichter zurückzuverfolgen, Fehler im Script können leichter entdeckt werden,... . Zur Sicherheit gehört aber auch die Fehlertolleranz, so sollte eine Scriptsprache nicht Probleme mit verschiedenen Typen haben. Einige Scriptsprachen sind deshalb typenlos und erlauben das Speichern von Daten, egal welchen Typs, in eine Variable. Ideal sind Optimierung an der virtuellen Maschine, in Hinsicht auf Konvertierung und Geschwindigkeit. So ist es besser Arrays für Zeichenketten zu verwenden und nicht terminierte Zeichenketten, float statt int für Zahlen zu verwenden(sind auf PC schneller und reduziert die Anzahl an Konvertierungsroutinen) oder Erkennung von statischen, mathematischen Operationen (Warnung ausgeben, vielleicht kann der User da was optimieren und die VM noch ein Cache für den Wert anlegen).

Eine Scriptsprache sollte auch einfach sein, da man diese oft Personen zur Verfügung stellt, die keine Programmiererfahrung haben (z.B. Level-Designer). Hier sollte man dem Benutzer soviel wie möglich abnehmen und z.B. Typenkonvertierung verstecken und auf eine einfache Syntax bauen.

Links