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

57
PLAN.md
View File

@@ -212,21 +212,38 @@ gefundene Frontend-Lücken sind Bugs im Sinne des Guiding Principle und
werden sofort geschlossen (kein Wiedereröffnen der Phase nötig).
## Phase 2 — Bytecode und VM (`tb-vm`)
- [ ] Eingangsaufgabe (aus Phase 0 übernommen): Bytecode-**Feindesign** —
**Status: abgeschlossen (2026-09-02).** OpenSpec-Änderung
`phase-2-bytecode-vm` (Proposal/Design/Specs/Tasks). Zusätzliche
Entscheidung: Die Sema liefert ein **typisiertes HIR** (Namen → Slots,
Konvertierungen explizit) als Codegen-Eingabe; der Codegenerator ist ein
reiner Tree-Walk.
- [x] Eingangsaufgabe (aus Phase 0 übernommen): Bytecode-**Feindesign** —
Opcode-Satz, Zahlenkonvertierungs-Matrix (implizite Casts, Rundung,
Überlauf), `STOP`/`CONT`-Verhalten im Runner ohne IDE
(offene Punkte in docs/tbvm-design.md abarbeiten)
- [ ] Bytecode-Format und Serialisierung (`.tbc`)
- [ ] Codegenerator AST → Bytecode
- [ ] Interpreter: Ausdrücke, Kontrollfluss (`IF`, `SELECT CASE`, Schleifen,
`GOTO`/`GOSUB`), Prozeduraufrufe, `BYREF`-Semantik
- [ ] Fehlerbehandlung: `ON ERROR GOTO/RESUME`, `ERR`/`ERL`, Fehlerkaskaden
- [ ] Unterbrechbarkeit: Tick-Grenzen, Breakpoints, Einzelschritt,
Variableninspektion (Grundlage für IDE-Debugger)
- [ ] Benchmarks in `benches/`: Compile-Budget messen (Projekt ≈50k Zeilen
< 1 s, einzelnes Modul < 50 ms) und VM-Durchsatz (Schleifen/Strings);
Ergebnisse in docs/tbvm-design.md festhalten
- [ ] Meilenstein: Konsolen-Testkorpus läuft mit korrekter Ausgabe (`tbc run`)
(offene Punkte in docs/tbvm-design.md abgearbeitet)
- [x] Bytecode-Format und Serialisierung (`.tbc`, Formatversion 1;
Roundtrip- und Versionsablehnungs-Tests)
- [x] Codegenerator HIR → Bytecode (monomorphe Opcodes, Fixup-Listen)
- [x] Interpreter: Ausdrücke, Kontrollfluss (`IF`, `SELECT CASE`, Schleifen,
`GOTO`/`GOSUB`), Prozeduraufrufe, `BYREF`-Semantik (inkl.
Klammer-BYVAL, STATIC, Rekursion, DEF FN, DATA/READ/RESTORE)
- [x] Fehlerbehandlung: `ON [LOCAL] ERROR GOTO/RESUME`, `ERR`/`ERL`,
Fehler im Handler fatal (keine Kaskaden), Propagation über Frames
- [x] Unterbrechbarkeit: Tick-Grenzen, Breakpoints, Einzelschritt,
Variableninspektion (Grundlage für IDE-Debugger); `STOP` ist in
der Einbettung fortsetzbar (CONT-Grundlage)
- [x] Benchmarks in `benches/`: Compile-Budget gemessen (49 760 Zeilen in
124 ms; Einzelmodul 1,2 ms — Budgets eingehalten) und VM-Durchsatz
(≈5 Mio Schleifeniterationen/s); Ergebnisse in docs/tbvm-design.md
- [x] Meilenstein: Konsolen-Testkorpus läuft mit korrekter Ausgabe
(`tbc run` + Harness `crates/tb-cli/tests/compat.rs`; Korpus um
konvertierung/fehlerbehandlung/byref erweitert)
Vorgezogen aus Phase 3 (Meilenstein-Voraussetzung): `Host`-Trait
(Konsole/Capture), Builtin-Dispatch-Tabelle, PRINT-Formatierung mit
Druckzonen sowie die Korpus-Stringfunktionen (`tb-runtime`).
## Phase 3 — Laufzeitbibliothek (`tb-runtime`) und Bildschirm (`tb-ui::screen`)
@@ -261,6 +278,20 @@ Leitplanke Vollständigkeit); die Aufzählungen unten sind Beispiele.
`CSRLIN`/`POS`, `WIDTH`, `VIEW PRINT` auf dem Zellenpuffer
- [ ] Offene Detailfrage klären: Umfang der `KEY n`-Funktionstasten-Makros
(`KEY LIST`/`ON`/`OFF`) und in docs/sprachreferenz.md festhalten
- [ ] Aus Phase 2 verlagert — `ON ERROR GOTO`-Scoping des Vorbilds im
Frontend abbilden: Handler-Label auf Modulebene ist auch aus
Prozeduren heraus ansprechbar (derzeit wird nicht-lokales
`ON ERROR` in einer Prozedur wie `ON LOCAL ERROR` behandelt,
siehe sema.rs, lower_stmt/OnError)
- [ ] Aus Phase 2 verlagert — DATA-Rohtext erhalten: unquotierte
DATA-Elemente verlieren derzeit die Groß-/Kleinschreibung, weil
der Lexer Bezeichner normalisiert; Rohtext-Erfassung im Lexer,
Korpustest ergänzen
- [ ] Aus Phase 2 verlagert — `TODO verify`-Zellen der
Konvertierungsmatrix (docs/tbvm-design.md) gegen die
Original-Hilfe auflösen: CURRENCY-Promotion mit Gleitkomma,
`^`-Ergebnistyp, Exponentialform-Schwellen der Textdarstellung,
CURRENCY-Ausgabeformat; zugehörige Korpustests nachschärfen
- [ ] Meilenstein: klassische Konsolenprogramme laufen unverändert
## Phase 4 — Forms-Engine (`tb-ui::forms`)