Script

Aus DGL Wiki
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 Machiene. Eine Virtuelle Machiene ist dabei das System, welches den Bytecode in den passenden CPU Code umwandelt. Die Virtuelle Machiene wird oft um Fähigkeiten, wie z.B. Garbage Collection, laufzeit Codeoptimierung, Speicher optimierung, 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 Machiene 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 Objekt orientierten 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 Hochsprachen funktionen 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 Fehler unanfälligste Variante ist das zur Laufzeit mappen. Dabei werden anhand von z.B. RTTI oder Propertydaten die Daten konvertiert und an die richtigen Funktionen weiter geleitet.

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 2. 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("Heins")) auf, fragt noch nach Informationen(GetHealthOfPlayer("Heins")) und verwendet diese Informationen(if (a && b){dosomething();}) um eine Entscheidung zu treffen und somit eine weitere Funktion(DoEmotion(shout,"Medic!!!");) auf zu rufen. 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 Tot 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 Tot, wenn nicht mehr genügend Speicher verfügbar ist. Eine fixe Speicherbegrenzung hat viele Vorteile, man kann zu Mobielen und Embeded Geräten kompatibel bleiben, der Speicherverbrauch ist leichter zurück zu verfolgen, 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 Virtual Machine, 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, vieleicht kann der User da was optimieren und die VM noch ein Cache für den Wert an zulegen).

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 User soviel wie möglich abnehmen und z.B. typenkonvertierung verstecken und auf eine einfache Syntax bauen.

Links