Skip to content

history_2026_06_07

Blacky Cat edited this page Jun 7, 2026 · 1 revision

ChangeLog – Pascal -> ANTLR -> AsmJit Compiler

Datum: 2026-06-07


Mehrdimensionale Arrays

Grammar erweitert

Array-Typen

Vorher:

array[0..9] of Integer

Neu:

array[0..9, 0..9] of Integer

Grammar:

arrayType
    : ARRAY LBRACK arrayRange (COMMA arrayRange)* RBRACK OF typeName
    ;

arrayRange
    : expr DOTDOT expr
    ;

Array-Zugriffe

Vorher:

LBRACK expr RBRACK

Neu:

LBRACK expr (COMMA expr)* RBRACK

Unterstützt nun:

m[0,0]
m[i,j]
m[x,y,z]

Array-Metadaten

Vorher:

{
    "min": 0,
    "max": 9
}

Neu:

{
    "dimensions": [
        {"min":0,"max":9},
        {"min":0,"max":9}
    ]
}

Mehrdimensionale Offset-Berechnung

Neue Funktion:

emit_multi_array_index_offset()

Berechnet:

linear_index =
((i - min1) * dim2 + (j - min2))

Beispiel:

array[0..9,0..9]
m[2,3]

ergibt:

2 * 10 + 3 = 23

Bounds Check pro Dimension

Neue Funktion:

emit_array_bounds_check_dimension()

Prüft jede Dimension einzeln:

i >= min
i <= max

j >= min
j <= max

Laden/Speichern mehrdimensionaler Arrays

Überarbeitet:

emit_load_array_element()
emit_store_array_element()

Verwenden nun:

emit_multi_array_index_offset()

Bugfix

Beschädigte Integer-Werte

Fehler:

m[0,0] := 10;

ergab:

0
1
10
23

Ursache:

EBX wurde gleichzeitig
als Integer-Speicher
und als Array-Index verwendet.

Lösung:

Temporäre Sicherung über:

JitContext.print_int_tmp

Erfolgreicher Test

m[0,0] := 10;
m[0,1] := 20;
m[1,0] := 30;
m[2,3] := 99;

Ausgabe:

10
20
30
99

Pointer auf Array-Elemente

Adressoperator erweitert

Neu unterstützt:

p := @a[0];

sowie:

p := @m[2,3];

Neue Funktion

emit_address_of_array_element()

Berechnet:

array_base
+ linear_index * element_size

Erfolgreicher Test

a[0] := 10;

p := @a[0];

p^ := 123;

WriteLn(a[0]);
WriteLn(p^);

Ausgabe:

123
123

Dynamische Speicherverwaltung

Runtime-Funktionen

Neu:

jit_new_memory()
jit_dispose_memory()

Basierend auf:

malloc()
free()

Pascal-Unterstützung

Neu:

New(p);
Dispose(p);

Neue Compiler-Funktionen

emit_builtin_new()
emit_builtin_dispose()

Automatische Initialisierung

Neu allokierter Speicher:

memset(ptr, 0, size)

Erfolgreicher Test

New(p);

p^ := 123;

WriteLn(p^);

Dispose(p);

Ausgabe:

123

Rekursive Records

Vorwärtsreferenzen

Neu unterstützt:

type
    PNode = ^TNode;

    TNode = record
        Value : Integer;
        Next  : PNode;
    end;

Pointer-Typauflösung verbessert

Überarbeitet:

resolve_type()

unterstützt nun:

^TNode
^PNode
^TRecord

auch bei späteren Deklarationen.


Pointer-Größe vereinheitlicht

Neu:

type_size("^Anything") = 8

für x64.


Pointer-Felder in Records

Speicherung von Pointer-Werten

Neu unterstützt:

n1^.Next := n2;

Bugfix

Fehler:

Pointer-Wert wurde überschrieben,
bevor das Zielfeld geladen wurde.

Ursache:

emit_load_var()
zerstörte RAX.

Lösung:

push rax
...
pop r11
mov [field], r11

NIL-Unterstützung

Neu:

n^.Next := 0;

wird interpretiert als:

n^.Next := nil;

Verkettete Listen

Mehrfache Pointer-Dereferenzierung

Vorher:

p^.Value

Neu:

p^.Next^.Value

Pointer-Pfadauflösung erweitert

Unterstützt nun beliebige Ketten:

n1^.Next^.Next^.Next^.Value

Erfolgreicher Test

New(n1);
New(n2);

n1^.Value := 10;
n2^.Value := 20;

n1^.Next := n2;
n2^.Next := 0;

WriteLn(n1^.Value);
WriteLn(n1^.Next^.Value);

Dispose(n2);
Dispose(n1);

Ausgabe:

10
20

Aktueller Stand

Datentypen

Unterstützt:

Integer
Double
String

Enum
Record
Array
Pointer

Type Alias

Arrays

Unterstützt:

1D Arrays
Mehrdimensionale Arrays

Record Arrays
Initialisierte Arrays

Bounds Check

Pointer

Unterstützt:

Pointer auf Variablen

Pointer auf Records
Pointer auf Array-Elemente

Pointer-Dereferenzierung

Mehrfache Pointer-Ketten

New()
Dispose()

Records

Unterstützt:

Normale Records

Verschachtelte Records

Pointer auf Records

Rekursive Records

Verkettete Listen

Nächste sinnvolle Schritte

Hochpriorität

Array von Arrays

type
    TIntArray = array[0..9] of Integer;

    TMatrix = array[0..9] of TIntArray;

Dynamische Arrays

SetLength(a, 100);

NIL-Konstante

Derzeit:

p := 0;

später:

p := nil;

Rekursive Listen-Algorithmen

Push()
Pop()
Insert()
Delete()
Find()

Klassen

type
    TPerson = class
    end;

Empfehlung für die nächste Sitzung

Reihenfolge:

1. Array von Arrays
2. NIL-Konstante
3. Dynamische Arrays / SetLength
4. Listen-Algorithmen
5. Klassen (class)
6. Methoden
7. Konstruktoren

Clone this wiki locally