© Liashko/Shutterstock.com
Skriptsprache für Nostalgiker

Lua to go


Programmiersprachen wie C, Java und Co. sind für die Entwicklung von Systemen und/oder Programmen vorgesehen. Lua hingegen ist eine imperative und erweiterbare Skriptsprache zum Einbinden in Programme, die im Rahmen der „Customization Mania“ in den 1990er-Jahren entstand.

Von Winamp bis zu Windows – das Implementieren von Skins gehörte in den 90ern in der IT zum guten Ton. Im Lauf der Zeit wollten Entwickler ihren Usern zudem die Möglichkeit geben, die Programmintelligenz anzupassen. C und Co. waren dazu sowohl zu komplex als auch zu schwierig zu implementieren: Das dynamische Einbinden von Bibliotheken artet nun mal in Arbeit aus.

Lua entstand als komplett in C gehaltene „Sprache für alles“. Die vergleichsweise tolerante Syntax und der portabel gehaltene Interpreter sorgten dafür, dass die Sprache binnen kurzer Zeit immense Reichweiten erreichte.

Lua sieht sich selbst als eine Art Anti-C: Die Sprache möchte Entwicklern all das bieten, was C nicht kann – der bequeme Zugriff auf in C gehaltene Funktionen gehört hier explizit dazu. Heute findet sich das Sprachchamäleon in diversen Spiele-Engines und – man mag es kaum glauben – im Embedded-Bereich.

Eins, zwei, Lua herbei

Lua-Entwickler können sich freuen: Für Ubuntu stehen fertige Pakete zur Verfügung, die sich per apt-get automatisch installieren lassen. Leider gibt es mehrere Versionen – die folgenden Schritte basieren auf Version 5.2, die vom Paketmanager explizit angefordert werden muss:

@tamhan-thinkpad:~$ sudo apt-get install lua5 lua50 lua5.1 lua5.1-policy lua5.2 lua50-doc lua5.1-doc lua5.1-policy-dev lua5.2-doc tamhan@tamhan-thinkpad:~$ sudo apt-get install lua5.2 [sudo] password for tamhan: Reading package lists... Done . . .

Das Kommandozeilenwerkzeug lua kennt zwei Betriebsmodi. Wird es durch Eingabe von lua gestartet, so arbeitet es im in Abbildung 1 gezeigten interaktiven Modus. Aufrufe nach dem Schema lua dateiname sorgen stattdessen für die Abarbeitung des angegebenen Skripts.

Unter Linux lässt sich lua zudem als Interpreter für Shellskripte einsetzen. Dazu ist lediglich ein nach folgendem Schema aufgebauter hashbang erforderlich, der auf den per which lua ermittelbaren Pfad der Lua-Runtime zeigt:

#!/usr/bin/lua print("Hello World!")

Linux zeigt hier eine kleine Besonderheit: Es lassen sich nur jene Dateien ausführen, deren Executable-Bit gesetzt ist. Zur Behebung dieses Missstands bietet sich folgende Befehlskombination an:

tamhan@tamhan-thinkpad:~/Lua$ chmod +x table1.lua tamhan@tamhan-thinkpad:~/Lua$ ./table1.lua Hello 

Als erstes Beispiel wollen wir eine kleine Applikation generieren, die zwei Zahlen von der Kommandozeile einliest und addiert. Erstellen Sie eine Datei namens suslua1.lua und statten Sie sie mit folgendem Code aus:

#!/usr/bin/lua  print("Bitte zwei Zahlen eingeben") a,b=io.read("*n","*n") print (a) print (b)

read() nimmt hierbei einen String entgegen, der das Format der einzulesenden Daten beschreibt. Im Fall unseres Beispiels übergeben wir zweimal *n, was das Einlesen von Zahlen bewerkstelligt. Die restliche Verarbeitung der Daten ist im Großen und Ganzen analog zu anderen Programmiersprachen. Interessant ist, dass Lua das Zuweisen von mehreren Attributen in einer Operation erlaubt: Die vom read-Befehl angelieferten Daten werden zur Laufzeit geteilt und zur Bevölkerung der beiden Variablen herangezogen.

Als kleine Besonderheit sei hier angemerkt, dass Lua prinzipiell und immer mit Fließkommazahlen arbeitet: Einen Integer-Zahlentyp gibt es in der Sprache nicht. Das ist für Entwickler von Embedded-Systemen ärgerlich, die mehr Performance begehren – zur Lösung des Problems empfiehlt es sich, eine eigene Version von Lua zu kompilieren, die statt float auf einen anderen Datentyp setzt. Dass die Realisierung von Kommazahlen in diesem Fall in der alleinigen Verantwortung des Programms liegt (Stichwort: fixed point arithmetics), steht auf einem anderen Blatt.

Alles tabellarisch

Lua ist eine paradigmenübergeifende Sprache: Wer objektorientiert programmieren will, kann dies unter Nutzung der Sprachprimitiva bewerkstelligen. Das mit Abstand wichtigste Element hierzu ist die Tabelle, die zudem den einzigen in Lua implementierten Konvolutdatentyp darstellt.

Im Grunde genommen ist eine Tabelle nur ein KV-Speicher, der mit diversen Typen als Schlüssel und Wert versorgt werden darf. Als einfachstes Beispiel dafür dient eine kleine Fingerübung, die eine Art Deutsch-Englisch-Wörterbuch realisiert:

#!/usr/bin/lua  tabelle={} tabelle["Hallo"]="Hello" tabelle["Keks"]="Cookie" print(tabelle["Hallo"])

Sind die Schlüssel gewöhnliche, also ohne Sonderzeichen etc. ausgelegte Zeichenketten, so bietet sich zudem eine Möglichkeit zur massiven Abkürzung des Zugriffs­codes:

tabelle["Hallo"]="Hello" tabelle.Hallo="Oi!" print(tabelle["Hallo"])

Achten Sie darauf, dass Lua Case-sensitive ist. Das bietet die Gelegenheit für diverse schwer auffindbare Fehler – das folgende Beispiel grüßt mit Oi, obwohl der Entwickler wahrscheinlich eher Puber ausgeben wollte:

tabelle.Hallo="Oi!" tabelle.hallo="Puber!" print(tabelle["Hallo"])

Arrays entstehen in Lua als Abart der Tabellendatenstruktur, die mit einem numerischen Index ausgestattet ist. Aufgrund der Häufigkeit der Nutzung kommen die Sprachentwickler Anwendern hier mit einigen speziellen Funktionen und einer dedizierten Syntax entgegen, die das manuelle Anlegen der Indizes unnötig macht. So kann der für die Erzeugung neuer Tabellen zuständige {}-Konstruktor bei korrekter Parametrierung direkt ein Array anlegen – ein Feature, das wir uns im interaktiven Interpreter ansehen wollen. Er lässt sich durch Eingabe von lua in einer Kommandozeile anwerfen und arbeitet die entgegengenommenen Daten nach dem Drücken von Enter ab. Abbildung 1 zeigt, wie ein numerisches Array entsteht und wie seine Werte ausgelesen werden können.

hanna_lua_1.tif_fmt1.jpgAbb. 1: Arrayindizes beginnen in Lua immer mit 1

Auch wenn rein theoretisch nichts dagegen spricht, von Hand ein „nulltes“ Element einzuschreiben, ist diese Vorgehensweise nicht ratsam. Das liegt daran, dass die meisten in Lua implementierten Bibliotheksfunktionen davon ausgehen, dass Arrays mit 1 beginnen.

Eine weitere interessante Fragestellung ist die, ob sich die Indizes "1" und 1 unterscheiden. Zur Beantwortung dient folgendes Program...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang