Files
TerminalBasic/openspec/changes/phase-2-bytecode-vm/specs/konsolen-basisbibliothek/spec.md
Chili Palmer f7e57b0bd8 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>
2026-09-02 11:28:07 +02:00

3.0 KiB

Purpose

Die Konsolen-Basisbibliothek ist die in Phase 2 vorgezogene Scheibe der Laufzeitbibliothek: die Builtin-Aufrufschnittstelle der VM, ein Host-Abstraktion für Konsolen-E/A sowie PRINT-Formatierung und die vom Testkorpus benötigten Stringfunktionen.

ADDED Requirements

Requirement: Builtin-Aufrufschnittstelle

Die VM SHALL Bibliotheksfunktionen und -anweisungen über eine indizierte Dispatch-Tabelle aufrufen (Argumente auf dem Operandenstack, Index im Opcode); die Tabelle lebt in der Laufzeitbibliothek und ist ohne Änderung am Opcode-Satz erweiterbar (Phase 3 füllt sie auf).

Scenario: Builtin über Tabelle

  • WHEN PRINT LEN("abc") ausgeführt wird
  • THEN wird LEN über seinen Tabellenindex aufgerufen und liefert 3

Requirement: Host-Abstraktion für Konsolen-E/A

Alle Konsolenwirkungen der VM SHALL über eine austauschbare Host-Schnittstelle laufen (Textausgabe, zeilenweises Lesen für INPUT, Abbruchprüfung). Host-Aufrufe dürfen blockieren; die Abbruchprüfung (Strg+Untbr) obliegt dem Host. tbc run verwendet einen Konsolen-Host (stdout/stdin); Tests MUST einen Capture-Host verwenden können, der die Ausgabe byte-genau aufzeichnet.

Scenario: Capture-Host im Test

  • WHEN ein Korpusprogramm im Test-Harness läuft
  • THEN entsteht die komplette Ausgabe im Capture-Host und ist byte-genau vergleichbar

Requirement: PRINT-Formatierung

PRINT SHALL Zahlen im Format des Vorbilds ausgeben: führendes Leerzeichen für nicht-negative bzw. - für negative Werte, nachgestelltes Leerzeichen (auch am Zeilenende); Zahlendarstellung je Typ wie beim Vorbild (u. a. kein Dezimalpunkt bei ganzzahligen Werten, signifikante Stellen je nach SINGLE/DOUBLE). ; schließt direkt an, , springt zur nächsten 14-Zeichen-Druckzone (belegt ein Element die Zone ganz, zur übernächsten); ohne abschließendes ;/, folgt ein Zeilenumbruch.

Scenario: Zahlen mit Vorzeichenspalte

  • WHEN PRINT 1; -2; 3.5 ausgeführt wird
  • THEN lautet die Ausgabe 1 -2 3.5 mit Zeilenumbruch

Scenario: Druckzonen

  • WHEN PRINT "12345678901234", "x" ausgeführt wird
  • THEN beginnt x in Spalte 29 (Zone nach der belegten übersprungen)

Requirement: Korpus-Stringfunktionen

Die Bibliothek SHALL mindestens folgende Funktionen mit der Semantik des Vorbilds bereitstellen (Zeichen = Unicode-Codepoints, dokumentierte UTF-8-Abweichung): LEN, LEFT$, RIGHT$, MID$ (Funktion), INSTR, UCASE$, LCASE$, STRING$, SPACE$, CHR$, ASC, STR$, VAL. Randfälle folgen dem Vorbild, u. a.: VAL liest das führende Zahlenpräfix und ignoriert Leerraum; STR$ stellt nicht-negativen Zahlen ein Leerzeichen voran; ASC("") löst Fehler 5 „Illegal function call" aus.

Scenario: Korpusdatei strings.bas

  • WHEN tests/compat/strings.bas ausgeführt wird
  • THEN entspricht die Ausgabe byte-genau strings.out

Scenario: VAL mit Restzeichen

  • WHEN VAL(" 12.5abc") ausgewertet wird
  • THEN ist das Ergebnis 12.5