Inhaltsverzeichnis

Lyx – Low-Level: Pointer & Inlining

Obwohl Lyx durch Funktionen wie Null-Safety und Range-Checks schützt, benötigt die Systemprogrammierung (Treiber, Kernel, Echtzeit-Regler) direkten Zugriff auf Speicheradressen und präzise Kontrolle über den generierten Maschinencode.

1. Pointer (Zeiger)

Pointer speichern die physikalische oder virtuelle Speicheradresse eines Objekts. In Lyx wird zwischen sicheren Referenzen und rohen Pointern unterschieden.

Deklaration und Nutzung

var x: int64 := 42;
var p: ^int64 := ^x; // Pointer auf x (Address-of)
 
PrintInt(p^); // Dereferenzierung (Zugriff auf den Wert an Adresse p)

Memory Mapped I/O (MMIO)

Für die Kommunikation mit Hardware (z.B. auf dem ESP32 oder RISC-V) wird oft das Attribut @volatile verwendet, um zu verhindern, dass der Compiler Zugriffe wegoptimiert.

@volatile
var GPIO_BASE: ^uint32 := 0x3FF44000 as ^uint32;
 
fn toggle_led() {
    GPIO_BASE^ := GPIO_BASE^ ^ 0x1; // Bit-Flip am Hardware-Register
}

2. Funktions-Inlining (@inline)

Inlining ist eine Optimierung, bei der der Compiler den Funktionsaufruf durch den tatsächlichen Code der Funktion ersetzt. Dies eliminiert den Overhead des Funktionsaufrufs (Register-Saving, Stack-Frame-Setup).

Das @inline Attribut

@inline
fn fast_add(a: int, b: int): int {
    return a + b;
}
 
fn main() {
    var sum := fast_add(5, 10); // Der Maschinencode enthält hier direkt ein 'add'
}

Kontrolle via CLI

Das Inlining kann global über den Compiler gesteuert werden, wird aber durch das Attribut @inline pro Funktion erzwungen. Das Backend entscheidet bei Standardfunktionen selbstständig basierend auf dem Energy-Level, ob Inlining sinnvoll ist.

3. Unsafe-Blöcke

Für Operationen, die die Typsicherheit umgehen (z.B. Pointer-Arithmetik oder Casts zwischen inkompatiblen Typen), bietet Lyx den unsafe-Bereich.

unsafe {
    var raw_ptr: ^uint8 := get_buffer_address();
    var offset_ptr := raw_ptr + 16; // Pointer-Arithmetik ist nur in unsafe erlaubt
}
 
Sicherheits-Warnung:
In Modulen mit @dal(A) oder @flight_crit erzeugt die Verwendung von unsafe oder rohen Pointern eine Compiler-Warnung oder einen Fehler, sofern keine explizite Ausnahme definiert wurde.

4. Zusammenfassung: Wann was nutzen?

Feature Einsatzgebiet Risiko
Pointer (^T) Treiber, Hardware-Register, Low-Level Buffer Null-Pointer, Memory Corruption
@volatile Hardware-Register, Shared Memory (Multicore) Keine (verhindert Fehloptimierung)
@inline Mathematische Hilfsfunktionen, Getter/Setter Code-Größe steigt
unsafe Pointer-Arithmetik, FFI zu C-Bibliotheken Umgeht alle Sicherheitsgarantien