xq's Digitalwerkstatt

LoLa (Programmiersprache)

function Fibonacci(num)
{
    var a = 1;
    var b = 0;
    var temp;

    while (num >= 0)
    {
         temp = a;
         a = a + b;
         b = temp;
         num = num - 1;
    }

    return b;
}

Print(Fibonacci(4));

Die Logic Language ist eine kleine, dynamisch typisierte Programmiersprache, welche für den Einsatz in Computerspielen gedacht ist. Inspiriert wurde sie durch Sprak aus else Heart.Break().

LoLa wurde in C# mit Hilfe von GPPG entwickelt und besteht aus mehreren Komponenten:

Parser

Der Parser übersetzt ein LoLa-Script in einen Syntaxbaum. Hierbei werden ausschließlich Syntaxprüfungen durchgeführt, eine semantische Kontrolle wird nicht gemacht.

Objekte

Objekte sind die Grundkomponente in LoLa. Jedes Objekt besitzt seinen eigenen Progammzustand sowie sein eigenes Set an Funktionen und Variablen.

Im Gegensatz zu klassischen OOP-Programmiersprachen besitzt LoLa keine Klassen oder Vererbung. Objekte besitzen immer eine “Tap”-Funktion, welche den Code ausführt, der nicht in einer Funktion ist. Im folgenden Falle wäre dies das Print(name):

var name;
function SetName(n)
{
    name = n;
}
Print(name);

Aus diesem Script wird nun mit Hilfe des Parsers ein Objekt erzeugt, welches sowohl seine “Tap”-Funktion als auch die Funktion SetName besitzt.

Beide Funktionen können nun von der Ausführungsschicht aktiviert werden. Die “Tap”-Funktion dient hierbei als eine Art “wiederkehrende” Main-Funktion.

Interkommunikation

LoLa wurde speziell mit dem Gedanken der Script-Kommunikation geschaffen. Das heißt, einzelne LoLa-Scripte können über ihre Objekte miteinander kommunizieren.

Ein Beispiel:

var obj = GetNamePrinter();
obj.SetName("Fred");

Hier wird über die Funktion GetNamePrinter eine Objektreferenz auf unser oben erzeugtes Objekt erzeugt. Auf dieser Objektreferenz rufen wir nun die Funktion SetName auf, welche die Variable name in unserem Objekt verändert. Wenn bei diesem Objekt nun wieder die “Tap”-Funktion aufgerufen wird, gibt das Objekt den Namen Fred aus.

Hiermit kann sehr einfach Spiellogik oder auch Rätsel-Logik über mehrere Scripte verteilt werden. Da keine Einschränkung in der Kommunikation zwischen verschiedenen Objekten besteht, können hier auch Objektreferenzen weitergegeben werden.

Zwischensprache

LoLa-Scripte werden bei der Instanzierung (Konvertierung vom Syntaxbaum zum Objekt) in eine “Zwischensprache” übersetzt. Das heißt konkret, dass aus den Syntax-Elementen einfache Instruktionen werden, die dann von einer Ausführungsschicht kontrolliert werden. Hierbei handelt es sich um gewöhnliche C#-Objekte, welche jeweils in einem speziellen Scope arbeiten. Die Zwischensprache ist nicht dafür ausgelegt, in irgendeiner Weise effizient ausgeführt werden zu können.

Die Zwischensprache erlaubt es, LoLa quantisiert ausführen zu können und somit zeitliche Beschränkungen oder Nebenläufigkeiten einfach zu implementieren.

Erweiterbarkeit

Damit LoLa in Spielen bequem eingesetzt werden kann, gibt es die Möglichkeit, beliebige externe C#-Funktionen in LoLa einzubinden. Hierbei gibt es zwei Kategorien:

Einfache Funktionen

Einfache Funktionen werden quasi wie eine einzelne Instruction in der Zwischensprache behandelt und kehren sofort aus nach dem Aufruf zurück in die Ausführungsschicht.

Langlaufende Funktionen

Diese Funktionen müssen vom Programmierer als Ableitung der Function-Klasse angelegt werden und sind eigentlich eine State Machine.

Diese Funktionen werden ebenfalls von der Ausführungsschicht so lange aufgerufen, bis sie ihren Zustand als Fertig markieren. Dies erlaubt es, in den Scripten Funktionen zu implementieren wie WalkTo(target), welche die Spielfigur bis zu ihrem Ziel laufen lässt und erst dann zurückkehrt.

Quellcode

Der Quellcode für LoLa kann auf GitHub heruntergeladen werden und in eigenen Projekten verwendet:

https://github.com/MasterQ32/LoLa

Der Code wurde mit Unity im Hinterkopf entwickelt und müsste dazu kompatibel sein.

Die Dokumentation ist leider (wie üblich) sehr spärlich, wird aber gerne nachgereicht, falls jemand meint: “Hey, das ist cool, das will ich verwenden!”