Lyx — Sprachreferenz

Vollständige Referenz der Sprache: Lexik und Syntax, Typsystem, Kontrollfluss, Modulaufbau, Speichermodell, Nebenläufigkeit und die systemnahen Ebenen bis hinunter zum ABI. 26 Seiten in fünf Themenfeldern.

Übersicht · Erste Schritte · Standard Library · Guides


Lyx in zehn Sätzen

  • Statisch und explizit typisiert. Keine impliziten Konvertierungen — jede Umwandlung steht als as im Code.
  • == vergleicht, := weist zu. Ein einzelnes = setzt den Vorgabewert eines Parameters; in jeder anderen Stellung wird es abgewiesen (#1575 behoben).
  • Kein Zeigertyp. Adressen sind int64, gelesen und geschrieben wird mit peek8/16/32/64 und poke8/16/32/64. ^ ist ausschließlich XOR.
  • Eine Datei = eine Unit = ein Namensraum, flach: es gibt keinen qualifizierten Zugriff, Kollisionen werden beim Import gemeldet.
  • Ganzzahlen tragen ihre Breite im Namenint8int64 und uint8uint64, jeweils mit einer Kurzform (i8i64, u8u64). Ein blankes int existiert nicht.
  • Klassen liegen auf dem Heap, Structs auf dem Stack; freigegeben wird ausdrücklich mit dispose, es gibt keinen Garbage Collector.
  • Keine Closures. Anonyme Funktionen fangen keinen Kontext ein; Zustand wird als Parameter übergeben.
  • Fehler laufen über Rückgabewerte (Result-/Option-Typen, Fehlercodes) — try/catch existiert, panic ist bewusst nicht abfangbar.
  • Safety ist Teil der Sprache: Range-Typen, limit(N) an Schleifen, @dal-Stufen und @stack_limit sind Sprachmittel, keine Bibliothek.
  • Zero-Privilege-Modell: @capabilities beschreibt, was ein Programm darf, und erzeugt daraus einen seccomp-Filter.

Die verbindliche Grammatik steht in ebnf.md im Compiler-Repository. Weicht eine Seite hier davon ab, gilt die Grammatik — und die Abweichung gehört gemeldet.


Grundlagen

Der Einstieg, in dieser Reihenfolge lesbar.

Seite Inhalt
Syntax Programmaufbau, Kommentare, Bezeichner, Literale, vollständige Operatortabelle mit Präzedenz, Speicherklassen var/let/co/con
Variablen Deklaration, die vier Speicherklassen in der Praxis, Startwerte, Typableitung, Gültigkeitsbereich und Verdecken, Variablen auf Modulebene, Lebensdauer
Datentypen Alle Integer-Typen samt Kurzformen, f32/f64, bool, char, pchar, Arrays, Map, Range-Typen, Implementierungsstatus
Funktionen fn, Parameter mit Vorgabewerten, benannte Argumente, Tupel-Rückgabe, Funktionstypen, anonyme Funktionen, Pipe-Operator |>
Bedingungen if/else if/else, if als Ausdruck, Vergleichs- und Logikoperatoren, fehlender Short-Circuit, MC/DC
Schleifen while, for … to/downto, repeat … until, limit(N) als Terminierungsnachweis, break/continue
Arrays & Maps Feste Arrays [N]T und zwei Dimensionen, dynamische array<T>, Map<K,V> mit ganzzahligen Schlüsseln, Bereichsprüfung
Enums Enum-Deklaration, explizite Werte, Zugriff mit ::, Bit-Flags, Zusammenspiel mit match

Typsystem

Seite Inhalt
Typaliase & Typumwandlung type-Aliase, Range-Typen mit Compile- und Laufzeitprüfung, as-Umwandlungstabelle, is-Typtest
Generics & Interfaces Generische Funktionen (Monomorphisierung), interface + implements; kein trait/impl, keine generischen Typen
Pattern Matching match mit Wert-, Bereichs- und Alternativmustern, when-Wächter, Erschöpfungsprüfung, Destrukturierung
Rekursion Endrekursion und automatische TCO, Stack-Tiefe nachweisen, @stack_limit, ARM64-Prolog-Falle

Module & Struktur

Seite Inhalt
Module & Importe unit/import/pub, Suchreihenfolge, vorkompilierte .lyu-Units, Symbolkollisionen und wie man sie vermeidet
OOP struct vs. class, Methoden, Konstruktor und Destroy, Vererbung mit extends, virtual/override, interface
Fehlerbehandlung Result- und Option-Typen aus std.result, try/catch/finally, defer, panic (nicht abfangbar)
Exit-Codes Rückgabewert von main, exit(), reservierte Bereiche, eigene Codes entwerfen, Signaltod eines Kindprozesses

Speicher & Nebenläufigkeit

Seite Inhalt
Memory Management Stack vs. Heap, new/dispose, alloc/free vs. malloc/free_mem, Lebensdauer, DO-178C-Regeln
Rohspeicher Adressen als int64, peek/poke, Struct-Layout von Hand über Offsets, Ausrichtung
Handles & FD Kernel-Deskriptor vs. Userspace-Handle, wem die Freigabe gehört, typische Leck-Muster
Fehlerkonventionen der Stdlib Wann <0, wann ==0, zweistufige Prüfung (PostgreSQL), Fehlercodes nachschlagen
Threads & Nebenläufigkeit ThreadCreate/ThreadJoin, Mutex, Atomics, TLS, Speichermodell und Barrieren

Systemnahe Ebenen

Seite Inhalt
Low-Level: Speicherzugriff & Pragmas Systemprogrammierung ohne Zeigertypen: MMIO, Registerzugriff, was es an Pragmas wirklich gibt
Attributes & Pragmas Die tatsächlich vorhandenen Attribute — @flight_crit, @dal, @stack_limit, @wcet, @redundant, @big_endian, @export
FFI extern fn mit pflichtiger link-Klausel, Typabbildung nach C, Grenzen (zwei pchar-Parameter), Sicherheitsregeln
Capabilities (LCBS) @capabilities auf Modulebene, grant/restrict am Import, erzeugter seccomp-Filter, was durchgesetzt wird und was nicht
ABI & Calling Conventions System V AMD64 und AAPCS64, Parameter- und Rückgaberegister, Stack-Layout, Aufrufkonvention für fn-Zeiger

Lesepfade

Ziel Reihenfolge
Sprache lernen Erste Schritte → Syntax → Variablen → Datentypen → Funktionen → Bedingungen → Schleifen → Arrays
Größeres Programm strukturieren Module & Importe → OOP → Fehlerbehandlung → Exit-Codes
Systemnah arbeiten Rohspeicher → Handles & FD → Low-Level → FFI → ABI
Sicherheitskritisch entwickeln Datentypen (Range-Typen) → Schleifen (limit) → Rekursion (@stack_limit) → Attributes & Pragmas → DO-178C
Programm eindämmen Capabilities → FFI → Netzwerk-Guide
 
Warnkästen auf diesen Seiten sind Messwerte, keine Vermutungen. Jeder beschreibt Verhalten, das gegen eine benannte Compiler-Fassung geprüft wurde, und nennt in der Regel die Issue-Nummer. Steht dort „seit lyxc 1.0.17C„, ist der Punkt behoben; steht dort ein Defekt ohne Versionsangabe, gilt er zum genannten Prüfstand noch.

Letzte Aktualisierung: 2026-08-12 — neue Seite „Variablen“ aufgenommen; Einordnung „Lyx in zehn Sätzen„, Lesepfade und Abschnittsgliederung ergänzt; sämtliche Kurzbeschreibungen gegen den Seiteninhalt und lyxc 1.0.17E berichtigt (unter anderem float64f32/f64, pub/privpub, „Trait-Bounds“ → interface/implements, „Inline-Zeiger„ → zeigerfreier Speicherzugriff, Map-Iteration entfernt).