====== Lyx — Tools & Compiler ======
Der Lyx-Compiler, die Werkzeuge um ihn herum und der Weg vom Quelltext zum lauffähigen Programm. Geprüfter Stand: **lyxc 1.1.14A**.
→ [[lyx_-_programmiersprache:start|Übersicht]] · [[lyx_-_programmiersprache:erste-schritte|Erste Schritte]] · [[lyx_-_programmiersprache:sprache|Sprachreferenz]]
----
===== Was lyxc ist =====
''lyxc'' ist **Compiler und Linker in einem**. Es gibt keine Objektdateien, keinen separaten Linker-Aufruf und keine Linker-Flags: aus einer ''.lyx''-Datei entsteht in einem Schritt eine fertige, **statisch gelinkte ELF-Datei**. C-Bibliotheken werden nicht über die Kommandozeile eingebunden, sondern im Quelltext mit ''extern fn … link "libfoo.so"'' (→ [[lyx_-_programmiersprache:sprache:ffi|FFI]]).
lyxc main.lyx -o mein_programm # der Normalfall
lyxc main.lyx -I ./libs -o mein_programm
lyxc main.lyx --target=arm64 -o app_arm
lyxc --compile-unit src/utils.lyx -o src/utils.lyu # vorkompilierte Unit
> **''%%--%%compile-unit'' braucht ein ausdrückliches ''-o''.** Ohne Ausgabedatei läuft der Aufruf durch, meldet nichts — und legt **keine** ''.lyu'' an. Die Endung wird nicht automatisch aus dem Eingabenamen abgeleitet. Nachgeprüft mit 1.0.21A.
Der Compiler gibt bei jedem Lauf einen **Sicherheits-Audit** auf stderr aus: aktives Capability-Modell, W^X, RELRO, Stack-Canaries, seccomp und Landlock. Wer nur die Fehler sehen will, filtert die Ausgabe — Meldungen erscheinen als ''sema error'', ''Parse error at line N'' oder ''codegen error''.
----
===== Seiten =====
^ Seite ^ Inhalt ^
| [[lyx_-_programmiersprache:tools:compiler-parameter|Compiler-Parameter]] | Alle Flags aus ''%%--%%help'' mit Wirkung und Beispiel — Zielplattformen, Diagnose, DO-178C-Optionen, Unit-Kompilierung; dazu die Flags, die es **nicht** gibt |
| [[lyx_-_programmiersprache:tools:lyx-compiler-selbst-kompilieren|Compiler selbst kompilieren]] | Bootstrap aus dem Seed-Binary, Selbstkompilierung, Singularitätsprüfung |
| [[lyx_-_programmiersprache:tools:projektdatei|Projektdatei *.lpf]] | Quelle, Ziel, Include-Pfade, Schalter und Pakete in einer Datei statt an der Kommandozeile — seit 1.1.13A |
| [[lyx_-_programmiersprache:tools:lbfdump|lbfdump]] | LBF-Binaries untersuchen: Genesis-Header, TLV-Pool (Capabilities), Sektionen, Symboltabelle, IR-Disassembly |
| [[lyx_-_programmiersprache:tools:lpm|LPM — Package Manager]] | Vollständiges Handbuch: ''lyx.toml'' und ''lyx.lock'', Abhängigkeiten auflösen, reproduzierbare ''.lxpkg'' bauen, anmelden, veröffentlichen, Fehlermeldungen — und was noch nicht geht |
| [[lyx_-_programmiersprache:tools:lpm:registry-protokoll|LPM — Registry-Protokoll]] | URL-Layout, Index-Format, Statuscodes, Integrität und die Grenzen der Prüfsumme |
| [[lyx_-_programmiersprache:tools:lpm:registry-betreiben|LPM — Registry betreiben]] | Server einrichten, vhost-Regeln, Token vergeben, Publish-Endpunkt, Pakete zurückziehen |
| [[lyx_-_programmiersprache:tools:lpm:compiler-integration|LPM — Compiler-Integration]] | ''lpm resolve'' als Schnittstelle für ''lyxc'' — Aufrufvertrag; **seit 1.1.13A ruft der Compiler ''lpm'' selbst**, über den Abschnitt ''[pakete]'' einer [[lyx_-_programmiersprache:tools:projektdatei|Projektdatei]] |
| [[lyx_-_programmiersprache:tools:ki-integration|KI-Integration]] | Geplantes JSON-Format für AST und Fehler (''%%--%%ast-json'', ''%%--%%error-json'') — **beide Flags sind nicht verdrahtet** und brechen den Aufruf ab |
----
===== Die häufigsten Aufrufe =====
^ Ziel ^ Aufruf ^
| Übersetzen und ausführen | ''lyxc main.lyx -o app && ./app'' |
| Eigene Units mitgeben | ''lyxc main.lyx -I ./src -o app'' |
| Für eine andere Plattform | ''%%lyxc main.lyx --target=arm64 --arch=arm64 -o app%%'' → [[lyx_-_programmiersprache:guides:crosscompiling|Cross-Compilation]] |
| Bereichsprüfungen einschalten | ''%%lyxc main.lyx --runtime-checks -o app%%'' — ohne den Schalter liest ein Zugriff außerhalb der Grenzen kommentarlos fremden Speicher |
| Nur prüfen, nicht bauen | ''%%lyxc main.lyx --lint-only%%'' |
| Aufrufgraph und Stack-Tiefe | ''%%lyxc main.lyx --call-graph --static-analysis%%'' |
| MC/DC-Struktur (DO-178C) | ''%%lyxc main.lyx --mcdc-report -o /dev/null%%'' — Entscheidungen und Bedingungen; die **Überdeckungsmessung** fehlt weiterhin |
| Unit vorkompilieren | ''%%lyxc --compile-unit src/utils.lyx -o src/utils.lyu%%'' (das ''-o'' ist Pflicht) |
**''%%--%%compile-unit'' läuft seit [[https://github.com/SEOLizer/LyX-Compiler/issues/1587|#1587]] bis in den Codegen.** Vorher endete der Lauf nach der Semantikprüfung: eine grüne Vorkompilierung belegte nicht, dass die Unit übersetzbar ist. Jetzt wird der Codegen mitgeführt (sein Erzeugnis wird verworfen, gebraucht wird die Diagnose) — und zwar **vor** dem Schreiben, damit bei einem Fehler gar keine ''.lyu'' entsteht, die nach Erfolg aussieht:
$ lyxc --compile-unit kaputt.lyx -o kaputt.lyu
codegen error: globale Variable 'g': Startwert ist zur Uebersetzungszeit nicht bekannt
$ ls kaputt.lyu
ls: kaputt.lyu: Datei nicht gefunden
| Shared Library statt Programm | ''%%lyxc lib.lyx --shared -o libmein.so%%'' |
| C-Header einlesen | ''%%lyxc --include /usr/include/foo.h%%'' → gibt ''extern fn''-Deklarationen aus |
> **Der Schalter heißt ''%%--%%mcdc'', nicht ''%%--%%mcdc-instrument''.** Ältere Fassungen der Doku nannten einen Dreischritt aus ''%%--%%mcdc-instrument'', ''%%--%%coverage-report'' und ''%%--%%stack-check'' — keiner dieser drei Namen existiert, alle brechen mit ''lyxc: unbekannter Schalter'' und Exit 2 ab. Vorhanden sind ''%%--%%mcdc'', ''%%--%%mcdc-report'', ''%%--%%call-graph'' und ''%%--%%static-analysis''. Nachgeprüft mit 1.0.21A.
----
===== Den Compiler selbst bauen =====
Der Compiler ist in Lyx geschrieben und übersetzt sich selbst. Im Compiler-Repository:
make build # Seed-Binary (src/lyxc_bootstrap) übersetzt die Quelle → ./lyxc
make bootstrap # ./lyxc übersetzt sich selbst → neues ./lyxc
make singularity # Nachweis: Seed→Quelle und deren Ergebnis→Quelle sind bitgleich
make test # Testsuite
**Bei einem frischen Stand immer mit ''make build'' beginnen.** ''make bootstrap'' setzt ein bereits passendes ''./lyxc'' voraus — ist das vorhandene Binary älter als die Quelle, scheitert die Selbstkompilierung mit Meldungen aus der eigenen Standardbibliothek. Details: [[lyx_-_programmiersprache:tools:lyx-compiler-selbst-kompilieren|Compiler selbst kompilieren]].
> **Zwei Binaries auf demselben Rechner sind der häufigste Messfehler.** Ein installiertes ''/usr/local/bin/lyxc'' und das frisch gebaute ''./lyxc'' im Repository können weit auseinanderliegen. Wer Doku-Beispiele oder Fehlerberichte prüft, ruft den Compiler mit **vollem Pfad** auf und vergleicht vorher ''lyxc %%--%%version''.
----
===== Werkzeuge im Überblick =====
^ Werkzeug ^ Aufruf ^ Wofür ^
| ''lyxc'' | ''lyxc datei.lyx -o app'' | Übersetzen, linken, prüfen |
| ''lbfdump'' | ''lbfdump -x datei.lbf'' | LBF-Binaries zerlegen: Header, Capabilities, Sektionen, Disassembly |
| ''lpm'' | ''lpm install'' | Abhängigkeiten aus ''lyx.toml'' auflösen; ''lpm resolve'' liefert einen Pfad auf stdout, mit ''%%--%%entry'' die Unit-Datei |
''lbfdump'' liest zwei Formate: **LYX!** (natives Binary — Genesis-Header, Capability-TLVs) und **LBF\0** (IR-Bytecode — Symboltabelle, Disassembly). Für das Disassembly nativer Dateien wird Capstone benötigt, die Opcode-Tabellen (''lbf_opcodes.tsv'', ''lbf_builtins.tsv'') erwartet es im aktuellen Verzeichnis.
----
Letzte Aktualisierung: 2026-08-16 — Stand auf lyxc 1.0.21A gezogen, Einordnung „Was lyxc ist" (Compiler+Linker, keine Linker-Flags), Tabelle der häufigsten Aufrufe, Abschnitt zum Selbstbau mit den Makefile-Zielen und Werkzeug-Übersicht ergänzt. Sämtliche genannten Flags gegen ''%%--%%help'' und einen Testlauf geprüft; ''%%--%%ast-json'' und ''%%--%%error-json'' sind weiterhin nicht verdrahtet. Die ''lpm''-Zeile nennt jetzt den tatsächlichen Vertrag von ''lpm resolve'' — ein Pfad auf stdout, kein ''-I''.