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:
57
PLAN.md
57
PLAN.md
@@ -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`)
|
||||
|
||||
Reference in New Issue
Block a user