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.

Übersicht · Erste Schritte · 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“ (→ 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
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

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 appCross-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-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: 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.