-
Notifications
You must be signed in to change notification settings - Fork 0
Home
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.
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
sharedstattvardeklariert werden sind "global" und von allen laufenden Scripten aus erreichbar. Zugriff auf globale Variablen viaManager.GlobalMemory.
| 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) |
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);
}
}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++;
}
}| 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--; |
| 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) { ... }; |
| Operator | Operation | Beispiel |
|---|---|---|
| && | Logical AND | if(a && b) { ... } |
| || | Logical OR | if(a || b) { ... } |
| 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 |
