Die Programmiersprache Lua Philipp Hoppermann
Die Programmiersprache Lua Einleitung Sprachumfang Datentypen und -strukturen Kontrollstrukturen Funktionen Exceptions Coroutinen Metatables und Metamethoden Objektorientierung C API 2 Lua in der Spieleentwicklung Zusammenfassung und Auslick
Die Programmiersprache Lua Einleitung Sprachumfang Datentypen und -strukturen Kontrollstrukturen Funktionen Exceptions Coroutinen Metatables und Metamethoden Objektorientierung C API 3 Lua in der Spieleentwicklung Zusammenfassung und Auslick
Einleitung Motivation Implementierung der künstlichen Intelligenz bei Eurofighter in Lua flexiblere KI als bei bisheriger Definition in *.xml-dateien Überblick über Lua 4
Einleitung Geschichte 1993 Roberto Ierusalimschy, Luiz Henrique de Figueiredo und Waldemar Celes Tecgraf, Pontifical Catholic University in Rio de Janeiro grafische Anwendungen (z.b. für Öl-Firma Petrobras) Data-Entry Language (DEL) Simple Object Language (SOL) mächtigere Sprache gefordert Handelsbeschränkungen do-it-yourself -Mentalität 5
Einleitung Ziele Einfachheit Syntax und Semantik automatische Speicherverwaltung (Garbage Collector) dynamische Typisierung Plattformunabhängigkeit Datenbeschreibungsfähigkeit einfache Interaktion mit Host-Programm geringe Größe Effizienz und Geschwindigkeit 6
Die Programmiersprache Lua Einleitung Sprachumfang Datentypen und -strukturen Kontrollstrukturen Funktionen Exceptions Coroutinen Metatables und Metamethoden Objektorientierung C API 7 Lua in der Spieleentwicklung Zusammenfassung und Auslick
Datentypen und -strukturen nil (ungültiger Wert) Boolean Fließkommazahl Zeichenkette (String) Funktion... first-class values können in Variablen gespeichert werden, als Rückgabewert einer Funktion 8
Datentypen und -strukturen table einzige Datenstruktur assoziatives Array hybride Struktur Hash-Teil Array-Teil //Erstellen adresse={plz=52062, ort=aachen} //Zugriff adresse[plz] adresse.plz 9
Kontrollstrukturen bedingte Anweisungen if Ausdruck then a else b end kopfgesteuerte Schleifen while Ausdruck do a end fußgesteuerte Schleifen repeat a until Ausdruck Zählschleifen for i=startwert, Endwert, Schrittweite do a end generische for-schleifen for s,w in pairs(table) do print(s.. -.. w) end 10
Funktionen Name Parameterliste Funktionskörper beliebig viele Argumente und Rückgabewerte alle Funktionen sind anonym function Name(param1,param2) Inhalt return ret1,ret2 end 11
Exceptions bei Fehler wird Error ausgelöst selbst auslösen mit: error( Fehlermeldung ) abgesichert ausführen mit pcall liefert im Fehlerfall false und die Fehlermeldung äquivalent zu throw, try... catch z=assert(tonumber(n), "keine Zahl") if pcall(f) then... else... end 12
Coroutinen ermöglichen Multitasking vergleichbar mit Threads eigene lokale Variablen gemeinsame globale Variablen aber: kooperatives Multitasking nur eine Coroutine läuft gleichzeitig Coroutine muss ihre Ausführung selbst beenden erstellen mit create starten mit resume stoppen mit yield 13
Metatables und Metamethoden vergleichbar mit Operatorüberladung Metatable=table mit Metamethoden (z.b. add) kann für table gesetzt werden function addvektor(a,b) local tmp={} for index,wert in ipairs(a) do tmp[index]=wert+b[index] end return tmp end meta={ add=addvektor} v1={1,2,3} v2={4,5,6} setmetatable(v1,meta) setmetatable(v2,meta) erg=v1+v2 14
Objektorientierung Verwendung von tables als Objekte Attribute, Methoden = Felder der table function f(self,parameter) self.xy=... end objekt.methode=f -- syntactic sugar function objekt:f(parameter) self.xy=... end -- Aufruf objekt.f(objekt,parameter) objekt:f(parameter) 15
Objektorientierung Klassen Klassen über Prototypen index-metamethode verweist auf Prototyp wenn Feld nicht vorhanden, wird in Prototyp nach Feld gesucht setmetatable(instanz, { index=prototyp}) // Konstruktor function prototyp:new() end neueinstanz={} setmetatable(neueinstanz, self) self. index=self return neueinstanz instanz=prototyp:new() 16
Objektorientierung Vererbung Prinzip wie bei Klassen index-metamethode verweist auf Basisklasse wenn Feld nicht vorhanden, wird in Basisklasse nach Feld gesucht abgeleiteterprototyp=prototyp:new() abgeleiteinstanz=abgeleiteterprototyp:new() 17
Objektorientierung Datenkapselung nicht für große Projekte gedacht keine Schlüsselwörter wie private, protected und public Datenkapselung über Proxy function zaehler(startwert) local self={wert=startwert} local function hoch() self.wert=self.wert+1 end local function getwert() return self.wert end end return {hoch=hoch,getwert=getwert} 18
C API Lua in C-Programmen (z.b. Interpreter) C-Funktionen in Lua (Standardbibliotheken) Probleme: statische Typisierung (C) dynamische Typisierung (Lua) manuelle Speicherverwaltung (C) automatische Speicherverwaltung (Lua) Kommunikation über abstrakten Stack 19
C API Lua einbetten Funktion und Argumente auf den Stack Funktion ausführen Ergebnis vom Stack lesen Ergebnis vom Stack entfernen function addiere(a,b) return a+b end lua_getglobal(l,"addiere"); lua_pushnumber(l,1); lua_pushnumber(l,2); lua_pcall(l,2,1,0); double ergebnis=lua_tonumber(l,-1); lua_pop(l,1); 20
C API Lua erweitern Funktionen in der Form static int f(lua_state* L) Funktionen mit Name in Array speichern Modul in Lua registrieren Modul mit require in Lua einbinden static const struct lual_reg meinmodul [] = { }; {"meinefunktion", f}, {NULL, NULL} int luaopen_meinmodul(lua_state* L){ } 21 lual_register(l, meinmodul, meinmodul); return 1;
Die Programmiersprache Lua Einleitung Sprachumfang Datentypen und -strukturen Kontrollstrukturen Funktionen Exceptions Coroutinen Metatables und Metamethoden Objektorientierung C API 22 Lua in der Spieleentwicklung Zusammenfassung und Auslick
Lua in der Spieleentwicklung MIT Lizenz, Open Source Multitasking über Coroutinen C API Einbetten in C++-Engine einfache Syntax (Nutzung durch Game- und Level- Designer) Datenbeschreibungsfähigkeit Portabilität (nur ANSI C benötigt) auch für Konsolen geringe Systemanforderungen (100 Kb Lua-Core) eine der schnellsten Skriptsprachen Add-on Schnittstelle (WoW) 23
Die Programmiersprache Lua Einleitung Sprachumfang Datentypen und -strukturen Kontrollstrukturen Funktionen Exceptions Coroutinen Metatables und Metamethoden Objektorientierung C API 24 Lua in der Spieleentwicklung Zusammenfassung und Auslick
Zusammenfassung und Ausblick Aspekte, die für Spieleindustrie wichtig sind, treffen auch auf CAE zu Steuerung einer künstlichen Intelligenz Anwender beim Kunden keine professionellen Programmierer Einbetten in C++-Simulation über C API Echtzeitsystem schnelle Sprache nötig viele wichtige Vorraussetzungen erfüllt aber: Lua im Vergleich zu C++ langsamer ausreichend für Echtzeitsimulation? 25
Quellen Fulgham, Brent: Computer Language Benchmarks Game, The. http://shootout.alioth.debian.org/. Version: September 2012 Ierusalimschy, Roberto: Programming in Lua. Roberto Ierusalimschy, 2006. ISBN 85 90 37982 5 Ierusalimschy, Roberto; Figueiredo, Luiz H.; Celes, Waldemar: Lua: an Extensible Embedded Language. In: Dr. Dobb s Journal 21 (1996), Nr. 12, 26œ33. http://www.lua.org/ddj.html Ierusalimschy, Roberto; Figueiredo, Luiz H.; Celes, Waldemar: Implementation of Lua 5.0, The. In: Journal of Universal Computer Science 11 (2005), Nr. 7, S. 1159 1176 Ierusalimschy, Roberto; Figueiredo, Luiz H.; Celes, Waldemar; Lua.Org, PUC-Rio (Hrsg.): Lua Reference Manual 5.1. Lua.Org, PUC-Rio, 2006. http://www.lua.org/manual/5.1/manual.html Ierusalimschy, Roberto; Figueiredo, Luiz H.; Celes, Waldemar: Evolution of Lua, The. In: Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages ACM, 2007, 2 1 Ierusalimschy, Roberto; Figueiredo, Luiz H.; Filho, Waldemar C.: Lua-an Extensible Extension Language. In: Software Practice and Experience 26 (1996), Nr. 6, 635 652. http://www.lua.org/spe.html Libraries And Bindings. http://lua-users.org/wiki/ LibrariesAndBindings. Version: Oktober 2012 Graphical User Interface Toolkits. http://lua-users.org/wiki/graphicaluserinterfacetoolkits. Version: Oktober 2012 26
Fragen? 27
Thank you 28