Files

3.4 KiB

MODIFIED Requirements

Requirement: Monomorpher Opcode-Satz

Der Codegenerator SHALL jedes HIR-Konstrukt in typisierte, monomorphe Opcodes übersetzen: Arithmetik, Vergleiche und Konvertierungen tragen den Operandentyp im Opcode (kein Tag-Dispatch über Werte zur Laufzeit); implizite Konvertierungen erscheinen als explizite Konvertierungs-Opcodes an den vom HIR bestimmten Stellen. Der Opcode-Satz SHALL in docs/tbvm-design.md vollständig dokumentiert sein.

Die Dokumentation SHALL sämtliche tatsächlich serialisierbaren Instruktionen einschließlich Forms, Ereignissteuerung und Dateioperationen mit Operanden und Encoding führen.

Scenario: Gemischter Ausdruck wird monomorph

  • WHEN d# = i% + 1.5# übersetzt wird (INTEGER-Variable, DOUBLE-Ziel)
  • THEN enthält der Bytecode einen Konvertierungs-Opcode INTEGER→DOUBLE und eine DOUBLE-Addition, keinen generischen Additions-Opcode

Scenario: Namen sind zur Laufzeit aufgelöst

  • WHEN eine Variable oder Prozedur im Bytecode referenziert wird
  • THEN geschieht das über Slot- bzw. Tabellenindizes, nicht über Namens-Lookups

Requirement: .tbc-Containerformat

Das Kompilat SHALL als .tbc-Datei serialisierbar und wieder ladbar sein: Magic TBC\0, Formatversion und dokumentierte Abschnittstabelle. Der Container SHALL Quellen und Module, Konstantenpool, TYPE-Layouts, modulqualifizierte Prozeduren mit vollständiger Signatur, Locals und Code, DATA sowie die vollständigen Forms-Anfangsbeschreibungen führen. Code und Quellortinformationen SHALL inline in den Prozeduren liegen dürfen; eigenständige CODE-/LINES-Abschnitte sind nicht erforderlich. Laden und erneutes Serialisieren MUST verlustfrei sein; eine unbekannte Formatversion MUST mit einer klaren Fehlermeldung abgewiesen werden.

Ein aus FRM- oder Projektquellen gebautes Kompilat SHALL ohne erneuten Zugriff auf diese Quellen ausführbar sein und ihre Anfangseigenschaften und Designzeit-Control-Arrays bewahren.

Scenario: Roundtrip

  • WHEN ein kompiliertes Modul als .tbc geschrieben und wieder geladen wird
  • THEN ist das geladene Kompilat funktional identisch (gleiche Ausführung, gleiche Zeilenzuordnung)

Scenario: Unbekannte Version

  • WHEN eine .tbc-Datei mit höherer Formatversion geladen wird
  • THEN wird das Laden mit einer Meldung abgelehnt, die die Version nennt

Scenario: Formularwerte nach Kompilat-Rundlauf

  • WHEN ein Formular mit Text1.Text = "hello" kompiliert, gespeichert und ohne Quelldatei geladen wird
  • THEN liefert der erste Zugriff auf Text1.Text weiterhin hello

Requirement: Zeilentabelle für Fehlerortung

Der Bytecode SHALL jede Anweisung ihrem Ursprung (Moduldatei, Zeile) zuordnen, sodass Laufzeitfehlermeldungen, ERL, Breakpoints und Einzelschritt die Quellzeile exakt benennen können.

Die Zuordnung SHALL auch nach Include-Expansion und bei mehreren Projektmitgliedern die ursprüngliche Datei und physische Zeile bewahren. Numerische BASIC-Zeilenlabels für ERL SHALL davon getrennt bleiben.

Scenario: Fehler nennt Zeile

  • WHEN in Zeile 42 eines Programms ein Laufzeitfehler ohne Handler auftritt
  • THEN nennt die Fehlermeldung Zeile 42

Scenario: Fehler aus Projektbibliothek

  • WHEN lib.bas in physischer Zeile 2 einen Fehler auslöst und über app.mak aufgerufen wird
  • THEN nennt die Meldung lib.bas und Zeile 2 statt einer verketteten Projektzeile