Phase 2 abgeschlossen: Bytecode, TBVM, Runtime-Scheibe, tbc run

- Sema zum Lowering-Pass umgebaut: typisiertes HIR (Slots, explizite
  Konvertierungsknoten) als Codegen-Eingabe; BYREF verlangt exakten Typ
- Bytecode-Feindesign umgesetzt: monomorpher Opcode-Satz,
  .tbc-Container (Formatversion 1) mit eigenem Writer/Reader
- Codegenerator HIR -> Bytecode (Fixup-Listen, keine globalen Passes)
- TBVM-Interpreter: Kontrollfluss, GOSUB-Stack je Frame, BYREF/BYVAL,
  STATIC, DEF FN, DATA/READ/RESTORE, ON [LOCAL] ERROR/RESUME/ERR/ERL,
  Breakpoints/Einzelschritt/Inspektion, STOP fortsetzbar
- Runtime-Scheibe: Host-Trait (Konsole/Capture), Builtin-Tabelle,
  Konvertierungsmatrix, PRINT-Formatierung/Druckzonen, Stringfunktionen
- tbc run/build/check mit Exit-Codes nach Entscheidung D6
- Korpus-Harness (byte-genauer Vergleich) + 3 neue Korpusdateien
  (konvertierung, fehlerbehandlung, byref); 137 Tests gruen
- Benchmarks: Einzelmodul 1,2 ms / Projekt 49.760 Zeilen 124 ms
  (Budgets eingehalten), VM ~5 Mio Schleifeniterationen/s
- Doku fortgeschrieben (tbvm-design, sprachreferenz, PLAN);
  verlagerte Punkte als explizite Aufgaben in Phase 3
- OpenSpec-Change phase-2-bytecode-vm (27/27 Tasks)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 11:28:07 +02:00
parent da23d52036
commit f7e57b0bd8
42 changed files with 9225 additions and 484 deletions

View File

