14.11.2012 Aufrufe

Projekt Micarpet Projektbericht - artecLab - Universität Bremen

Projekt Micarpet Projektbericht - artecLab - Universität Bremen

Projekt Micarpet Projektbericht - artecLab - Universität Bremen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Projekt</strong> MiCarpet <strong>Projekt</strong>bericht<br />

12.5 Scriptsystem<br />

Die Rolle des Scripting in einem System ist in erster Linie darauf zu reduzieren, die Funktionen, die das<br />

Interface bzw. die Engine liefert, auf einer tieferen Schicht abzubilden und ggf. neu zu strukturieren, um<br />

darauf - eingebettet in ein System - zur Laufzeit Einfluß zu nehmen. Der Hintergrund dieser Maßnahme<br />

besteht darin, daß man so die Scriptsprache als Werkzeug einsetzt, um durch die Menge der vorgesehenen<br />

Funktionen eine Ablauflogik zu erstellen. Somit entlastet man den Programm Code, da sonst zahlreiche<br />

Funktionen für bestimmte, teilweise einmalig gebrauchte Detaillösungen diesen überfluten würden. Dazu<br />

kann sobald das Interface zum Hauptprogramm definiert ist, die Entwicklung von Scripten praktisch<br />

unabhängig von der Entwicklung und auch noch in späteren Phasen erfolgen, da die Scripte idR. nicht<br />

kompiliert werden (und wenn dann unabhängig vom Hauptsystem). Die zur Verfügung gestellten Sprachmittel<br />

sollten sich dadurch auszeichnen, daß sie es ermöglichen, die typischen Probleme direkt zu lösen;<br />

also häufig eingestetzte Funktionalitäten und Abläufe so zu strukturieren, daß nicht lediglich die Funktionalität<br />

des Interfaces wiedergegeben wird, sondern diese Funktionen innerhalb des Sriptsystems zu<br />

neuen Lösungsmitteln für Standardprobleme zur Verfügung gestellt werden, ohne den Umweg über das<br />

komplette Programm Interface zu nehmen; also einer Steigerung des Abstraktions-Levels.<br />

die Sprache LUA Die Sprache LUA [?] ist eine relativ populäre, dynamisch getypte Scriptsprache, die<br />

als Freie Software zur Verfügung steht und ein C-Programm Interface mit entsprechenden Bindung an<br />

ANSI C Code zur Verfügung stellt (siehe [?])I. Die LUA Virtual Machine interpretiert das entsprechende<br />

Script oder führt den zuvor kompilierten Bytecode aus. Die nötige Bindung an C++ Strukuren wird von<br />

der LUA Erweiterung luabind übernommen.<br />

Binden bedeutet in diesem Fall, daß bestimmte Funktionen im C-Code LUA bzw. der zur Laufzeit aktiven<br />

Virtual Machine bekannt gemacht werden und aus LUA Scripten heraus diese Funktionen aufgerufen,<br />

angesprungen werden können und zum Script zurückgekehrt werden kann.<br />

Funktionsabbildung Die Funktionsbindung zwischen LUA und dem System wird damit von luabind<br />

[?] übernommen. LUA bietet lediglich die Möglichkeit, C-Funktionen des Typs static int mit der<br />

Signatur lua_State* - einem Pointer auf einen LUA Stack - an die Virtual Machine zu binden. Die<br />

Grenzen liegen somit klar darin, daß man für jede einzelne Funktionalität eine eigene Funktion benötigt<br />

und man Parameter manuell auf den Stack legen und behandeln muß, daß sie fehlerrobust (bei Aufrufen<br />

aus LUA unterschiedlicher Signaturen) wieder entnommen werden.<br />

Hier kommt luabind zum Einsatz welches eine Meta Struktur über Template Klassen anbietet um die<br />

Bindung von C++ Funktionen beliebiger Signatur, wie Rückgabetypen und Klassen zu ermöglichen. Bei<br />

Klassen können ebenso die Member (teilweise) gebunden, Vererbung der Stuktur zwischen C++ und<br />

LUA erfolgen. Dabei stellt luabind keine eigene Bindung an LUA her, sondern übersetzt die Bindung<br />

von C++ Strukturen über das Interface in LUA Bindungen, welche über die zusätzlichen Verwaltungsund<br />

Kommunikationsstukturen verfügt, um LUA eine Klassenstruktur zu bieten.<br />

Die Kernfunktionalität des Scriptsystem auf Engineseite ist in den Klassen CScript und<br />

CScriptInterface beschrieben. Ersteres ist für die Funktionalität des Scriptsystems bzw. der Virtual<br />

Machine, letzteres für die Kommunikation zwischen Engine und Scriptsystem zutändig. Beim Starten<br />

der Engine wird nach dem Hochfahren der Virtual Machine und dem Dazuladen diverser Libraries die<br />

Bindung der deklarierten Funktionen, Klassen und Member vorgenommen:<br />

1. luabind::def( “foo”, &lua_foo );<br />

2. luabind::class_< CLuaObj >( “Obj” )<br />

3. .def( “getType”, &CObj::getType )<br />

6. Januar 2005 Seite 112

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!