Die Skriptsprache Lua

9. Oktober 2008, 10:31 Uhr | Dr. Claus Kühnel und Daniel Zwirner
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 2

Objektorientiertes Programmieren mit Lua

Lua ist eigentlich keine objektorientierte Programmiersprache, aber mit Hilfe der Tabellen kann man Klassen nachbilden. Das Beispiel in Listing 4 zeigt, dass mit Point = {} eine Tabelle erzeugt wird, die die Klasse Point darstellen soll. Die drei Funktionen new(), __add() und tostring() werden der Tabelle Point zugewiesen, wobei der jeweilige Index gleich dem Funktionsnamen ist.

Der „:“ bei Point:new(x, y) und Point:tostring() bewirkt, dass die Funktion einen versteckten Parameter self (entspricht this in C++) hat. Die Funktion new() erzeugt eine neue Tabelle mit den Feldern x und y und gibt diese Tabelle zurück. Der neuen Tabelle wird die Tabelle Point als Metatabelle hinterlegt. Wenn die beiden Punkte a und b addiert werden, schaut der Interpreter in der Metatabelle nach, ob eine Funktion __add() vorhanden ist, und ruft diese dann auf. Auf diese Weise kann der Operator „+“ überladen werden.

Die Lua-Standard-Bibliotheken bieten sehr nützliche Funktionen, die über das C-Programmier-Interface implementiert sind und als separate C-Module zur Verfügung stehen. Obwohl Erweiterungen in Lua selbst implementiert werden könnten, bietet eine Implementierung in C verschiedentlich Performance-Vorteile. Gegenwärtig bietet Lua Standard-Bibliotheken für:

  • string: Reguläre Ausdrücke und Funktionen zur Stringmanipulation.
  • table: Tabellen sortieren und Elemente einfügen und löschen.
  • math: Mathematische Funktionen.
  • io: Funktionen zum Lesen und Schreiben von Dateien.
  • os: Funktionen zur Berechnung von Datum und Zeit sowie zum Ausführen von Befehlen des Betriebssystems.

Lua wurde vom Anfang an entworfen, um erweitert zu werden. Daher ist es sehr einfach, den Leistungsumfang von Lua zu erweitern. Die Sprache bietet dafür ein universelles C-Interface an. Mit der Präprozessor-Anweisung #include "luaxlib.h" werden dem Compiler alle Lua-Definitionen bekannt gemacht. Alle Funktionen, die in C implementiert werden, haben als Parameter einen Zeiger auf den aktuellen Lua-Interpreter. Alle Variablen, die einer Lua-Funktion übergeben werden, werden auf den Lua-Stack kopiert.

zeigt einige Quelltext-Zeilen, aus denen eine Lua-Erweiterung besteht. Die Funktion lua_get-top() liefert die Anzahl der Werte auf dem Stack zurück. Mit der Funktion luaL_checknumber(L, i) kann auf das i-te Element des Lua-Stacks zugegriffen werden. Gleichzeitig überprüft die Funktion luaL_checknumber(), ob der Wert auf dem Stack eine Zahl ist bzw. in eine Zahl konvertiert werden kann. Das Resultat der Berechnung wird mit der Funktion lua_pushnumber() wieder auf den Stack kopiert. Diese Funktion hat als Returnwert die Anzahl Elemente, die auf den Stack kopiert wurden (hier also 1).

Alle Funktionen einer neuen Lua-Bibliothek werden in einer Liste mit Funktionsnamen und dazugehöriger C-Funktion abgelegt. Die Liste wird mit einem NULL-Eintrag beendet (Zeile 12 in ). Jede Bibliothek muss eine Funktion exportieren, die luaopen_NAME() heißt.

In dieser Funktion wird die Liste mit den neuen Funktionen beim Lua-Interpreter registriert.
Die neue Bibliothek wird unter Linux mit gcc -I~/lua-5.1.3/ mylib.c -o mylib.so -shared in eine Programmbibliothek compiliert. Beim Start des Lua-Interpreters ist die neue Bibliothek dem Interpreter noch nicht bekannt. Die Bibliothek muss zuerst mit dem Befehl require("mylib") geladen werden. Jetzt kann die neue Bibliothek verwendet werden: Im Argument der Funktion sum() sind alle Typen enthalten, die Lua als Zahl interpretiert oder in eine Zahl konvertiert.

passend zum Thema


  1. Die Skriptsprache Lua
  2. Lua-Interpreter in eine C-Anwendung integrieren
  3. Objektorientiertes Programmieren mit Lua

Jetzt kostenfreie Newsletter bestellen!