@@ -0,0 +1,121 @@
# Tasks — Phase 2: Bytecode und VM
## 1. Feindesign-Dokumentation (Eingangsaufgabe aus Phase 0)
- [x] 1.1 Zahlenkonvertierungs-Matrix (implizite Casts, Banker's Rounding,
Überlauf, `/` vs. `\`/`MOD`, logische Operatoren, CURRENCY, `^`-Regel,
SINGLE/DOUBLE-Textdarstellung) als Tabelle in docs/tbvm-design.md
schreiben; jede Zelle mit Fundstelle in der Original-Hilfe belegen,
unklare Zellen als `TODO verify` markieren — verifizierbar: Abschnitt
existiert, keine Zelle ohne Beleg oder TODO-Marke
- [x] 1.2 Opcode-Satz vollständig in docs/tbvm-design.md ausformulieren
(Gruppen, Encoding, Operanden) und `STOP`/`CONT`-Runner-Entscheidung
sowie Fehlerbehandlungs-Scoping (design.md D4D6) dort festhalten —
verifizierbar: „Offene Punkte"-Abschnitt in tbvm-design.md ist leer
## 2. Frontend: Typisiertes HIR
- [x] 2.1 HIR-Datenmodell in `tb-frontend` definieren (Slots, typisierte
Ausdrücke, explizite Konvertierungsknoten, Prozedur-/Modulstruktur,
Quellzeilen-Anker) — verifizierbar: `cargo check` und Doku-Kommentare
je Knotentyp
- [x] 2.2 Sema zum Lowering-Pass umbauen: `analyze_source` liefert
zusätzlich HIR; Konstantenfaltung, `DEFtype`, implizite
Konvertierungen materialisieren — verifizierbar: alle 33 bestehenden
Frontend-Tests bleiben grün
- [x] 2.3 HIR-Tests: diagnose-freie Korpusmodule liefern vollständiges HIR;
Konvertierungsknoten-Szenario (`d# = i% + 1.5`) als Unit-Test —
verifizierbar: neue Tests in `crates/tb-frontend/tests` grün
## 3. Bytecode und Serialisierung
- [x] 3.1 Opcode-Definitionen und Modulstruktur (Konstantenpool, Typtabelle,
modul-qualifizierte Prozedurtabelle, DATA-Segment, Zeilentabelle) in
`tb-vm::bytecode` implementieren — verifizierbar: Unit-Tests für
Encoding/Decoding einzelner Opcodes
- [x] 3.2 `.tbc`-Writer/Reader (Magic, Formatversion, Abschnittstabelle)
implementieren — verifizierbar: Roundtrip-Test (schreiben → laden →
identisch) und Ablehnungstest für unbekannte Formatversion
## 4. Codegenerator
- [x] 4.1 Ausdrucks-Codegen (Literale, Slots, Arithmetik, Vergleiche,
logische Operatoren, Konvertierungsknoten, String-Konkatenation) —
verifizierbar: Unit-Tests HIR-Ausdruck → erwartete Opcode-Folge
- [x] 4.2 Kontrollfluss-Codegen (`IF`, `SELECT CASE`, `FOR`, `DO`, `WHILE`,
`GOTO`/`GOSUB`/`ON GOTO`, `EXIT`, Labels/Zeilennummern) mit
Fixup-Listen für Vorwärtsziele — verifizierbar: Unit-Tests je
Konstrukt
- [x] 4.3 Prozedur-Codegen (SUB/FUNCTION/`DEF FN`, BYREF-/BYVAL-Argumente,
`STATIC`, Frames/Locals), `DIM`/Arrays/UDTs, `DATA`-Segment und
Zeilentabelle emittieren — verifizierbar: Unit-Tests und
`cargo test -p tb-vm` grün
## 5. Interpreter (TBVM)
- [x] 5.1 VM-Grundgerüst: Werte-Modell, Operandenstack, Frames,
`step()`-Schleife mit Tick-Flag-Wort an Anweisungsgrenzen —
verifizierbar: Ausdrucks-Programme laufen in Unit-Tests
- [x] 5.2 Kontrollfluss und `GOSUB`-Stack pro Frame inkl. Fehler 3
(„RETURN without GOSUB") — verifizierbar: kontrollfluss.bas läuft im
Capture-Host mit korrekter Ausgabe
- [x] 5.3 Prozeduraufrufe (BYREF-Rückwirkung, Klammer-BYVAL, `STATIC`,
Rekursion, `DEF FN` im Modulkontext) — verifizierbar: Unit-Tests der
Spec-Szenarien aus vm-ausfuehrung
- [x] 5.4 `DATA`/`READ`/`RESTORE` inkl. Fehler 4 und 13 — verifizierbar:
Unit-Tests der Spec-Szenarien
- [x] 5.5 Fehlerbehandlung: Handler-Zustand (modul-global + Frame-lokal),
Unwinding, `RESUME`-Varianten, `ERR`/`ERL`, `ERROR n`, Fehler im
Handler fatal — verifizierbar: alle Szenarien aus vm-fehlerbehandlung
als Tests grün
- [x] 5.6 Unterbrechbarkeit: Breakpoints auf (Modul, Zeile), Einzelschritt,
Variableninspektion im Halt, Abbruchwunsch — verifizierbar:
Unit-Tests treiben die VM per `step()` und prüfen Halt/Inspektion
- [x] 5.7 Programmende: `END`/`SYSTEM`/Programmende vs. `STOP` mit Meldung
und Exit-Code-Unterscheidung — verifizierbar: Runner-Test prüft
Exit-Codes und Meldung
## 6. Konsolen-Basisbibliothek (`tb-runtime`-Scheibe)
- [x] 6.1 `Host`-Trait definieren; Konsolen-Host und Capture-Host
implementieren — verifizierbar: Unit-Test zeichnet Ausgabe byte-genau
auf
- [x] 6.2 Builtin-Dispatch-Tabelle + `CALL_BUILTIN`-ABI (Argumente auf dem
Stack) in VM und Runtime verdrahten — verifizierbar: `LEN`-Aufruf
läuft über die Tabelle (Spec-Szenario)
- [x] 6.3 PRINT-Formatierung: Zahlendarstellung je Typ, Vorzeichenspalte,
nachgestelltes Leerzeichen, `;`/`,`-Semantik, 14-Zeichen-Druckzonen —
verifizierbar: printzahlen.bas und printzonen.bas byte-genau korrekt
- [x] 6.4 Korpus-Stringfunktionen (`LEN`, `LEFT$`, `RIGHT$`, `MID$`,
`INSTR`, `UCASE$`, `LCASE$`, `STRING$`, `SPACE$`, `CHR$`, `ASC`,
`STR$`, `VAL`) mit Randfällen des Vorbilds — verifizierbar:
strings.bas byte-genau korrekt plus Randfall-Unit-Tests
(`VAL`-Präfixlesen, `STR$`-Leerzeichen, `ASC("")` → Fehler 5)
## 7. CLI und Test-Harness
- [x] 7.1 `tbc run <datei.bas>`: kompilieren, `.tbc` in Memory ausführen,
Konsolen-Host; Diagnosen bei Compile-Fehler, Exit-Codes nach D6 —
verifizierbar: `tbc run tests/compat/hello.bas` druckt `Hallo, Welt!`
- [x] 7.2 Harness in `tests/`: alle `tests/compat/*.bas` kompilieren, im
Capture-Host ausführen, byte-genau gegen `.out` vergleichen; bei
Abweichung Datei/Zeile/Soll/Ist nennen — verifizierbar: `cargo test`
führt den kompletten Korpus aus
- [x] 7.3 Korpus erweitern: Konvertierungsmatrix-Programm, Fehlerbehandlung
(`ON ERROR`/`RESUME`/`ERR`/`ERL`), BYREF/BYVAL-Programm mit
dokumentierter Sollausgabe (Belege bzw. `TODO verify`-Konvention) —
verifizierbar: neue `.bas`/`.out`-Paare laufen im Harness grün
## 8. Benchmarks und Abschluss
- [x] 8.1 Compile-Budget-Harness früh aufsetzen: Generator für
~50k-Zeilen-Projekt + Criterion-Bench; Budgetvergleich (< 1 s Projekt,
< 50 ms Modul) — verifizierbar: `cargo bench` weist die Zeiten aus
- [x] 8.2 VM-Durchsatz-Benches (Schleifen, Strings); Ergebnisse und
Benchmark-Stand in docs/tbvm-design.md „Performance" festhalten —
verifizierbar: Abschnitt enthält Messwerte mit Datum
- [x] 8.3 Meilenstein-Verifikation und Doku-Abschluss: kompletter Korpus
grün via `cargo test`, docs/sprachreferenz.md um Phase-2-Festlegungen
ergänzt (Rundung, `STOP`-Verhalten), PLAN.md-Phase-2-Haken gesetzt —
verifizierbar: alle Checkboxen der Phase in PLAN.md abgehakt,
Testsuite grün