====== Lyx – Low-Level: Pointer & Inlining ====== Obwohl Lyx durch Funktionen wie [[Lyx – Memory Management|Null-Safety]] und [[DO-178C Compliance|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' } * **Vorteil**: Deutlich schneller bei kleinen, oft aufgerufenen Funktionen. * **Nachteil**: Vergrößert die Binärdatei (Code Bloat), was den Instruction-Cache belasten kann. ==== 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 [[lyx_-_programmiersprache:das-energy-aware-programmiermodell|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 |