====== Lyx Compiler – CLI Referenz ======
Der Lyx-Compiler (''lyxc'') ist ein moderner Cross-Compiler für Linux, Windows, macOS und Embedded-Systeme. Er kombiniert Compiler, Linker und statisches Analyse-Werkzeug in einem einzigen Binary.
==== Aufruf-Syntax ====
lyxc [Optionen]
# Einfaches Beispiel
lyxc main.lyx -o main
# Mehrere Quelldateien
lyxc main.lyx utils.lyx protocol.lyx -o app
# Cross-Compilation mit vollständigem Safety-Build
lyxc main.lyx --target=arm64 --target-energy=1 --stack-check --lint -o firmware.elf
Flags können in beliebiger Reihenfolge angegeben werden. Kurzformen (''‑o'') und Langformen (''%%--%%output'') sind gleichwertig, wo beide existieren.
-----
===== 1. Eingabe & Ausgabe =====
^ Flag ^ Kurzform ^ Beschreibung ^
| ''%%--%%output='' | ''-o'' | Ausgabedatei. Standard: ''a.out'' (Linux/macOS) / ''a.exe'' (Windows) |
| ''%%--%%include='' | ''-I'' | Suchpfad für Units und Module. Mehrfach verwendbar: ''-I src -I lib'' |
| ''%%--%%std-path='' | – | Überschreibt den Pfad zur Standardbibliothek (Standard: ''/usr/lib/lyx/std/'') |
| ''%%--%%lib-path='' | ''-L'' | Suchpfad für zu linkende Bibliotheken (statisch oder dynamisch) |
| ''%%--%%link='' | ''-l'' | Bibliothek linken (z. B. ''-lm'', ''-lc'', ''-lpthread'') |
| ''%%--%%static'' | – | Erstellt eine statisch gelinkte Binärdatei (kein .so/.dll nötig) |
| ''%%--%%shared'' | – | Erstellt eine Shared Library (.so / .dll / .dylib) |
| ''%%--%%compile-unit'' | – | Kompiliert eine ''.lyx''-Datei zu einer vorkompilierten ''.lyu''-Unit |
| ''%%--%%emit-map'' | – | Erzeugt eine ''.map''-Datei mit allen Symbol-Adressen und -Größen |
==== Beispiele ====
# Normaler Build (Linux)
lyxc main.lyx -o myapp
# Mit externer C-Bibliothek linken
lyxc main.lyx -o myapp -lm -lpthread
# Shared Library erstellen
lyxc mylib.lyx --shared -o libmylib.so
# Unit vorkompilieren
lyxc --compile-unit src/utils.lyx
# → erzeugt: src/utils.lyu
-----
===== 2. Target & Architektur =====
Lyx unterstützt native Cross-Compilation ohne externe Toolchain-Konfiguration (sofern der Linker installiert ist).
==== --target= ====
^ Target-Name ^ Alias ^ Plattform ^ Format ^
| ''linux'' | ''elf'' | Linux x86_64 | ELF64 |
| ''win64'' | ''windows'' | Windows x64 | PE32+ |
| ''arm64'' | ''linux-arm64'' | Linux ARM64 (Server, Raspberry Pi, …) | ELF64 |
| ''macosx64'' | ''darwin'' | macOS x86_64 | Mach-O |
| ''macos-arm64'' | – | macOS ARM64 (Apple Silicon) | Mach-O |
| ''esp32'' | ''xtensa'' | ESP32 Microcontroller (Xtensa LX6) | ELF32 |
| ''riscv'' | ''riscv64'' | RISC-V 64-Bit (RV64GC) | ELF64 |
lyxc main.lyx --target=arm64 -o firmware.elf
lyxc main.lyx --target=win64 -o app.exe
lyxc main.lyx --target=riscv -o controller.elf
==== --arch= ====
Erzwingt eine spezifische CPU-Architektur, unabhängig vom Target:
lyxc main.lyx --target=linux --arch=arm64 -o cross.elf
Verfügbare Werte: ''x86_64'', ''arm64'', ''xtensa'', ''riscv64''
==== --sysroot= ====
Gibt das Sysroot für Cross-Compilation an (Pfad zu den Ziel-System-Bibliotheken):
lyxc main.lyx --target=arm64 --sysroot=/opt/arm64-sysroot -o app.elf
-----
===== 3. Optimierung & Energy-Awareness =====
==== --target-energy=<1–5> ====
Steuert das Energy-Aware-Backend. Beeinflusst Loop Unrolling, SIMD-Nutzung, Inlining-Aggressivität und Instruktions-Scheduling.
^ Level ^ Name ^ Loop Unrolling ^ SIMD ^ Inlining ^ Einsatz ^
| 1 | Minimal | 2× | Nein | Konservativ | IoT, Batterieknotenµ |
| 2 | Low | 4× | Nein | Moderat | Mobile Embedded |
| 3 | Standard | 4× | Optional | Ausgewogen | Server, Desktops |
| 4 | High | 8× | Ja | Aggressiv | Hochleistungs-Server |
| 5 | Extreme | 8× + SIMD | Ja (AVX2/NEON) | Maximal | DSP, HPC, ML-Inferenz |
lyxc node.lyx --target=arm64 --target-energy=1 -o sensor.elf # Batterie-optimiert
lyxc dsp.lyx --target=linux --target-energy=5 -o dsp.out # Max-Performance
==== --no-opt ====
Deaktiviert alle IR-Optimierungen (Constant Folding, Dead Code Elimination, Loop Unrolling). Nützlich für Debugging und Timing-Messungen.
lyxc main.lyx --no-opt --debug -o main_dbg
==== --no-fp-fold ====
Deaktiviert Constant Folding für Fließkomma-Operationen. Verhindert, dass der Compiler Berechnungen umordnet oder zusammenfasst (äquivalent zu globalem ''@flight_crit'' für FPU). Pflicht für DO-178C-Zertifizierung mit FPU-Nutzung.
lyxc flight.lyx --no-fp-fold --target=arm64 -o flight.elf
==== --inline-threshold= ====
Maximale Größe (in IR-Instruktionen), bis zu der Funktionen automatisch inline gesetzt werden. Standard: 20. Irrelevant bei ''@inline'' (immer) und ''@no_opt'' (nie).
-----
===== 4. Safety & Verifikation (DO-178C) =====
Diese Flags sind für die Zertifizierung sicherheitskritischer Software essenziell. Sie erzeugen Reports und schärfen die Prüfungen des Compilers.
^ Flag ^ Beschreibung ^
| ''%%--%%stack-check'' | Statische Stack-Analyse: berechnet maximalen Stack-Verbrauch entlang aller Call-Pfade; Fehler bei Überschreitung von ''@stack_limit'' |
| ''%%--%%call-graph'' | Erzeugt vollständigen Call-Graph als Bericht (Nachweis-Dokument für DO-178C) |
| ''%%--%%static-analysis'' | Aktiviert erweiterte statische Analyse: Null-Pointer, uninitalisierte Variablen, nicht-erreichbarer Code |
| ''%%--%%lint'' | Warnungen für Stil-Verstöße, ungenutzte Variablen, riskante Casts, Schleife ohne ''limit'' |
| ''%%--%%lint-only'' | Nur Lint-Analyse, keine Binärdatei erzeugen |
| ''%%--%%mcdc-instrument'' | Instrumentiert den Code für Modified Condition/Decision Coverage (Schritt 1 von 3) |
| ''%%--%%coverage-report'' | Erzeugt MC/DC-Coverage-Bericht nach Test-Ausführung (Schritt 3 von 3) |
| ''%%--%%integrity-check'' | Erzwingt ''@integrity''-Annotation; berechnet CRC32-Hash des Code-Segments, schreibt ihn dreifach in ''.meta_safe'' (TMR) |
| ''%%--%%verify-tmr'' | Prüft statisch, ob alle ''@redundant''-Variablen korrekt dreifach abgelegt sind |
| ''%%--%%wcet'' | WCET-Analyse (Worst-Case Execution Time): annotiert Schleifen und berichtet maximale Iterationszahlen |
| ''%%--%%provenance'' | Erzeugt Provenance-Log: Quellcode-Hash, Compile-Zeitstempel, Compiler-Version, alle Flags (Audit-Trail) |
| ''%%--%%symbol-sizes'' | Gibt Größe jedes Symbols (Funktionen, Variablen) aus – nützlich für Code-Größen-Nachweis |
==== MC/DC-Workflow (drei Schritte) ====
# Schritt 1: Instrumentieren
lyxc flight.lyx --mcdc-instrument -o flight_instr.elf
# Schritt 2: Tests ausführen (erzeugt flight.cov)
./flight_instr.elf --run-tests
# Schritt 3: Report erstellen
lyxc flight.lyx --coverage-report=flight.cov -o evidence/mcdc_report.txt
==== --stack-check Ausgabe ====
$ lyxc flight.lyx --stack-check --call-graph
Stack-Analyse:
ProcessSensor → Frame: 48 B, max. Tiefe: 1 → Gesamt: 48 B ✅
FilterData → Frame: 96 B, max. Tiefe: 1 → Gesamt: 96 B ✅
ParsePacket → Frame: 32 B, max. Tiefe: 8 → Gesamt: 256 B ✅ (limit: 512)
MergeSort → Frame: 64 B, max. Tiefe: 10 → Gesamt: 640 B ✅ (limit: 8192)
RecursiveCalc → Tiefe nicht beschränkbar ✗ Fehler
Fehler: RecursiveCalc besitzt kein @stack_limit und keine nachweisbare Terminierung.
==== --provenance Ausgabe ====
$ lyxc flight.lyx --provenance -o flight.elf
Provenance-Log: flight.elf.prov
Quelldatei: flight.lyx (SHA-256: a3f7c2...)
Compiler: lyxc v0.9.0
Compile-Zeit: 2026-05-22T14:30:00Z
Flags: --target=arm64 --stack-check --no-fp-fold --lint --provenance
Target: arm64 (AAPCS64, ELF64)
Energy-Level: 3 (Standard)
Units importiert: std.io, std.result, std.math (je mit SHA-256)
-----
===== 5. Analyse & Debugging =====
^ Flag ^ Beschreibung ^
| ''%%--%%emit-asm'' | Gibt den generierten Maschinencode als lesbaren Pseudo-Assembler aus (je nach Target: x86_64-AT&T, ARM64, RISC-V) |
| ''%%--%%emit-ir'' | Gibt die interne Intermediate Representation (IR) aus – vor der Backend-Optimierung |
| ''%%--%%trace-passes'' | Gibt für jeden Compiler-Pass Name, Dauer und Änderungsanzahl aus (Profiling des Compilers) |
| ''%%--%%trace-imports'' | Debuggt die Modul-Auflösung: zeigt, welche Pfade für jeden ''import'' durchsucht werden |
| ''%%--%%dump-relocs'' | Zeigt Relocation-Tabelle aller externen Symbole (PLT/GOT-Einträge) |
| ''%%--%%symbol-sizes'' | Gibt Größe jedes Symbols in Bytes aus (Code und Daten getrennt) |
| ''%%--%%debug'' | Aktiviert Debug-Informationen (DWARF) in der Ausgabedatei |
| ''%%--%%debug-level=<1-3>'' | Detailtiefe der Debug-Info: 1 = Zeilennummern, 2 = Variablen, 3 = vollständig |
| ''%%--%%emit-map'' | Erzeugt ''.map''-Datei mit Adressen aller Symbole |
==== --emit-asm Beispiel ====
$ lyxc add.lyx --emit-asm --target=linux
; fn Add(a: int64, b: int64): int64
Add:
push rbp
mov rbp, rsp
mov rax, rdi
add rax, rsi
pop rbp
ret
$ lyxc add.lyx --emit-asm --target=arm64
Add:
stp x29, x30, [sp, #-16]!
mov x29, sp
add x0, x0, x1
ldp x29, x30, [sp], #16
ret
==== --trace-passes Beispiel ====
$ lyxc main.lyx --trace-passes -o main
Pass: Parser 2.3 ms (823 Nodes)
Pass: Semantic 1.1 ms (0 Fehler, 2 Warnungen)
Pass: IR-Gen 3.4 ms (1204 IR-Instruktionen)
Pass: Constant-Fold 0.4 ms (37 Faltungen)
Pass: DCE 0.2 ms (12 Instruktionen entfernt)
Pass: Loop-Unroll 0.6 ms (8 Schleifen, Faktor 4×)
Pass: Register-Alloc 1.8 ms
Pass: Code-Emit 2.1 ms (3.2 KB Code)
Pass: Linker 0.9 ms
Gesamt: 12.8 ms → main (3.6 KB)
==== --symbol-sizes Beispiel ====
$ lyxc flight.lyx --symbol-sizes --target=arm64
Symbol-Größen:
Funktionen:
ProcessFlightData 312 B
FilterAltitude 88 B
ParsePacket 156 B
main 64 B
Globale Variablen:
g_sensor_buffer 2048 B
g_config 32 B
Gesamt Code: 620 B
Gesamt Daten: 2080 B
-----
===== 6. Linter & Verifikation =====
Der integrierte Linter läuft als Teil des Compile-Prozesses oder eigenständig.
^ Flag ^ Beschreibung ^
| ''%%--%%lint'' | Aktiviert alle Standard-Warnungen |
| ''%%--%%lint-only'' | Nur Lint, keine Binärdatei erzeugen (schneller Feedback) |
| ''%%--%%lint-strict'' | Alle Warnungen als Fehler behandeln (für CI/CD-Pipelines) |
| ''%%--%%verify-tmr'' | Prüft ob alle ''@redundant''-Variablen korrekt dreifach vorliegen |
| ''%%--%%static-analysis'' | Erweiterte statische Analyse (Null-Pointer, uninit. Vars, dead code) |
==== Lint-Kategorien ====
^ Warnung ^ Auslöser ^
| ''unused-var'' | Variable deklariert, nie gelesen |
| ''unused-import'' | ''import'' ohne Verwendung im Modul |
| ''risky-cast'' | ''as''-Konvertierung mit möglichem Datenverlust (f64→int32, int64→uint8) |
| ''unbounded-loop'' | ''while'' ohne ''limit'' in ''@dal(A/B)''-Modul |
| ''nil-deref'' | Pointer-Dereferenz ohne vorherigen nil-Check |
| ''unreachable-code'' | Code nach ''return'' oder ''break'' |
| ''missing-case'' | ''match'' über Enum ohne vollständige Abdeckung |
| ''unsafe-in-dal'' | ''unsafe''-Block in ''@dal(A/B)''-Modul |
$ lyxc main.lyx --lint-only
main.lyx:12: Warnung [unused-var] 'temp' wird nie gelesen
main.lyx:28: Warnung [risky-cast] int64 → uint8 (mögliche Truncation)
main.lyx:41: Warnung [unbounded-loop] while ohne 'limit' in @dal(B)-Modul
main.lyx:55: Fehler [unsafe-in-dal] unsafe-Block in @dal(A)-Modul nicht erlaubt
3 Warnungen, 1 Fehler
-----
===== 7. Vollständige Flag-Referenz (alphabetisch) =====
^ Flag ^ Typ ^ Beschreibung ^
| ''%%--%%arch='' | Target | CPU-Architektur erzwingen |
| ''%%--%%call-graph'' | Safety | Call-Graph-Bericht erzeugen |
| ''%%--%%compile-unit'' | Ausgabe | ''.lyx'' → ''.lyu'' vorkompilieren |
| ''%%--%%coverage-report='' | Safety | MC/DC-Coverage-Bericht aus .cov-Datei |
| ''%%--%%debug'' | Debug | DWARF-Debug-Informationen einbetten |
| ''%%--%%debug-level=<1-3>'' | Debug | Detailtiefe der Debug-Informationen |
| ''%%--%%dump-relocs'' | Debug | Relocation-Tabelle ausgeben |
| ''%%--%%emit-asm'' | Debug | Assembler-Ausgabe |
| ''%%--%%emit-ir'' | Debug | IR-Ausgabe (vor Backend) |
| ''%%--%%emit-map'' | Ausgabe | ''.map''-Symboldatei erzeugen |
| ''-I '' | Eingabe | Include-Pfad hinzufügen |
| ''%%--%%inline-threshold='' | Opt. | Auto-Inline-Grenze in IR-Instruktionen |
| ''%%--%%integrity-check'' | Safety | CRC32-Hash dreifach in .meta_safe schreiben |
| ''-L '' | Linker | Bibliotheks-Suchpfad |
| ''-l '' | Linker | Bibliothek linken |
| ''%%--%%lint'' | Linter | Standard-Warnungen aktivieren |
| ''%%--%%lint-only'' | Linter | Nur Lint (kein Build) |
| ''%%--%%lint-strict'' | Linter | Alle Warnungen als Fehler |
| ''%%--%%mcdc-instrument'' | Safety | MC/DC-Instrumentierung einbetten |
| ''%%--%%mcdc-report'' | Safety | MC/DC-Report erzeugen (ohne .cov) |
| ''%%--%%no-fp-fold'' | Safety | Float Constant Folding deaktivieren |
| ''%%--%%no-opt'' | Opt. | Alle IR-Optimierungen deaktivieren |
| ''-o '' | Ausgabe | Ausgabedatei benennen |
| ''%%--%%provenance'' | Safety | Provenance-Log (Audit-Trail) erzeugen |
| ''%%--%%shared'' | Ausgabe | Shared Library erstellen |
| ''%%--%%stack-check'' | Safety | Statische Stack-Limit-Prüfung |
| ''%%--%%static'' | Linker | Statisch linken |
| ''%%--%%static-analysis'' | Linter | Erweiterte statische Analyse |
| ''%%--%%std-path='' | Eingabe | Standardbibliothek-Pfad überschreiben |
| ''%%--%%symbol-sizes'' | Debug | Symbolgröße ausgeben |
| ''%%--%%sysroot='' | Target | Sysroot für Cross-Compilation |
| ''%%--%%target='' | Target | Zielplattform (→ Tabelle Abschnitt 2) |
| ''%%--%%target-energy=<1-5>'' | Opt. | Energy-Level des Backends |
| ''%%--%%trace-imports'' | Debug | Modul-Auflösung protokollieren |
| ''%%--%%trace-passes'' | Debug | Compiler-Passes mit Zeitangabe |
| ''%%--%%verify-tmr'' | Safety | TMR-Korrektheit prüfen |
| ''%%--%%wcet'' | Safety | WCET-Analyse und Schleifen-Report |
-----
===== 8. Beispiel-Aufrufe =====
==== A) Schneller Entwicklungs-Build ====
lyxc main.lyx -o main
./main
==== B) Debug-Build mit Stack-Trace ====
lyxc main.lyx --debug --debug-level=2 --no-opt -o main_dbg
./main_dbg
# Bei Absturz: vollständiger Stack-Trace mit Zeilennummern
==== C) Lint-Check für CI/CD ====
lyxc main.lyx --lint-only --lint-strict
# Exit-Code 0 = sauber, 1 = Warnungen/Fehler → Pipeline schlägt fehl
==== D) Cross-Compilation: ARM64 (Raspberry Pi / Server) ====
lyxc main.lyx \
--target=arm64 \
--target-energy=3 \
-o app.elf
# Auf dem Zielgerät ausführen:
scp app.elf pi@raspberrypi:~/
ssh pi@raspberrypi ./app.elf
==== E) IoT-Build: ESP32 (Batterie-optimiert) ====
lyxc sensor.lyx \
--target=esp32 \
--target-energy=1 \
--static \
--stack-check \
-o sensor.elf
==== F) Luftfahrt-Zertifizierung (DAL A) ====
lyxc flight_control.lyx \
--target=arm64 \
--no-fp-fold \
--stack-check \
--call-graph \
--static-analysis \
--lint --lint-strict \
--mcdc-instrument \
--integrity-check \
--provenance \
--symbol-sizes \
--emit-map \
-o evidence/fcc.elf
# MC/DC-Nachweis (nach Test-Durchlauf):
./evidence/fcc.elf --run-tests
lyxc flight_control.lyx --coverage-report=fcc.cov -o evidence/mcdc_report.txt
==== G) Energieprofil vergleichen ====
# Level 1: Batterie-optimiert
lyxc dsp.lyx --target-energy=1 --symbol-sizes -o dsp_low.elf
# Level 5: Maximum-Performance
lyxc dsp.lyx --target-energy=5 --symbol-sizes -o dsp_high.elf
# Größenvergleich
ls -lh dsp_low.elf dsp_high.elf
# dsp_low.elf: 8.2 KB (wenig Unrolling, kein SIMD)
# dsp_high.elf: 24.1 KB (8× Unrolling, AVX2-Instruktionen)
==== H) Compiler-Performance analysieren ====
lyxc main.lyx --trace-passes --emit-ir --emit-asm -o main 2>build.log
grep "Pass:" build.log | sort -k3 -n # Langsamste Passes zuerst
==== I) Provenance-Log für Audit ====
lyxc main.lyx \
--provenance \
--call-graph \
--target=arm64 \
-o release/main.elf
cat release/main.elf.prov # Vollständiger Audit-Trail
**Weiterführende Seiten:**
* [[lyx_-_programmiersprache:lyx-compiler-selbst-kompilieren|Compiler selbst kompilieren – make-Targets, FPC, Cross-Compilation]]
* [[lyx_-_programmiersprache:aerospace-safety|Aerospace & Safety – @flight_crit, DO-178C]]
* [[lyx_-_programmiersprache:aerospace-tutorial|Aerospace Tutorial – vollständiger Zertifizierungs-Workflow]]
* [[lyx_-_programmiersprache:das-energy-aware-programmiermodell|Energy-Aware Programmiermodell – --target-energy im Detail]]
* [[lyx_-_programmiersprache:memory-management|Memory Management – --stack-check und @stack_limit]]
* [[lyx_-_programmiersprache:do-178c|DO-178C Compliance – MC/DC, Call-Graph, Provenance]]