Script: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Einige Rechtschreibfehler behoben.)
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 1: Zeile 1:
{{Unvollständig|Rechtschreibung und Grammatik, sowie ein Inhaltscheck fehlen.}}
+
{{Unvollständig|Rechtschreibung und Grammatik sowie ein Inhaltscheck fehlen.}}
 
=Scriptsprache=
 
=Scriptsprache=
 
==Allgemein==
 
==Allgemein==
 
Ein Script ist eine Folge von Befehlen, Bedingungen und Variablenoperationen.
 
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.
 
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.
+
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.
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==
 
==Verwendungszweck==
Scriptsprachen werden oft für nicht Zeitkritische Aufgaben verwendet, wie z.B. GUI, Kontrollskripte oder KI.
+
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.
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.
 
Im Bereich Spieleentwicklung und Grafikentwicklung sind Scripte sehr Nützliche Helfer.
Zeile 21: Zeile 13:
 
Man spart Zeit und kann diese Arbeit dann auch einen Grafiker übergeben, da keine Programmierfähigkeiten mehr von nöten sind.
 
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.
 
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.
+
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.
+
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.
+
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.
 
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.
 
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==
 
==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.
+
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.
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.
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.
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.
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 weitergeleitet.
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.
+
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.
+
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.
 
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.
+
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.
+
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.
+
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.
+
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.
+
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.
+
Dinge, die ohne Probleme auf der Scriptseite gemacht werden können, sind Funktionsaufrufe, logische und einfache mathematische Operationen.
  
 
==Nützliche Features==
 
==Nützliche Features==
 
Ein wichtiger Aspekt bei Scriptsprachen ist die Sicherheit.
 
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.
+
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.
+
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.
 
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.
+
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 Mobielen und Embeded Geräten kompatibel bleiben, der Speicherverbrauch ist leichter zurück zu verfolgen, Fehler im Script können leichter entdeckt werden,... .
+
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.
 
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.
+
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.
+
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, vieleicht kann der User da was optimieren und die VM noch ein Cache für den Wert an zulegen).
+
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).
+
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.
+
Hier sollte man dem Benutzer soviel wie möglich abnehmen und z.B. Typenkonvertierung verstecken und auf eine einfache Syntax bauen.
  
 
==Links==
 
==Links==
 +
*[[Tutorial_Scriptsprachen_Teil_1]] (DGL Tutorial hier im Wiki)
 +
*[[Tutorial_Scriptsprachen_Teil_2]] (DGL Tutorial hier im Wiki)
 
*[http://wiki.delphigl.com/index.php/Tutorial_Scripting_mit_JvInterpreterProgram Scripting mit JvInterpreter]
 
*[http://wiki.delphigl.com/index.php/Tutorial_Scripting_mit_JvInterpreterProgram Scripting mit JvInterpreter]
*[http://wiki.delphigl.com/index.php/Tutorial_Scriptsprachen_Teil_1 Die eigene Scriptsprache Teil 1]
 
*[http://wiki.delphigl.com/index.php/Tutorial_Scriptsprachen_Teil_2 Die eigene Scriptsprache Teil 2]
 
 
*[http://www.lua.org/ LUA Website]
 
*[http://www.lua.org/ LUA Website]
 
*[http://www.somedude.net/gamemonkey/ GameMonkey Website]
 
*[http://www.somedude.net/gamemonkey/ GameMonkey Website]

Aktuelle Version vom 10. August 2008, 19:16 Uhr

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