Skip to content
Manuel Zarat edited this page Dec 18, 2025 · 25 revisions

Work in progress

Scriptstack ist eine virtuelle Laufzeitumgebung bestehend aus einem Lexer, einem Parser und einem Interpreter.

  • Multithreading - Funktionen können paravirtualisiert im Hintergrund laufen während der Hauptthread weiterarbeitet.
  • Concurrency - Mehrere Instanzen können mit einem gemeinsamen Semaphor an den selben Daten arbeiten (Variable Locking).
  • Debugging - Instruktionen können einzeln ausgeführt, Breakpoints frei gesetzt und das Laufzeitverhalten präzise analysiert werden.

ScriptStack verwendet keinen klassischen AST, der Parser emittiert eine lineare Liste von Instruktionen. Ist eine Funktion mit dem Namen "main" vorhanden wird die Adresse der ersten Instruktion dieser Funktion als Einstiegspunkt definiert. Man kann auch jede andere Funktion als Einstiegspunkt wählen muss diese dann aber explizit aufrufen. "main" wird automatisch aufgerufen.

alt

Für jede Funktion wird ein eigener FunctionFrame erstellt in dem lokale Variablen gehalten werden. Während der Evaluation werden temporäre Variablen in Form von "[FunctionFrame:Index]" Slots alloziert. Beim Verlassen eines FunctionFrames werden diese Slots wieder freigegeben.

Es gibt 3 Arten von Speicher

  • Lokale Variablen - Variablen die innerhalb von Funktionen deklariert werden sind auch nur innerhalb dieser Funktion erreichbar. Zugriff auf lokale Variablen via Interpreter.LocalMemory.
  • Script Variablen - Variablen die am Beginn eines Script (außerhalb von Funktionen) deklariert werden sind von jeder Funktion im Script aus erreichbar. Zugriff auf Script Variablen via Script.ScriptMemory.
  • Globale Variablen - Script Variablen die mit dem Keyword shared statt var deklariert werden sind "global" und von allen laufenden Scripten aus erreichbar. Zugriff auf globale Variablen via Manager.GlobalMemory.

Datentypen

Typ Format / Basis Signifikanz (ca.) Wertebereich (ca.)
Char Unicode (UTF-16 Code Unit) 0 bis 65 535
Int 32-bit, signed -2 147 483 648 bis 2 147 483 647
Single IEEE-754 binär32 ~7 Dezimalstellen 1.4e-45 bis 3.4e38
Double IEEE-754 binär64 ~15–16 Stellen 5e-324 bis 1.8e308
Decimal Dezimal (128-bit, 96 Mantisse + Skala) ~28–29 Stellen ±7.9e28 (bis 28 Nachkommastellen)
String UTF-16 Text (variabel)

Syntax

Variablen

Variablen werden i.d.R mit dem keyword var deklariert. Außerhalb von Funktionen kann Variablen kein Wert zugewiesen werden! Globale Variablen werden mit shared und nur außerhalb von Funktionen deklariert.

var scriptVariable;
shared globalVariable;

var other = 1; // Globalen und Script-Variablen darf außerhalb von Funktionen kein Wert zugewiesen werden

function main() {

    var localVariable = 1;

    globalVariable = scriptVariable * 2;

    var a = 1; // Integer
    a = 1.1; // Decimal (128 Bit) => default
    a = 1.1f; // Float (32 Bit)
    a = 1.1d; // Double (64 Bit)

    a = 'a'; // 97 (1 Char)

    a = "Hello ScriptStack!"; // String

    var arr = [1, 2, 3]; // Array
    var elem;
    foreach(elem in arr) {
        print(elem);
    }

    var obj = { "name: "Manuel", "alter": 42 }; // Objekt
    var key, val;
    foreach(key, val in obj) {
        print("key=" + key + " val=" + val);
    }

}

Bedingungen

function main() {

    var a = 1;

    switch(a) {
        case 0: print("nothing");
        case 1: print("something");
    }

    a = 0;

    if(a == 0) {
        print("no a");
    }

    while(a < 10) {
        a++;
    }

}

Operatoren

Arithmetic

Operator Operation Beispiel
+ Addition var a = b + 1;
var a += 1;
a++;
++a
- Subtraktion var a = b - 1;
var a -= 1;
a--;
--a;
* Multiplikation var a = b * 1;
var a *= 1;
/ Division var a = b / 1;
var a /= b;
= Assignment var a = 1;
+= Plus Assignment var a += 1;
-= Minus Assignment var a -= 1;
*= Multiplication Assignment var a *= 1;
/= Division Assignment var a /= 1;
++ Increment Pre-Increment: ++a;
Post-Increment: a++;
-- Decrement Pre-Decrement: --a;
Post Decrement: a--;

Relation

Operator Operation Beispiel
== Comparision if(a == 1) { ... };
!= Negation if(a != 1) { ... };
< Lower if(a < 1) { ... };
!< Not lower if(a !< 1) { ... };
<= Lower or equal if(a <= 1) { ... };
> Greater if(a > 1) { ... };
!> Not greater if(a !> 1) { ... };
>= Greater or equal if(a >= 1) { ... };

Logic

Operator Operation Beispiel
&& Logical AND if(a && b) { ... }
|| Logical OR if(a || b) { ... }

Binary

Operator Operation Beispiel
& BITWISE AND var x = 1010b;
x &= 10b;
10
| BITWISE OR var x = 1010b;
x |= 10b;
1010
^ BITWISE XOR var x = 1010b;
x ^= 10b;
1000
~ BITWISE NOT var x = 1010b;
x = ~x;
11111111111111111111111111111101
<< SHIFT LEFT var x = 1010b;
x << 1;
10100
>> SHIFT RIGHT var x = 1010b;
x >> 1;
101

Clone this wiki locally