Der Lyx-Compiler, die Werkzeuge um ihn herum und der Weg vom Quelltext zum lauffähigen Programm. Geprüfter Stand: lyxc 1.1.14A.
→ Übersicht · Erste Schritte · Sprachreferenz
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“ (→ 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-unitbraucht ein ausdrückliches-o. Ohne Ausgabedatei läuft der Aufruf durch, meldet nichts — und legt keine.lyuan. 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.
| Seite | Inhalt |
|---|---|
| Compiler-Parameter | Alle Flags aus --help mit Wirkung und Beispiel — Zielplattformen, Diagnose, DO-178C-Optionen, Unit-Kompilierung; dazu die Flags, die es nicht gibt |
| Compiler selbst kompilieren | Bootstrap aus dem Seed-Binary, Selbstkompilierung, Singularitätsprüfung |
| Projektdatei *.lpf | Quelle, Ziel, Include-Pfade, Schalter und Pakete in einer Datei statt an der Kommandozeile — seit 1.1.13A |
| lbfdump | LBF-Binaries untersuchen: Genesis-Header, TLV-Pool (Capabilities), Sektionen, Symboltabelle, IR-Disassembly |
| 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 |
| LPM — Registry-Protokoll | URL-Layout, Index-Format, Statuscodes, Integrität und die Grenzen der Prüfsumme |
| LPM — Registry betreiben | Server einrichten, vhost-Regeln, Token vergeben, Publish-Endpunkt, Pakete zurückziehen |
| 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 Projektdatei |
| KI-Integration | Geplantes JSON-Format für AST und Fehler (--ast-json, --error-json) — beide Flags sind nicht verdrahtet und brechen den Aufruf ab |
| 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 → 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 #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-reportund--stack-check— keiner dieser drei Namen existiert, alle brechen mitlyxc: unbekannter Schalterund Exit 2 ab. Vorhanden sind--mcdc,--mcdc-report,--call-graphund--static-analysis. Nachgeprüft mit 1.0.21A.
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: Compiler selbst kompilieren.
Zwei Binaries auf demselben Rechner sind der häufigste Messfehler. Ein installiertes/usr/local/bin/lyxcund das frisch gebaute./lyxcim Repository können weit auseinanderliegen. Wer Doku-Beispiele oder Fehlerberichte prüft, ruft den Compiler mit vollem Pfad auf und vergleicht vorherlyxc --version.
| 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.