LUA: Scripts für C/C++
« | 03 Apr 2022 | »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.