Projekt Micarpet Projektbericht - artecLab - Universität Bremen
Projekt Micarpet Projektbericht - artecLab - Universität Bremen
Projekt Micarpet Projektbericht - artecLab - Universität Bremen
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