LUA: Scripts für C/C++

Die Scriptsprache LUA beeindruckte mich schon vor vielen Jahren mit ihrer einfachen Implementierung und dem geringem Ressourcenverbrauch.

Und außerdem ist es in keiner anderen Sprache so leicht möglich Kernfunktionen wie den Dateizugriff selbst zu implementieren oder ganz wegzulassen.


Microsoft’s VBScript (und JScript) haben seit den 90ern eine COM API um sie in eigene Projekte zu integrieren. Javascript Engines wie V8 können das auch ohne COM und Python ist heute wohl der bekannteste Vertreter einer Scriptsprache, die man aus eigenen Programmen nutzen kann, oder wie man eigenen Code in diese Welt hin abbilden kann.

Doch diese Moloche haben alle ein großes Problem:
Ihre Komplexität lässt sie zu einem Adipositas Patienten werden, der jedes neue Projekt mit unzähligen Abhängigkeiten belegt, die dieses mühsam mitschleppen muss.

Und mache Anwendungsgebiete wie Mikrocontroller fallen daher sofort weg.

LUA hingegen definiert primär eine Kernsprache mit Konstrukten wie function, if-then-else, for, while, break und return, sowie das Definieren und Verändern von Variablen mit Grundrechenarten.

Jede weitere Form von “Funktionalität” kann bzw. muss über C-Funktionen in die Scriptsprache eingefügt werden.
Und so wird ein Standard-Mapping von üblichen C-Funktionen, wie print zur Ausgabe, oder lower/upper für Strings wie auch sin/cos/tan zum Rechnen, in die Sprache eingefügt.

Doch: Das kann man auch bewusst weglassen.

Und genau das macht LUA in erster Linie mal zu einer besonders sicheren Scriptsprache, denn es gibt grundsätzlich mal kein Feature, dessen Bugs man ausbeuten kann.
Wir können also die Scriptsprache nur mit den Funktionen anreichern, die wir wirklich brauchen und müssen keine Angst davor haben, dass man versehentlich unbenutzten Fremdcode ausführt.

Von daher war es auch kein Problem, LUA Scripts in meiner UEFI Umgebung auszuführen, da ich hierfür die Script-print Funktion nicht auf das handelsübliche C printf festlegte, sondern auf meine eigene Implementierung.

Und genau hier startet der große Vorteil von LUA: Man kann eigene Objekte oder Funktionen für Scripts “nutzbar” machen.
Oder anders gesagt, man kann dynamisch eine Funktion injizieren lassen, deren Aufruf auf eine native C-Funktion umgeleitet wird.

Und genau so erreichen viele Programme einen enormen Funktionalitätsgewinn:

  • Man schreibt die interne Low-Level-Logik in effizientem C oder C++ Code
  • Und dann lässt man diese High-Level-Funktion durch einfache LUA Scripts mit unterschiedlichen Parameter ausführen.
  • Am Ende erhält man ein kleines und effizientes C Programm, dessen interner Ablauf mit LUA Scripts verändert werden kann, ohne dass man neu kompilieren muss.

Fazit

LUA ist schon seit einiger Zeit im GATE Framework integriert und soll es möglich machen, die nativen (und manchmal komplexen) C Routinen durch einfache Aufrufe zu “verscripten”.

Tatsächlich ist das Mapping zwischen LUA und C Code etwas gewöhnungsbedürftig, da man alles über Stacks austauscht, doch diese Details lassen sich durch Hilfsroutinen bändigen.
Besonders der Einsatz von Templates in C++ vereinfacht diese Übersetzung enorm.

Ich bin jedenfalls ein großer LUA Fan geworden und sehe vor allem im Vergleich zur Integration von Python große Vorteile.

Ein Wermutstropfen ist leider Objektorientierung in LUA, welches (ähnlich wie in Python) sehr “hineingewurstet” aussieht. Man merkt, dass all diese Sprachen ursprünglich rein funktionsorientiert gestaltet waren und Objekte später angeheftet wurden.

However, ich bin jedenfalls gespannt welche Möglichkeiten die “Verscriptung” mir noch eröffnen wird, denn aktuell steht des ganze Thema noch am Anfang.